প্লে ফিচার ডেলিভারির ওভারভিউ

গুগল প্লে-এর অ্যাপ পরিবেশন মডেলটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল ব্যবহার করে প্রতিটি ব্যবহারকারীর ডিভাইসের কনফিগারেশনের জন্য অপ্টিমাইজ করা APK তৈরি ও পরিবেশন করে, ফলে ব্যবহারকারীরা আপনার অ্যাপটি চালানোর জন্য শুধুমাত্র প্রয়োজনীয় কোড এবং রিসোর্সই ডাউনলোড করে।

প্লে ফিচার ডেলিভারি অ্যাপ বান্ডেলের উন্নত সক্ষমতা ব্যবহার করে, যার মাধ্যমে আপনার অ্যাপের নির্দিষ্ট কিছু ফিচার শর্তসাপেক্ষে ডেলিভার করা যায় অথবা চাহিদা অনুযায়ী ডাউনলোড করা যায়। এটি করার জন্য, প্রথমে আপনাকে এই ফিচারগুলোকে আপনার মূল অ্যাপ থেকে আলাদা করে ফিচার মডিউলে বিভক্ত করতে হবে।

ফিচার মডিউল বিল্ড কনফিগারেশন

আপনি যখন অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে একটি নতুন ফিচার মডিউল তৈরি করেন, তখন IDE মডিউলটির build.gradle ফাইলে নিম্নলিখিত গ্রেডল প্লাগইনটি প্রয়োগ করে।

// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.

plugins {
  id 'com.android.dynamic-feature'
}

স্ট্যান্ডার্ড অ্যাপ্লিকেশন প্লাগইনের জন্য উপলব্ধ অনেক প্রপার্টি আপনার ফিচার মডিউলের জন্যও উপলব্ধ। নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে যে আপনার ফিচার মডিউলের বিল্ড কনফিগারেশনে কোন প্রপার্টিগুলি অন্তর্ভুক্ত করা উচিত এবং কোনগুলি উচিত নয়।

ফিচার মডিউল বিল্ড কনফিগারেশনে কী অন্তর্ভুক্ত করা উচিত নয়

যেহেতু প্রতিটি ফিচার মডিউল বেস মডিউলের উপর নির্ভরশীল, তাই এটি কিছু নির্দিষ্ট কনফিগারেশনও উত্তরাধিকার সূত্রে পায়। সুতরাং, ফিচার মডিউলের build.gradle ফাইল থেকে নিম্নলিখিত অংশটি বাদ দেওয়া উচিত:

  • স্বাক্ষর কনফিগারেশন: অ্যাপ বান্ডেলগুলো বেস মডিউলে আপনার নির্দিষ্ট করা স্বাক্ষর কনফিগারেশন ব্যবহার করে স্বাক্ষরিত হয়।
  • minifyEnabled প্রপার্টি: আপনি শুধুমাত্র বেস মডিউলের বিল্ড কনফিগারেশন থেকেই আপনার সম্পূর্ণ অ্যাপ প্রজেক্টের জন্য কোড সঙ্কুচিতকরণ (code shrinking) সক্রিয় করতে পারেন। তাই, ফিচার মডিউলগুলো থেকে এই প্রপার্টিটি বাদ দেওয়া উচিত। তবে, আপনি প্রতিটি ফিচার মডিউলের জন্য অতিরিক্ত ProGuard নিয়ম নির্দিষ্ট করে দিতে পারেন।
  • versionCode এবং versionName : আপনার অ্যাপ বান্ডেল তৈরি করার সময়, Gradle বেস মডিউল দ্বারা প্রদত্ত অ্যাপ ভার্সনের তথ্য ব্যবহার করে। আপনার ফিচার মডিউলের build.gradle ফাইল থেকে এই প্রপার্টিগুলো বাদ দেওয়া উচিত।

বেস মডিউলের সাথে একটি সম্পর্ক স্থাপন করুন

অ্যান্ড্রয়েড স্টুডিও যখন আপনার ফিচার মডিউল তৈরি করে, তখন এটি বেস মডিউলের build.gradle ফাইলে android.dynamicFeatures প্রপার্টি যোগ করার মাধ্যমে সেটিকে বেস মডিউলের কাছে দৃশ্যমান করে তোলে, যেমনটি নিচে দেখানো হয়েছে:

// In the base module’s build.gradle file.
android {
    ...
    // Specifies feature modules that have a dependency on
    // this base module.
    dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}

এছাড়াও, অ্যান্ড্রয়েড স্টুডিও বেস মডিউলটিকে ফিচার মডিউলের একটি ডিপেন্ডেন্সি হিসেবে অন্তর্ভুক্ত করে, যেমনটি নিচে দেখানো হয়েছে:

// In the feature module’s build.gradle file:
...
dependencies {
    ...
    // Declares a dependency on the base module, ':app'.
    implementation project(':app')
}

অতিরিক্ত ProGuard নিয়মগুলি নির্দিষ্ট করুন।

যদিও আপনার অ্যাপ প্রজেক্টের জন্য শুধুমাত্র বেস মডিউলের বিল্ড কনফিগারেশনই কোড শ্রিংকিং সক্ষম করতে পারে, আপনি নিচে দেখানো অনুযায়ী proguardFiles প্রপার্টি ব্যবহার করে প্রতিটি ফিচার মডিউলের সাথে কাস্টম ProGuard নিয়ম সরবরাহ করতে পারেন।

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

