Play ফিচার ডেলিভারির ওভারভিউ

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

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

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

Android Studio ব্যবহার করে আপনি নতুন ফিচার মডিউল তৈরি করলে, IDE মডিউলের build.gradle ফাইলে নিম্নলিখিত 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 প্রপার্টি: আপনি শুধু বেস মডিউলের বিল্ড কনফিগারেশন থেকে আপনার সম্পূর্ণ অ্যাপ প্রোজেক্টের জন্য কোড সঙ্কুচিত করার সুবিধা চালু করতে পারবেন। তাই, ফিচার মডিউল থেকে এই প্রপার্টি বাদ দেওয়া উচিত। তবে, আপনি প্রতিটি ফিচার মডিউলের জন্য অতিরিক্ত ProGuard নিয়ম নির্দিষ্ট করতে পারবেন।
  • versionCode এবং versionName: আপনার অ্যাপ বান্ডেল তৈরি করার সময়, Gradle অ্যাপ ভার্সন সংক্রান্ত তথ্য ব্যবহার করে যা বেস মডিউল প্রদান করে। আপনার ফিচার মডিউলের build.gradle ফাইল থেকে এইসব প্রপার্টি বাদ দেওয়া উচিত।

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

Android Studio আপনার ফিচার মডিউল তৈরি করার সময়, এটি বেস মডিউলের 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"]
}

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

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

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

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

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. রান/ডিবাগ কনফিগারেশন ডায়ালগের বাঁদিকের প্যানেল থেকে, আপনার পছন্দের Android অ্যাপ কনফিগারেশন বেছে নিন।
  3. সাধারণ ট্যাবের ডিপ্লয় করার জন্য ডায়নামিক ফিচার বিকল্পের অধীনে, আপনার অ্যাপ ডিপ্লয় করার সময় আপনি যে ফিচার মডিউল অন্তর্ভুক্ত করতে চান, তার পাশের বক্সে টিকচিহ্ন দিন।
  4. ঠিক আছে বিকল্পে ক্লিক করুন।

ডিফল্ট হিসেবে, Android Studio আপনার অ্যাপ ডিপ্লয় করার জন্য অ্যাপ বান্ডেল ব্যবহার করে না। পরিবর্তে, IDE আপনার ডিভাইসে APK তৈরি ও ইনস্টল করে যা APK সাইজের পরিবর্তে ডিপ্লয়মেন্ট স্পিডের জন্য অপ্টিমাইজ করা হয়। পরিবর্তে অ্যাপ বান্ডেল থেকে APK ও ঝটপট ব্যবহারের সুবিধা তৈরি ও ডিপ্লয় করার জন্য Android Studio কনফিগার করতে, আপনার রান/ডিবাগ কনফিগারেশন পরিবর্তন করুন।

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

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

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

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

  • অ্যাকাউন্টে লগ-ইন ও অ্যাকাউন্ট তৈরি করা
  • মার্কেটপ্লেস ব্রাউজ করা হচ্ছে
  • বিক্রির জন্য কোনও আইটেম রাখা
  • পেমেন্ট প্রসেস করা হচ্ছে

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

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

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

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

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

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

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

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

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