উল্লেখ্য যে, এই ProGuard নিয়মগুলি বিল্ড করার সময় অন্যান্য মডিউলের (বেস মডিউল সহ) নিয়মগুলির সাথে একত্রিত হয়ে যায়। তাই, যদিও প্রতিটি ফিচার মডিউল নতুন এক সেট নিয়ম নির্দিষ্ট করতে পারে, সেই নিয়মগুলি অ্যাপ প্রজেক্টের সমস্ত মডিউলের ক্ষেত্রেই প্রযোজ্য হয়।

আপনার অ্যাপটি স্থাপন করুন

ফিচার মডিউল সমর্থন সহ আপনার অ্যাপ তৈরি করার সময়, আপনি মেনু বার থেকে রান > রান নির্বাচন করে (অথবা রান- এ ক্লিক করে) স্বাভাবিকের মতোই একটি সংযুক্ত ডিভাইসে আপনার অ্যাপটি স্থাপন করতে পারেন। টুলবারে)।

আপনার অ্যাপ প্রজেক্টে যদি এক বা একাধিক ফিচার মডিউল থাকে, তাহলে অ্যাপটি ডেপ্লয় করার সময় কোন ফিচারগুলো অন্তর্ভুক্ত করবেন তা নিম্নোক্তভাবে আপনার বিদ্যমান রান/ডিবাগ কনফিগারেশন পরিবর্তন করে বেছে নিতে পারেন:

  1. মেনু বার থেকে রান > কনফিগারেশন সম্পাদনা নির্বাচন করুন।
  2. রান/ডিবাগ কনফিগারেশন ডায়ালগের বাম প্যানেল থেকে আপনার পছন্দসই অ্যান্ড্রয়েড অ্যাপ কনফিগারেশনটি নির্বাচন করুন।
  3. জেনারেল ট্যাবের ‘ডাইনামিক ফিচারস টু ডিপ্লয়’ অংশের অধীনে, আপনার অ্যাপ ডিপ্লয় করার সময় অন্তর্ভুক্ত করতে চান এমন প্রতিটি ফিচার মডিউলের পাশের বক্সে টিক চিহ্ন দিন।
  4. OK ক্লিক করুন।

ডিফল্টরূপে, অ্যান্ড্রয়েড স্টুডিও আপনার অ্যাপ ডেপ্লয় করার জন্য অ্যাপ বান্ডেল ব্যবহার করে না। এর পরিবর্তে, IDE আপনার ডিভাইসে APK বিল্ড এবং ইনস্টল করে, যা APK-এর আকারের চেয়ে ডেপ্লয়মেন্টের গতির জন্য অপ্টিমাইজ করা থাকে। অ্যান্ড্রয়েড স্টুডিওকে অ্যাপ বান্ডেল থেকে APK এবং ইনস্ট্যান্ট এক্সপেরিয়েন্স বিল্ড ও ডেপ্লয় করার জন্য কনফিগার করতে, আপনার রান/ডিবাগ কনফিগারেশন পরিবর্তন করুন

কাস্টম ডেলিভারির জন্য ফিচার মডিউল ব্যবহার করুন

ফিচার মডিউলের একটি অনন্য সুবিধা হলো, অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১) বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলোতে আপনার অ্যাপের বিভিন্ন ফিচার কখন এবং কীভাবে ডাউনলোড হবে, তা কাস্টমাইজ করার ক্ষমতা। উদাহরণস্বরূপ, আপনার অ্যাপের প্রাথমিক ডাউনলোডের আকার কমাতে, আপনি নির্দিষ্ট কিছু ফিচারকে প্রয়োজন অনুযায়ী ডাউনলোড করার জন্য অথবা শুধুমাত্র নির্দিষ্ট সক্ষমতা সমর্থনকারী ডিভাইসগুলোতে ডাউনলোড করার জন্য কনফিগার করতে পারেন; যেমন—ছবি তোলার ক্ষমতা বা অগমেন্টেড রিয়েলিটি ফিচারের সমর্থন।

যদিও আপনি আপনার অ্যাপটিকে একটি অ্যাপ বান্ডেল হিসেবে আপলোড করলে ডিফল্টভাবেই অত্যন্ত অপ্টিমাইজ করা ডাউনলোড পেয়ে থাকেন, তবে আরও উন্নত এবং কাস্টমাইজযোগ্য ফিচার ডেলিভারি অপশনগুলোর জন্য ফিচার মডিউল ব্যবহার করে আপনার অ্যাপের ফিচারগুলোর অতিরিক্ত কনফিগারেশন এবং মডিউলারাইজেশনের প্রয়োজন হয়। অর্থাৎ, ফিচার মডিউলগুলো মডিউলার ফিচার তৈরির মূল ভিত্তি প্রদান করে, যেগুলোকে আপনি প্রয়োজন অনুযায়ী ডাউনলোড করার জন্য কনফিগার করতে পারেন।

এমন একটি অ্যাপের কথা ভাবুন যা আপনার ব্যবহারকারীদের একটি অনলাইন মার্কেটপ্লেসে পণ্য কেনা-বেচা করার সুযোগ দেয়। আপনি যুক্তিসঙ্গতভাবে অ্যাপটির নিম্নলিখিত প্রতিটি কার্যকারিতাকে আলাদা ফিচার মডিউলে ভাগ করতে পারেন:

  • অ্যাকাউন্ট লগইন এবং তৈরি
  • মার্কেটপ্লেস ব্রাউজ করা
  • বিক্রয়ের জন্য একটি আইটেম রাখা
  • পেমেন্ট প্রক্রিয়াকরণ

নিচের সারণিতে ফিচার মডিউলগুলো দ্বারা সমর্থিত বিভিন্ন ডেলিভারি অপশন এবং নমুনা মার্কেটপ্লেস অ্যাপটির প্রাথমিক ডাউনলোড সাইজ অপ্টিমাইজ করার জন্য সেগুলো কীভাবে ব্যবহার করা যেতে পারে, তা বর্ণনা করা হয়েছে।

ডেলিভারি বিকল্প আচরণ নমুনা ব্যবহারের ক্ষেত্র শুরু করা হচ্ছে
ইনস্টল-টাইম ডেলিভারি যেসব ফিচার মডিউল উপরে বর্ণিত কোনো ডেলিভারি অপশন কনফিগার করে না, সেগুলো ডিফল্টভাবে অ্যাপ ইনস্টলের সময় ডাউনলোড হয়ে যায়। এটি একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, কারণ এর ফলে আপনি উন্নত ডেলিভারি অপশনগুলো পর্যায়ক্রমে গ্রহণ করতে পারেন। উদাহরণস্বরূপ, প্লে ফিচার ডেলিভারি লাইব্রেরি ব্যবহার করে অন-ডিমান্ড ডাউনলোড সম্পূর্ণরূপে বাস্তবায়ন করার পরেই আপনি আপনার অ্যাপের ফিচারগুলোকে মডিউলারাইজ করে সুবিধা নিতে পারেন এবং অন-ডিমান্ড ডেলিভারি চালু করতে পারেন।

এছাড়াও, আপনার অ্যাপ পরবর্তীতে ফিচারগুলো আনইনস্টল করার জন্য অনুরোধ করতে পারে। তাই, অ্যাপ ইনস্টলের সময় যদি আপনার নির্দিষ্ট কিছু ফিচারের প্রয়োজন হয়, কিন্তু পরে আর না হয়, তবে ডিভাইস থেকে ফিচারটি সরিয়ে ফেলার অনুরোধ করে আপনি ইনস্টলের আকার কমাতে পারেন।

অ্যাপটিতে যদি নির্দিষ্ট কিছু প্রশিক্ষণমূলক কার্যক্রম থাকে, যেমন মার্কেটপ্লেসে কীভাবে জিনিসপত্র কেনা-বেচা করতে হয় তার ওপর একটি ইন্টারেক্টিভ গাইড, তাহলে আপনি অ্যাপ ইনস্টলের সময়ই সেই ফিচারটি ডিফল্টভাবে অন্তর্ভুক্ত করতে পারেন।

তবে, অ্যাপের ইনস্টল করা আকার কমাতে, ব্যবহারকারী প্রশিক্ষণটি সম্পন্ন করার পর অ্যাপটি ফিচারটি মুছে ফেলার জন্য অনুরোধ করতে পারে।

ফিচার মডিউল ব্যবহার করে আপনার অ্যাপটিকে মডিউলারাইজ করুন , যেগুলোতে কোনো অ্যাডভান্সড ডেলিভারি অপশন কনফিগার করার প্রয়োজন নেই।

ব্যবহারকারীর আর প্রয়োজন নেই এমন কিছু ফিচার মডিউল সরিয়ে দিয়ে কীভাবে আপনার অ্যাপের ইনস্টল করা সাইজ কমানো যায়, তা জানতে ‘ম্যানেজ ইনস্টলড মডিউলস’ পড়ুন।

চাহিদা অনুযায়ী ডেলিভারি আপনার অ্যাপকে প্রয়োজন অনুযায়ী ফিচার মডিউল অনুরোধ ও ডাউনলোড করার সুযোগ দেয়। যদি মার্কেটপ্লেস অ্যাপ ব্যবহারকারীদের মাত্র ২০% বিক্রির জন্য পণ্য পোস্ট করে, তাহলে অধিকাংশ ব্যবহারকারীর জন্য প্রাথমিক ডাউনলোডের আকার কমানোর একটি ভালো কৌশল হলো ছবি তোলা, পণ্যের বিবরণ যোগ করা এবং বিক্রির জন্য পণ্য রাখার কার্যকারিতাগুলোকে অন-ডিমান্ড ডাউনলোড হিসেবে উপলব্ধ করা। অর্থাৎ, আপনি অ্যাপটির বিক্রয় কার্যকারিতার ফিচার মডিউলটি এমনভাবে কনফিগার করতে পারেন, যাতে কোনো ব্যবহারকারী মার্কেটপ্লেসে বিক্রির জন্য পণ্য রাখতে আগ্রহ দেখালেই কেবল সেটি ডাউনলোড হয়।

এছাড়াও, যদি ব্যবহারকারী একটি নির্দিষ্ট সময়ের পর আর কোনো আইটেম বিক্রি না করেন, তাহলে অ্যাপটি ফিচারটি আনইনস্টল করার অনুরোধ জানিয়ে এর ইনস্টল করা ফাইলের আকার কমাতে পারে।