ফিচার মডিউল তৈরি করুন এবং চাহিদা অনুযায়ী ডেলিভারি কনফিগার করুন। আপনার অ্যাপ তখন Play ফিচার ডেলিভারি লাইব্রেরি ব্যবহার করে চাহিদা অনুযায়ী মডিউল ডাউনলোড করার অনুরোধ করতে পারে।
শর্তসাপেক্ষ ডেলিভারি অ্যাপ ইনস্টল করার সময় মডিউলারাইজড ফিচার ডাউনলোড করা হবে কিনা তা নির্ধারণ করতে, আপনাকে ব্যবহারকারীর ডিভাইসের নির্দিষ্ট কিছু প্রয়োজনীয়তা উল্লেখ করার অনুমতি দেয়, যেমন হার্ডওয়্যার ফিচার, লোকেল ও ন্যূনতম API লেভেল। মার্কেটপ্লেস অ্যাপের গ্লোবাল রিচ থাকলে, আপনাকে এমন পেমেন্ট পদ্ধতি ব্যবহার করতে হতে পারে যা শুধুমাত্র নির্দিষ্ট অঞ্চল বা স্থানীয় এলাকায় জনপ্রিয়। অ্যাপ ডাউনলোড করার সময় প্রাথমিক সাইজ কমাতে, আপনি নির্দিষ্ট ধরনের পেমেন্ট পদ্ধতি প্রসেস করার জন্য আলাদা ফিচার মডিউল তৈরি করতে পারেন এবং ব্যবহারকারীর রেজিস্টার করা লোকেলের উপর ভিত্তি করে তার ডিভাইসে শর্তসাপেক্ষে সেগুলি ইনস্টল করতে পারেন। ফিচার মডিউল তৈরি করুন এবং কন্ডিশনাল ডেলিভারি কনফিগার করুন।
ইনস্ট্যান্ট ডেলিভারি Google Play Instant ব্যবহারকারীদের ডিভাইসে অ্যাপ ইনস্টল না করেই আপনার অ্যাপের সাথে ইন্টার‍্যাক্ট করার অনুমতি দেয়। পরিবর্তে, তারা Google Play Store-এ "এখনই চেষ্টা করুন" বোতাম বা আপনার তৈরি করা URL-এর মাধ্যমে আপনার অ্যাপের অভিজ্ঞতা নিতে পারবেন। কন্টেন্ট ডেলিভার করার এই ফর্মের মাধ্যমে আপনার অ্যাপের সাথে এনগেজমেন্ট বাড়ানো আরও সহজ হয়।

ঝটপট ডেলিভারির মাধ্যমে, আপনি Google Play Instant ব্যবহার করে আপনার ব্যবহারকারীদের ইনস্টল না করেই আপনার অ্যাপের নির্দিষ্ট কিছু ফিচার ঝটপট ব্যবহার করার সুবিধা দিতে পারেন।

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

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

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

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

Kotlin

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 Analyzer-এর স্ক্রিনশট যা কম্পাইল করা রিসোর্স ফাইলের কন্টেন্ট পরীক্ষা করছে।
ছবি ১. কম্পাইল করা রিসোর্স ফাইলে প্যাকেজের নাম পরীক্ষা করতে APK Analyzer ব্যবহার করুন।

ফিচার মডিউলের ক্ষেত্রে বিবেচ্য বিষয়

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

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

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

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

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

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

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

ডিফল্ট হিসেবে, আপনি Android Studio ব্যবহার করে ফিচার মডিউল তৈরি করলে, IDE আপনার Gradle সেটিংস ফাইলে Gradle সাবপ্রোজেক্ট হিসেবে মডিউল শনাক্ত করতে আপনার উল্লেখ করা মডিউলের নাম ব্যবহার করে।

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

android:isFeatureSplit="true | false"> Android Studio আপনার অ্যাপ বান্ডেল তৈরি করার সময়, এটি আপনার জন্য এই অ্যাট্রিবিউট অন্তর্ভুক্ত করে। তাই, আপনাকে ম্যানুয়ালি এই অ্যাট্রিবিউট যোগ বা পরিবর্তন করতে হবে না।

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

<dist:module অ্যাট্রিবিউট নির্ধারণ করে যা থেকে বোঝা যায় কীভাবে মডিউল প্যাকেজ করা হয় এবং APK হিসেবে ডিস্ট্রিবিউট করা হয়।
dist:instant="true | false" মডিউলটি Google Play Instant-এর মাধ্যমে ঝটপট ব্যবহারের সুবিধা হিসেবে উপলভ্য হবে কিনা তা নির্দিষ্ট করে।

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

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

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

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

<dist:fusing dist:include="true | false" /> Android 4.4 (API লেভেল ২০) এবং তার আগের যেকোনও ভার্সনে চলে এমন টার্গেট ডিভাইসের মাল্টি-APK-তে মডিউল অন্তর্ভুক্ত করা হবে কিনা তা নির্দিষ্ট করে।

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

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

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

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

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

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

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

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

মনে রাখবেন: এই ফিচারটি শুধুমাত্র Android Gradle প্লাগ-ইন 4.2 বা কমান্ড লাইন থেকে bundletool v1.0 ব্যবহার করার সময় উপলভ্য হয়।

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

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

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

অতিরিক্ত রিসোর্স

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

ব্লগ পোস্ট

ভিডিও

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

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

ডেটা সুরক্ষা

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

অতিরিক্ত ভাষা API

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

Play ফিচার ডেলিভারি

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

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