একটি ফিচার মডিউল তৈরি করুন এবং অন-ডিমান্ড ডেলিভারি কনফিগার করুন । এরপর আপনার অ্যাপ প্লে ফিচার ডেলিভারি লাইব্রেরি ব্যবহার করে চাহিদা অনুযায়ী মডিউলটি ডাউনলোড করার জন্য অনুরোধ করতে পারবে।
শর্তসাপেক্ষ ডেলিভারি অ্যাপ ইনস্টলের সময় কোনো মডিউলারাইজড ফিচার ডাউনলোড হবে কিনা, তা নির্ধারণ করার জন্য এটি আপনাকে ব্যবহারকারীর ডিভাইসের কিছু নির্দিষ্ট প্রয়োজনীয়তা, যেমন হার্ডওয়্যার ফিচার, লোকেল এবং ন্যূনতম এপিআই লেভেল উল্লেখ করার সুযোগ দেয়। মার্কেটপ্লেস অ্যাপটির যদি বিশ্বব্যাপী প্রসার থাকে, তাহলে আপনাকে এমন পেমেন্ট পদ্ধতি সমর্থন করতে হতে পারে যা শুধুমাত্র নির্দিষ্ট অঞ্চল বা স্থানীয় এলাকায় জনপ্রিয়। অ্যাপটির প্রাথমিক ডাউনলোড সাইজ কমানোর জন্য, আপনি নির্দিষ্ট ধরণের পেমেন্ট পদ্ধতি প্রক্রিয়াকরণের জন্য আলাদা ফিচার মডিউল তৈরি করতে পারেন এবং ব্যবহারকারীর নিবন্ধিত লোকেলের উপর ভিত্তি করে শর্তসাপেক্ষে তার ডিভাইসে সেগুলো ইনস্টল করতে পারেন। একটি ফিচার মডিউল তৈরি করুন এবং শর্তসাপেক্ষ ডেলিভারি কনফিগার করুন
তাৎক্ষণিক ডেলিভারি গুগল প্লে ইনস্ট্যান্ট ব্যবহারকারীদের তাদের ডিভাইসে অ্যাপটি ইনস্টল না করেই আপনার অ্যাপ ব্যবহার করার সুযোগ দেয়। এর পরিবর্তে, তারা গুগল প্লে স্টোরের 'এখনই চেষ্টা করুন' (Try Now) বোতামের মাধ্যমে অথবা আপনার তৈরি করা একটি ইউআরএল (URL)-এর মাধ্যমে অ্যাপটি ব্যবহার করে দেখতে পারেন। কন্টেন্ট সরবরাহের এই পদ্ধতিটি আপনার অ্যাপের সাথে সম্পৃক্ততা বাড়ানোকে আরও সহজ করে তোলে।

ইনস্ট্যান্ট ডেলিভারির মাধ্যমে, আপনি গুগল প্লে ইনস্ট্যান্ট ব্যবহার করে আপনার ব্যবহারকারীদের ইনস্টলেশন ছাড়াই অ্যাপের নির্দিষ্ট কিছু ফিচার তাৎক্ষণিকভাবে উপভোগ করার সুযোগ দিতে পারেন।

এমন একটি গেমের কথা ভাবুন, যার প্রথম কয়েকটি লেভেল একটি হালকা ফিচার মডিউলের মধ্যে অন্তর্ভুক্ত রয়েছে। আপনি সেই মডিউলটি তাৎক্ষণিকভাবে সক্রিয় করতে পারেন, যাতে ব্যবহারকারীরা কোনো অ্যাপ ইনস্টলেশন ছাড়াই একটি ইউআরএল লিঙ্ক বা “এখনই চেষ্টা করুন” বাটনের মাধ্যমে সঙ্গে সঙ্গে গেমটি উপভোগ করতে পারেন। একটি ফিচার মডিউল তৈরি করুন এবং ইনস্ট্যান্ট ডেলিভারি কনফিগার করুন । এরপর আপনার অ্যাপ প্লে ফিচার ডেলিভারি লাইব্রেরি ব্যবহার করে চাহিদা অনুযায়ী মডিউলটি ডাউনলোড করার জন্য অনুরোধ করতে পারবে।

মনে রাখবেন, ফিচার মডিউল ব্যবহার করে আপনার অ্যাপের ফিচারগুলোকে মডিউলারাইজ করা কেবল প্রথম ধাপ। গুগল প্লে ইনস্ট্যান্ট সাপোর্ট করার জন্য, আপনার অ্যাপের বেস মডিউল এবং একটি নির্দিষ্ট ইনস্ট্যান্ট-সক্ষম ফিচারের ডাউনলোড সাইজকে অবশ্যই কঠোর আকারের সীমাবদ্ধতা মেনে চলতে হবে। আরও জানতে, ‘অ্যাপ বা গেমের সাইজ কমিয়ে ইনস্ট্যান্ট অভিজ্ঞতা সক্ষম করুন ’ পড়ুন।

একটি রিসোর্সের জন্য URI তৈরি করা

আপনি যদি একটি URI ব্যবহার করে কোনো ফিচার মডিউলে সংরক্ষিত রিসোর্স অ্যাক্সেস করতে চান, তাহলে Uri.Builder() ব্যবহার করে কীভাবে একটি ফিচার মডিউল রিসোর্স URI তৈরি করবেন তা এখানে দেওয়া হলো:

কোটলিন

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build()

জাভা

String uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build().toString();

রিসোর্সের পাথের প্রতিটি অংশ রান টাইমে তৈরি করা হয়, যা নিশ্চিত করে যে স্প্লিট APK-গুলো লোড হওয়ার পর সঠিক নেমস্পেস তৈরি হয়।

URI কীভাবে তৈরি করা হয় তার একটি উদাহরণ হিসেবে, ধরুন আপনার একটি অ্যাপ এবং এই নামগুলোর ফিচার মডিউল আছে:

  • অ্যাপ প্যাকেজের নাম: com.example.my_app_package
  • ফিচারের রিসোর্স প্যাকেজের নাম: com.example.my_app_package.my_dynamic_feature

উপরের কোড স্নিপেটে থাকা resId যদি আপনার ফিচার মডিউলের “my_video” নামের কোনো র ফাইল রিসোর্সকে নির্দেশ করে, তাহলে উপরের Uri.Builder() কোডটির আউটপুট হবে নিম্নরূপ:

android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video

এরপর আপনার অ্যাপ এই URI-টি ব্যবহার করে ফিচার মডিউলের রিসোর্সটি অ্যাক্সেস করতে পারবে।

আপনার URI-তে থাকা পাথগুলো যাচাই করতে, আপনি APK Analyzer ব্যবহার করে আপনার ফিচার মডিউল APK পরীক্ষা করতে এবং প্যাকেজের নাম নির্ধারণ করতে পারেন:

একটি কম্পাইল করা রিসোর্স ফাইলের বিষয়বস্তু পরীক্ষা করার সময় APK অ্যানালাইজারের একটি স্ক্রিনশট।
চিত্র ১। একটি কম্পাইল করা রিসোর্স ফাইলের প্যাকেজ নামটি পরীক্ষা করতে APK অ্যানালাইজার ব্যবহার করুন।

ফিচার মডিউলগুলির জন্য বিবেচ্য বিষয়সমূহ

ফিচার মডিউলের সাহায্যে আপনি বিল্ড স্পিড ও ইঞ্জিনিয়ারিং ভেলোসিটি উন্নত করতে পারেন এবং আপনার অ্যাপের সাইজ কমানোর জন্য এর ফিচারগুলোর ডেলিভারি ব্যাপকভাবে কাস্টমাইজ করতে পারেন। তবে, ফিচার মডিউল ব্যবহার করার সময় কিছু সীমাবদ্ধতা এবং এজ কেস মনে রাখতে হবে:

  • শর্তসাপেক্ষ বা অন-ডিমান্ড ডেলিভারির মাধ্যমে একটি ডিভাইসে ৫০ বা তার বেশি ফিচার মডিউল ইনস্টল করলে পারফরম্যান্স সংক্রান্ত সমস্যা দেখা দিতে পারে। ইনস্টল-টাইম মডিউল, যেগুলোকে অপসারণযোগ্য হিসেবে কনফিগার করা হয়নি, সেগুলো স্বয়ংক্রিয়ভাবে বেস মডিউলের অন্তর্ভুক্ত হয়ে যায় এবং প্রতিটি ডিভাইসে একটি ফিচার মডিউল হিসেবেই গণ্য হয়।
  • ইনস্টল করার সময় অপসারণযোগ্য হিসেবে কনফিগার করা মডিউলের সংখ্যা ১০ বা তার কমের মধ্যে সীমাবদ্ধ রাখুন। অন্যথায়, আপনার অ্যাপের ডাউনলোড এবং ইনস্টল হওয়ার সময় বেড়ে যেতে পারে।
  • শুধুমাত্র অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১) এবং এর উচ্চতর সংস্করণে চালিত ডিভাইসগুলোই চাহিদা অনুযায়ী ফিচার ডাউনলোড ও ইনস্টল করতে পারে। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলোতে আপনার ফিচারটি উপলব্ধ করতে, ফিচার মডিউল তৈরি করার সময় ফিউজিং (Fusing ) সক্রিয় করুন।
  • SplitCompat সক্রিয় করুন, যাতে আপনার অ্যাপ চাহিদা অনুযায়ী সরবরাহ করা ডাউনলোড করা ফিচার মডিউলগুলো অ্যাক্সেস করতে পারে।
  • ফিচার মডিউলগুলোর ম্যানিফেস্টে android:exported true সেট করে অ্যাক্টিভিটি নির্দিষ্ট করা উচিত নয়। এর কারণ হলো, যখন অন্য কোনো অ্যাপ অ্যাক্টিভিটিটি চালু করার চেষ্টা করে, তখন ডিভাইসটি ফিচার মডিউলটি ডাউনলোড করেছে কি না, তার কোনো নিশ্চয়তা নেই। এছাড়াও, কোনো ফিচারের কোড এবং রিসোর্স অ্যাক্সেস করার চেষ্টা করার আগে আপনার অ্যাপের উচিত সেটি ডাউনলোড হয়েছে কি না তা নিশ্চিত করা। আরও জানতে, ‘ম্যানেজ ইনস্টলড মডিউলস’ পড়ুন।
  • যেহেতু প্লে ফিচার ডেলিভারি (Play Feature Delivery)-এর জন্য আপনাকে একটি অ্যাপ বান্ডেল ব্যবহার করে আপনার অ্যাপ প্রকাশ করতে হয়, তাই অ্যাপ বান্ডেলের জ্ঞাত সমস্যাগুলো সম্পর্কে নিশ্চিত হয়ে নিন।

ফিচার মডিউল ম্যানিফেস্ট রেফারেন্স

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে একটি নতুন ফিচার মডিউল তৈরি করার সময়, IDE-টি মডিউলটির ফিচার মডিউল হিসেবে কাজ করার জন্য প্রয়োজনীয় বেশিরভাগ ম্যানিফেস্ট অ্যাট্রিবিউট অন্তর্ভুক্ত করে দেয়। এছাড়াও, কিছু অ্যাট্রিবিউট কম্পাইল করার সময় বিল্ড সিস্টেম দ্বারা যুক্ত হয়ে যায়, তাই আপনাকে সেগুলো নিজে থেকে নির্দিষ্ট বা পরিবর্তন করার প্রয়োজন হয় না। নিচের সারণিতে ফিচার মডিউলের জন্য গুরুত্বপূর্ণ ম্যানিফেস্ট অ্যাট্রিবিউটগুলো বর্ণনা করা হলো।

বৈশিষ্ট্য বর্ণনা
প্রকাশ এটি একটি সাধারণ <manifest> ব্লক।
xmlns:dist="http://schemas.android.com/apk/distribution" একটি নতুন dist: XML নেমস্পেস নির্দিষ্ট করে, যা নিচে আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।
split=" split_name " অ্যান্ড্রয়েড স্টুডিও যখন আপনার অ্যাপ বান্ডেল তৈরি করে, তখন এটি স্বয়ংক্রিয়ভাবে এই অ্যাট্রিবিউটটি অন্তর্ভুক্ত করে দেয়। তাই, আপনার নিজে থেকে এই অ্যাট্রিবিউটটি অন্তর্ভুক্ত বা পরিবর্তন করা উচিত নয়

এটি মডিউলের নাম নির্ধারণ করে, যা আপনার অ্যাপ প্লে ফিচার ডেলিভারি লাইব্রেরি ব্যবহার করে কোনো অন-ডিমান্ড মডিউলের অনুরোধ করার সময় উল্লেখ করে।

Gradle যেভাবে এই অ্যাট্রিবিউটের মান নির্ধারণ করে:

ডিফল্টরূপে, যখন আপনি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে একটি ফিচার মডিউল তৈরি করেন, তখন IDE আপনার Gradle সেটিংস ফাইলে মডিউলটিকে একটি Gradle সাবপ্রজেক্ট হিসেবে শনাক্ত করার জন্য, আপনার নির্দিষ্ট করা মডিউল নামটিই ব্যবহার করে।

যখন আপনি আপনার অ্যাপ বান্ডেল বিল্ড করেন, তখন গ্রেডল সাবপ্রজেক্ট পাথের শেষ এলিমেন্টটি ব্যবহার করে মডিউলের ম্যানিফেস্টে এই ম্যানিফেস্ট অ্যাট্রিবিউটটি ইনজেক্ট করে। উদাহরণস্বরূপ, যদি আপনি MyAppProject/features/ ডিরেক্টরিতে একটি নতুন ফিচার মডিউল তৈরি করেন এবং এর মডিউল নেম হিসেবে "dynamic_feature1" নির্দিষ্ট করেন, তাহলে IDE আপনার settings.gradle ফাইলে ':features:dynamic_feature1' একটি সাবপ্রজেক্ট হিসেবে যোগ করে। এরপর আপনার অ্যাপ বান্ডেল বিল্ড করার সময়, গ্রেডল মডিউলের ম্যানিফেস্টে <manifest split="dynamic_feature1"> ইনজেক্ট করে দেয়।

android:isFeatureSplit="true | false"> অ্যান্ড্রয়েড স্টুডিও যখন আপনার অ্যাপ বান্ডেল তৈরি করে, তখন এটি স্বয়ংক্রিয়ভাবে এই অ্যাট্রিবিউটটি অন্তর্ভুক্ত করে দেয়। তাই, আপনার নিজে থেকে এই অ্যাট্রিবিউটটি অন্তর্ভুক্ত বা পরিবর্তন করা উচিত নয়

এটি নির্দেশ করে যে এই মডিউলটি একটি ফিচার মডিউল। বেস মডিউল এবং কনফিগারেশন APK-গুলিতে এই অ্যাট্রিবিউটটি হয় বাদ দেওয়া হয় অথবা এর মান false সেট করা হয়।

<dist:মডিউল এমন বৈশিষ্ট্যসমূহ সংজ্ঞায়িত করে যা নির্ধারণ করে মডিউলটি কীভাবে প্যাকেজ করা হবে এবং APK হিসেবে বিতরণ করা হবে।
দূরত্ব: তাৎক্ষণিক="সত্য | মিথ্যা" মডিউলটি গুগল প্লে ইনস্ট্যান্ট- এর মাধ্যমে একটি তাৎক্ষণিক অভিজ্ঞতা হিসেবে উপলব্ধ হবে কিনা তা নির্দিষ্ট করে।

আপনার অ্যাপে যদি এক বা একাধিক ইনস্ট্যান্ট-এনাবলড ফিচার মডিউল থাকে, তাহলে আপনাকে অবশ্যই বেস মডিউলটিও ইনস্ট্যান্ট-এনাবল করতে হবে। অ্যান্ড্রয়েড স্টুডিও ৩.৫ বা তার উচ্চতর সংস্করণ ব্যবহার করার সময়, আপনি যখন একটি ইনস্ট্যান্ট-এনাবলড ফিচার মডিউল তৈরি করেন , তখন IDE আপনার জন্য এই কাজটি করে দেয়।

আপনি <dist:on-demand/> সেট করার সাথে সাথে এই XML এলিমেন্টটিকে ' true সেট করতে পারবেন না। তবে, আপনি প্লে ফিচার ডেলিভারি লাইব্রেরি ব্যবহার করে আপনার ইনস্ট্যান্ট-সক্ষম ফিচার মডিউলগুলোকে ইনস্ট্যান্ট এক্সপেরিয়েন্স হিসেবে অন-ডিমান্ড ডাউনলোডের জন্য অনুরোধ করতে পারেন। যখন কোনো ব্যবহারকারী আপনার অ্যাপ ডাউনলোড এবং ইনস্টল করেন , তখন ডিভাইসটি ডিফল্টরূপে বেস APK-এর সাথে আপনার অ্যাপের ইনস্ট্যান্ট-সক্ষম ফিচার মডিউলগুলোও ডাউনলোড এবং ইনস্টল করে।

dist:title="@string/feature_name"> মডিউলটির জন্য একটি ব্যবহারকারী-দর্শনীয় শিরোনাম নির্দিষ্ট করে। উদাহরণস্বরূপ, ডিভাইসটি ডাউনলোড নিশ্চিতকরণের অনুরোধ করার সময় এই শিরোনামটি প্রদর্শন করতে পারে।

এই শিরোনামের জন্য স্ট্রিং রিসোর্সটি বেস মডিউলের module_root /src/ source_set /res/values/strings.xml ফাইলে অন্তর্ভুক্ত করতে হবে।

<dist:fusing dist:include="true | false" /> অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ২০) এবং এর চেয়ে নিম্ন সংস্করণের ডিভাইসগুলোর জন্য তৈরি মাল্টি-এপিকে-তে মডিউলটি অন্তর্ভুক্ত করা হবে কিনা, তা নির্দিষ্ট করে।

এছাড়াও, যখন আপনি কোনো অ্যাপ বান্ডেল থেকে APK তৈরি করতে bundletool ব্যবহার করেন , তখন শুধুমাত্র সেইসব ফিচার মডিউলগুলোই ইউনিভার্সাল APK-তে অন্তর্ভুক্ত হয়, যেগুলোতে এই প্রপার্টিটির মান ' true সেট করা থাকে। এই ইউনিভার্সাল APK হলো একটি মনোলিথিক APK, যাতে আপনার অ্যাপ দ্বারা সমর্থিত সমস্ত ডিভাইস কনফিগারেশনের জন্য কোড এবং রিসোর্স অন্তর্ভুক্ত থাকে।

<dist:delivery> এর মধ্যে এমন সব অপশন অন্তর্ভুক্ত রয়েছে যা মডিউল ডেলিভারিকে কাস্টমাইজ করে, যেমনটি নিচে দেখানো হয়েছে। মনে রাখবেন, প্রতিটি ফিচার মডিউলকে অবশ্যই এই কাস্টম ডেলিভারি অপশনগুলোর মধ্যে কেবল এক ধরনের অপশন কনফিগার করতে হবে।
<dist:install-time> এটি নির্দিষ্ট করে যে মডিউলটি ইনস্টলের সময় উপলব্ধ থাকবে। যেসব ফিচার মডিউল অন্য কোনো ধরনের কাস্টম ডেলিভারি অপশন নির্দিষ্ট করে না, তাদের জন্য এটিই ডিফল্ট আচরণ।

ইনস্টল-টাইম ডাউনলোড সম্পর্কে আরও জানতে, ‘ইনস্টল-টাইম ডেলিভারি কনফিগার করুন’ পড়ুন।

এই নোডটি এমন শর্তাবলীও নির্দিষ্ট করতে পারে যা মডিউলটিকে নির্দিষ্ট প্রয়োজনীয়তা পূরণকারী ডিভাইসগুলিতে সীমাবদ্ধ করে, যেমন ডিভাইসের বৈশিষ্ট্য, ব্যবহারকারীর দেশ বা ন্যূনতম API স্তর। আরও জানতে, ‘শর্তসাপেক্ষ ডেলিভারি কনফিগার করুন ’ পড়ুন।

<dist:removable dist:value="true | false" />

যখন এটি সেট করা থাকে না বা false এ সেট করা থাকে, তখন বান্ডলটুল বান্ডল থেকে স্প্লিট APK তৈরি করার সময় ইনস্টল-টাইম মডিউলগুলিকে বেস মডিউলের সাথে ফিউজ করে দেয়। ফিউজ করার ফলে স্প্লিট APK-এর সংখ্যা কম হবে, তাই এই সেটিংটি আপনার অ্যাপের পারফরম্যান্স উন্নত করতে পারে।

যখন removable বিকল্পটি ` true সেট করা থাকে, তখন ইনস্টল-টাইম মডিউলগুলো বেস মডিউলের সাথে একীভূত হবে না। ভবিষ্যতে মডিউল আনইনস্টল করতে চাইলে এটি ` true সেট করুন। তবে, অনেক বেশি মডিউলকে রিমুভেবল হিসেবে কনফিগার করলে আপনার অ্যাপের ইনস্টল টাইম বেড়ে যেতে পারে।

ডিফল্টরূপে এর মান false থাকে। কোনো ফিচার মডিউলের জন্য ফিউজিং নিষ্ক্রিয় করতে চাইলে, ম্যানিফেস্টে এই মানটি সেট করা আবশ্যক।

দ্রষ্টব্য: এই ফিচারটি শুধুমাত্র অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.২ অথবা কমান্ড লাইন থেকে বান্ডলটুল ভি১.০ ব্যবহার করার সময় পাওয়া যাবে।

<dist:install-time>
<dist:on-demand /> এটি নির্দিষ্ট করে যে মডিউলটি চাহিদা অনুযায়ী ডাউনলোডের জন্য উপলব্ধ থাকবে। অর্থাৎ, মডিউলটি ইনস্টলের সময় উপলব্ধ থাকে না, কিন্তু আপনার অ্যাপ পরে এটি ডাউনলোড করার জন্য অনুরোধ করতে পারে।

অন-ডিমান্ড ডাউনলোড সম্পর্কে আরও জানতে, ‘অন-ডিমান্ড ডেলিভারি কনফিগার করুন’ পড়ুন।

<dist:delivery>
</dist:module>
অ্যাপ্লিকেশন
android:hasCode ="true | false">
...
</অ্যাপ্লিকেশন>
যদি ফিচার মডিউলটি কোনো DEX ফাইল তৈরি না করে—অর্থাৎ, এতে এমন কোনো কোড না থাকে যা পরবর্তীতে DEX ফাইল ফরম্যাটে কম্পাইল করা হয়—তবে আপনাকে অবশ্যই নিম্নলিখিত কাজগুলো করতে হবে (অন্যথায়, আপনি রানটাইম ত্রুটি পেতে পারেন):
  1. ফিচার মডিউলের ম্যানিফেস্টে android:hasCode কে "false" এ সেট করুন।
  2. আপনার বেস মডিউলের ম্যানিফেস্টে নিম্নলিখিতটি যোগ করুন:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
...
</ইতালি>

অতিরিক্ত সম্পদ

ফিচার মডিউল ব্যবহার সম্পর্কে আরও জানতে, নিম্নলিখিত রিসোর্সগুলো দেখুন।

ব্লগ পোস্ট

ভিডিও

পরিষেবার শর্তাবলী এবং ডেটা সুরক্ষা

প্লে ফিচার ডেলিভারি লাইব্রেরি অ্যাক্সেস বা ব্যবহার করার মাধ্যমে, আপনি প্লে কোর সফটওয়্যার ডেভেলপমেন্ট কিট-এর পরিষেবার শর্তাবলীতে সম্মত হচ্ছেন। লাইব্রেরিটি অ্যাক্সেস করার আগে অনুগ্রহ করে প্রযোজ্য সমস্ত শর্তাবলী ও নীতিমালা পড়ুন এবং বুঝে নিন।

ডেটা সুরক্ষা

প্লে কোর লাইব্রেরিগুলো হলো গুগল প্লে স্টোরের সাথে আপনার অ্যাপের রানটাইম ইন্টারফেস। তাই, যখন আপনি আপনার অ্যাপে প্লে কোর ব্যবহার করেন, তখন প্লে স্টোর তার নিজস্ব প্রসেসগুলো চালায়, যার মধ্যে গুগল প্লে-এর পরিষেবার শর্তাবলী দ্বারা পরিচালিত ডেটা হ্যান্ডলিংও অন্তর্ভুক্ত। নিচের তথ্যে বর্ণনা করা হয়েছে, কীভাবে প্লে কোর লাইব্রেরিগুলো আপনার অ্যাপ থেকে আসা নির্দিষ্ট অনুরোধগুলো প্রসেস করার জন্য ডেটা পরিচালনা করে।

অতিরিক্ত ভাষা এপিআই

ব্যবহারের উপর সংগৃহীত ডেটা ইনস্টল করা ভাষাগুলির তালিকা
তথ্য সংগ্রহের উদ্দেশ্য সংগৃহীত ডেটা অ্যাপটির বিভিন্ন ভাষার সংস্করণ সরবরাহ করতে এবং অ্যাপ আপডেটের পরেও ইনস্টল করা ভাষাগুলো সংরক্ষণ করতে ব্যবহৃত হয়।
ডেটা এনক্রিপশন ডেটা এনক্রিপ্ট করা আছে।
ডেটা শেয়ারিং কোনো তৃতীয় পক্ষের কাছে ডেটা হস্তান্তর করা হয় না।
ডেটা মুছে ফেলা একটি নির্দিষ্ট সংরক্ষণকাল শেষে ডেটা মুছে ফেলা হয়।

প্লে ফিচার ডেলিভারি

ব্যবহারের উপর সংগৃহীত ডেটা ডিভাইসের মেটাডেটা
অ্যাপ্লিকেশন সংস্করণ
তথ্য সংগ্রহের উদ্দেশ্য সংগৃহীত ডেটা ডিভাইসটিতে সঠিক মডিউল সরবরাহ করতে এবং আপডেট, ব্যাকআপ ও রিস্টোরের পর ইনস্টল করা মডিউলগুলোকে সুরক্ষিত রাখতে ব্যবহৃত হয়।
ডেটা এনক্রিপশন ডেটা এনক্রিপ্ট করা আছে।
ডেটা শেয়ারিং কোনো তৃতীয় পক্ষের কাছে ডেটা হস্তান্তর করা হয় না।
ডেটা মুছে ফেলা একটি নির্দিষ্ট সংরক্ষণকাল শেষে ডেটা মুছে ফেলা হয়।

যদিও আমরা যথাসম্ভব স্বচ্ছ থাকার চেষ্টা করি, আপনার অ্যাপের ব্যবহারকারীর ডেটা সংগ্রহ, শেয়ার এবং নিরাপত্তা সংক্রান্ত কার্যক্রমের বিষয়ে গুগল প্লে-এর ডেটা সুরক্ষা বিভাগের ফর্মে কীভাবে উত্তর দেবেন, সেই সিদ্ধান্ত নেওয়ার সম্পূর্ণ দায়িত্ব আপনার।