অন-ডিভাইস AI (বিটা)-এর জন্য Play

ভূমিকা

Play for On-device AI, Android অ্যাপ বান্ডেল এবং Google Play ডেলিভারির সুবিধা কাস্টম ML মডেল ডিস্ট্রিবিউশনে নিয়ে আসে যাতে আপনি কোনও অতিরিক্ত খরচ ছাড়াই কম ডিভাইস ইকোসিস্টেম জটিলতার সাথে মডেলের পারফর্ম্যান্স উন্নত করতে পারেন। এটি আপনাকে Play-তে আপনার কোড, অ্যাসেট ও ML মডেল সহ একটি আর্টিফ্যাক্ট প্রকাশ করতে এবং বিভিন্ন ডেলিভারি মোড ও টার্গেটিং বিকল্প থেকে বেছে নিতে দেয়।

সুবিধা

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

বিবেচ্য বিষয়

  • অন-ডিভাইস AI-এর জন্য Play ব্যবহার করার মাধ্যমে আপনি Google Play ডেভেলপার ডিস্ট্রিবিউশন চুক্তি এবং Play Core সফ্টওয়্যার ডেভেলপমেন্ট কিট পরিষেবার শর্তাবলীতে সম্মতি দিচ্ছেন।
  • অন-ডিভাইস AI-এর জন্য Play-এর মাধ্যমে ডাউনলোড করা মডেল শুধুমাত্র আপনার অ্যাপের মাধ্যমে ব্যবহার করা উচিত। অন্যান্য অ্যাপে মডেল অফার করা উচিত নয়।
  • কমপ্রেস করা ডাউনলোড সাইজের উপর ভিত্তি করে, স্বতন্ত্র AI প্যাকের সাইজ সর্বাধিক ১.৫ জিবি হতে পারে। আপনার অ্যাপ বান্ডেল থেকে তৈরি করা অ্যাপের যেকোনও ভার্সনের সর্বাধিক মোট সাইজ ৪ জিবি।
  • ১ জিবি-র বেশি সাইজের অ্যাপের ক্ষেত্রে ন্যূনতম SDK লেভেল ২১ বা তার বেশি সেট করতে হবে।

অন-ডিভাইস AI-এর জন্য Play কীভাবে ব্যবহার করবেন

Play for On-device AI, AI প্যাক ব্যবহার করে। আপনি কাস্টম মডেল প্যাকেজ করেন যা আপনার অ্যাপ বান্ডেলে AI প্যাকে ডিস্ট্রিবিউশনের জন্য প্রস্তুত। AI প্যাক ইনস্টল-টাইম, ফাস্ট-ফলো নাকি অন-ডিমান্ড হিসেবে ডেলিভার করা হবে তা আপনি বেছে নিতে পারবেন।

আপনার অ্যাপ বান্ডেলের সাথে AI প্যাক প্যাকেজ করার মাধ্যমে, আপনি Play-এর সব বিদ্যমান পরীক্ষা এবং রিলিজ টুল ব্যবহার করতে পারেন, যেমন টেস্ট ট্র্যাক এবং আপনার কাস্টম মডেলের সাথে আপনার অ্যাপের ডিস্ট্রিবিউশন ম্যানেজ করার জন্য পর্যায়ক্রমিক প্রকাশ।

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

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

AI প্যাকের সাথে LiteRT ও MediaPipe ব্যবহার করা

আপনি AI প্যাকের সাথে LiteRT এবং MediaPipe ব্যবহার করতে পারবেন। AI প্যাকে আপনার মডেল প্যাকেজ করুন এবং তারপরে ইনস্টল-টাইম প্যাক অথবা ফাস্ট-ফলো এবং অন-ডিমান্ড প্যাক-এর জন্য নির্দেশাবলী ব্যবহার করে এটি অ্যাক্সেস করুন।

আরও পড়ুন:

AI প্যাক ব্যবহার শুরু করুন

এক নজরে, আপনি কীভাবে অন-ডিভাইস AI-এর জন্য Play ব্যবহার করা শুরু করতে পারেন তা এখানে দেওয়া হল:

  1. আপনার Android অ্যাপ বান্ডেলে AI প্যাকে আপনার মডেলগুলি প্যাক করুন এবং AI প্যাকগুলি কীভাবে ডেলিভার করা উচিত তা নির্দিষ্ট করুন।
  2. [ঐচ্ছিক] আপনি যদি বিভিন্ন ডিভাইসে বিভিন্ন মডেল ডেলিভার করতে চান, তাহলে আপনার AI প্যাকের জন্য ডিভাইস টার্গেটিং কনফিগার করতে পারেন। যেমন, আপনি নির্দিষ্ট ডিভাইস মডেলে AI প্যাক A, কমপক্ষে ৬ জিবি র‍্যাম থাকা ডিভাইসে AI প্যাক B ডেলিভার করতে পারেন এবং অন্যান্য ডিভাইসে কোনও মডেল ডেলিভার নাও করতে পারেন।
  3. [ঐচ্ছিক] আপনি যদি অন-ডিমান্ড বা ফাস্ট-ফলো ডেলিভারি ব্যবহার করেন, তাহলে প্রয়োজন অনুযায়ী আপনার AI প্যাক ডাউনলোড করতে আপনার অ্যাপে Play AI ডেলিভারি লাইব্রেরি ইন্টিগ্রেট করুন।
  4. আপনার অ্যাপ বান্ডেল পরীক্ষা করে Google Play-তে রিলিজ করুন।

Android Gradle প্লাগ-ইন ভার্সন চেক করুন

AI প্যাক ব্যবহার করতে, আপনার Android Gradle Plugin (AGP) ভার্সন অন্তত 8.8 হতে হবে। এই ভার্সনটি Android Studio Ladybug 2-এর সাথে প্যাকেজ করা হয়েছে।

আপনার মডেলকে AI প্যাকে এক্সট্র্যাক্ট করুন

নিচের ধাপগুলির জন্য Android Studio-এর প্রয়োজন নেই।

  1. আপনার প্রোজেক্টের টপ-লেভেল ডিরেক্টরিতে, AI প্যাকের জন্য একটি ডিরেক্টরি তৈরি করুন। এই ডিরেক্টরির নাম AI প্যাকের নাম হিসেবে ব্যবহার করা হয়। AI প্যাকের নাম অবশ্যই অক্ষর দিয়ে শুরু হতে হবে এবং এতে শুধু অক্ষর, সংখ্যা ও আন্ডারস্কোর থাকতে পারে।
  2. AI প্যাক ডিরেক্টরিতে, একটি build.gradle ফাইল তৈরি করুন এবং নিম্নলিখিত কোডটি যোগ করুন। AI প্যাকের নাম এবং শুধুমাত্র একটি ডেলিভারির ধরন উল্লেখ করতে ভুলবেন না:

    // In the AI pack's build.gradle file:
    plugins {
      id 'com.android.ai-pack'
    }
    
    aiPack {
        packName = "ai-pack-name" // Directory name for the AI pack
        dynamicDelivery {
            deliveryType = "[ install-time | fast-follow | on-demand ]"
        }
    }
    
  3. প্রোজেক্টের অ্যাপ build.gradle ফাইলে, আপনার প্রোজেক্টের প্রতিটি AI প্যাকের নাম নিচে দেখানো পদ্ধতিতে যোগ করুন:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. প্রোজেক্টের settings.gradle ফাইলে, আপনার প্রোজেক্টের সব AI প্যাক অন্তর্ভুক্ত করুন, যেমন নিচে দেখানো হয়েছে:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. আপনার AI প্যাকের মধ্যে, একটি src/main/assets/ ডিরেক্টরি তৈরি করুন।

  6. src/main/assets ডিরেক্টরিতে আপনার মডেল রাখুন। আপনি এখানেও সাবডিরেক্টরি তৈরি করতে পারবেন। আপনার অ্যাপের ডিরেক্টরি স্ট্রাকচার এখন নিম্নলিখিতটির মতো দেখতে হওয়া উচিত:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. আপনার মডেল লোড ও রান করতে কোড যোগ করুন। আপনি কীভাবে এটি করবেন তা আপনার AI প্যাকের ডেলিভারি মোডের উপর নির্ভর করবে। ইনস্টল-টাইম এবং ফাস্ট-ফলো/অন-ডিমান্ড-এর জন্য নিচে দেওয়া নির্দেশাবলী দেখুন।

  8. [ঐচ্ছিক] বিভিন্ন ডিভাইসে বিভিন্ন মডেল ডেলিভার করতে ডিভাইস টার্গেটিং কনফিগার করুন।

  9. Gradle-এর সাহায্যে Android অ্যাপ বান্ডেল তৈরি করুন। জেনারেট করা অ্যাপ বান্ডেলে, রুট-লেভেল ডিরেক্টরিতে এখন নিম্নলিখিতগুলি অন্তর্ভুক্ত থাকে:

    • ai-pack-name/manifest/AndroidManifest.xml: AI প্যাকের আইডেন্টিফায়ার ও ডেলিভারি মোড কনফিগার করে
    • ai-pack-name/assets/your-model-directories: AI প্যাকের অংশ হিসেবে ডেলিভার করা সব অ্যাসেট সহ ডিরেক্টরি

    Gradle প্রতিটি AI প্যাকের জন্য ম্যানিফেস্ট তৈরি করে এবং আপনার জন্য assets/ ডিরেক্টরি আউটপুট করে।

ইনস্টল-টাইম ডেলিভারি কনফিগার করা

ইনস্টল-টাইম হিসেবে কনফিগার করা AI প্যাক অ্যাপ লঞ্চ করার সাথে সাথেই উপলভ্য হয়। এই মোডে পরিবেশিত AI প্যাক অ্যাক্সেস করতে Java AssetManager API ব্যবহার করুন:

import android.content.res.AssetManager;
...
Context context = createPackageContext("com.example.app", 0);
AssetManager assetManager = context.getAssets();
InputStream is = assetManager.open("model-name");

ফাস্ট-ফলো ও অন-ডিমান্ড ডেলিভারি কনফিগার করা

ফাস্ট-ফলো বা অন-ডিমান্ড ডেলিভারির মাধ্যমে AI প্যাক ডাউনলোড করতে, Play AI ডেলিভারি লাইব্রেরি ব্যবহার করুন।

Play AI ডেলিভারি লাইব্রেরির উপর নির্ভরতা ঘোষণা করা

আপনার অ্যাপের build.gradle ফাইলে, Play AI Delivery লাইব্রেরির উপর ডিপেন্ডেন্সি ঘোষণা করুন:

dependencies {
  ...
  implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}

স্ট্যাটাস চেক করুন

প্রতিটি AI প্যাক অ্যাপের ইন্টার্নাল স্টোরেজের আলাদা ফোল্ডারে সেভ করা হয়। AI প্যাকের রুট ফোল্ডার নির্ধারণ করতে getPackLocation() পদ্ধতি ব্যবহার করুন। এই পদ্ধতি নিম্নলিখিত ভ্যালু রিটার্ন করে:

রিটার্ন মান স্ট্যাটাস
একটি সঠিক AiPackLocation অবজেক্ট AI প্যাক রুট ফোল্ডার assetsPath()-এ অবিলম্বে অ্যাক্সেসের জন্য প্রস্তুত
null অজানা AI প্যাক বা AI প্যাক উপলভ্য নেই

AI প্যাক ডাউনলোড করা সম্পর্কে তথ্য পান

ডাউনলোডের সাইজ নির্ধারণ করতে এবং প্যাকটি আগে থেকেই ডাউনলোড হচ্ছে কিনা তা জানতে
getPackStates() পদ্ধতি ব্যবহার করুন।

Task<AiPackStates> getPackStates(List<String> packNames)

getPackStates() হল একটি অ্যাসিঙ্ক্রোনাস পদ্ধতি যা Task<AiPackStates> রিটার্ন করে। AiPackStates অবজেক্টের packStates() পদ্ধতি Map<String, AiPackState> রিটার্ন করে। এই ম্যাপে প্রতিটি অনুরোধ করা AI প্যাকের স্ট্যাটাস থাকে, যা এর নাম দ্বারা চিহ্নিত করা হয়:

Map<String, AiPackState> AiPackStates#packStates()

চূড়ান্ত অনুরোধটি নিচে দেখানো হয়েছে:

final String aiPackName = "myAiPackName";

aiPackManager
    .getPackStates(Collections.singletonList(aiPackName))
    .addOnCompleteListener(new OnCompleteListener<AiPackStates>() {
        @Override
        public void onComplete(Task<AiPackStates> task) {
            AiPackStates aiPackStates;
            try {
                aiPackStates = task.getResult();
                AiPackState aiPackState =
                    aiPackStates.packStates().get(aiPackName);
            } catch (RuntimeExecutionException e) {
                Log.d("MainActivity", e.getMessage());
                return;
            });

নিম্নলিখিত AiPackState পদ্ধতিগুলি AI প্যাকের সাইজ, এখনও পর্যন্ত ডাউনলোড করা পরিমাণ (যদি অনুরোধ করা হয়) এবং অ্যাপে ইতিমধ্যে ট্রান্সফার করা পরিমাণ প্রদান করে:

AI প্যাকের স্ট্যাটাস জানতে, status() পদ্ধতি ব্যবহার করুন, যা AiPackStatus ক্লাসের কনস্ট্যান্ট ফিল্ডের সাথে সম্পর্কিত পূর্ণসংখ্যা হিসেবে স্ট্যাটাস রিটার্ন করে। এখনও ইনস্টল করা হয়নি এমন AI প্যাকের স্ট্যাটাস হল AiPackStatus.NOT_INSTALLED।

অনুরোধ কাজ না করলে, errorCode() পদ্ধতি ব্যবহার করুন, যার রিটার্ন ভ্যালু AiPackErrorCode ক্লাসের কনস্ট্যান্ট ফিল্ডের সাথে সম্পর্কিত।

ইনস্টল করুন

প্রথমবার AI প্যাক ডাউনলোড করতে বা AI প্যাকের আপডেট সম্পূর্ণ করতে fetch() পদ্ধতি ব্যবহার করুন:

Task<AiPackStates> fetch(List<String> packNames)

এই পদ্ধতিটি একটি AiPackStates অবজেক্ট রিটার্ন করে যাতে প্যাকের তালিকা এবং তাদের প্রাথমিক ডাউনলোড স্ট্যাটাস এবং সাইজ থাকে। fetch()-এর মাধ্যমে অনুরোধ করা AI প্যাক আগে থেকেই ডাউনলোড করা হলে, ডাউনলোডের স্ট্যাটাস দেখানো হয় এবং অতিরিক্ত কোনও ডাউনলোড শুরু করা হয় না।

ডাউনলোডের স্ট্যাটাস মনিটর করা

AI প্যাকের ইনস্টলেশন প্রোগ্রেস ট্র্যাক করতে আপনাকে AiPackStateUpdateListener প্রয়োগ করতে হবে। প্রতিটি AI প্যাকের স্ট্যাটাস ট্র্যাক করার জন্য স্ট্যাটাস আপডেটগুলি প্রতিটি প্যাকের জন্য আলাদাভাবে দেখানো হয়। আপনার অনুরোধের জন্য অন্যান্য সব ডাউনলোড সম্পূর্ণ হওয়ার আগে আপনি উপলভ্য AI প্যাক ব্যবহার করা শুরু করতে পারবেন।

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
বড় সাইজের ডাউনলোড

ডাউনলোড করা ফাইল ২০০ এমবি-র বেশি হলে এবং ব্যবহারকারী ওয়াই-ফাইয়ের সাথে কানেক্ট না থাকলে, মোবাইল ডেটা কানেকশন ব্যবহার করে ডাউনলোড করার জন্য ব্যবহারকারী স্পষ্টভাবে সম্মতি না দেওয়া পর্যন্ত ডাউনলোড শুরু হয় না। একইভাবে, ডাউনলোডের সাইজ বড় হলে এবং ব্যবহারকারীর ওয়াই-ফাই কানেকশন বন্ধ হয়ে গেলে, ডাউনলোড পজ হয়ে যায় এবং মোবাইল ডেটা কানেকশন ব্যবহার করে ডাউনলোড চালিয়ে যেতে স্পষ্ট সম্মতি প্রয়োজন হয়। পজ করা প্যাকের স্ট্যাটাস হল WAITING_FOR_WIFI। সম্মতির জন্য ব্যবহারকারীকে প্রম্পট করতে UI ফ্লো ট্রিগার করতে, showConfirmationDialog() পদ্ধতি ব্যবহার করুন।

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

ব্যবহারকারীর কনফার্মেশন প্রয়োজন

কোনও প্যাকের স্ট্যাটাস REQUIRES_USER_CONFIRMATION হলে, ব্যবহারকারী showConfirmationDialog()-এর সাথে দেখানো ডায়ালগ গ্রহণ না করা পর্যন্ত ডাউনলোড প্রসেস করা হবে না। Play অ্যাপটি চিনতে না পারলে এই স্ট্যাটাস দেখা যেতে পারে—যেমন, অ্যাপটি সাইডলোড করা হলে। মনে রাখবেন, এই ক্ষেত্রে showConfirmationDialog() কল করলে অ্যাপ আপডেট হয়ে যাবে। আপডেট করার পরে, আপনাকে আবার AI প্যাকের জন্য অনুরোধ করতে হবে।

নিচে লিসনার প্রয়োগের একটি উদাহরণ দেওয়া হল:

AiPackStateUpdateListener aiPackStateUpdateListener = new AiPackStateUpdateListener() {
    private final ActivityResultLauncher<IntentSenderRequest> activityResultLauncher =
      registerForActivityResult(
          new ActivityResultContracts.StartIntentSenderForResult(),
          new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
              if (result.getResultCode() == RESULT_OK) {
                Log.d(TAG, "Confirmation dialog has been accepted.");
              } else if (result.getResultCode() == RESULT_CANCELED) {
                Log.d(TAG, "Confirmation dialog has been denied by the user.");
              }
            }
          });

    @Override
    public void onStateUpdate(AiPackState aiPackState) {
      switch (aiPackState.status()) {
        case AiPackStatus.PENDING:
          Log.i(TAG, "Pending");
          break;

        case AiPackStatus.DOWNLOADING:
          long downloaded = aiPackState.bytesDownloaded();
          long totalSize = aiPackState.totalBytesToDownload();
          double percent = 100.0 * downloaded / totalSize;

          Log.i(TAG, "PercentDone=" + String.format("%.2f", percent));
          break;

        case AiPackStatus.TRANSFERRING:
          // 100% downloaded and assets are being transferred.
          // Notify user to wait until transfer is complete.
          break;

        case AiPackStatus.COMPLETED:
          // AI pack is ready to use. Run the model.
          break;

        case AiPackStatus.FAILED:
          // Request failed. Notify user.
          Log.e(TAG, aiPackState.errorCode());
          break;

        case AiPackStatus.CANCELED:
          // Request canceled. Notify user.
          break;

        case AiPackStatus.WAITING_FOR_WIFI:
        case AiPackStatus.REQUIRES_USER_CONFIRMATION:
          if (!confirmationDialogShown) {
            aiPackManager.showConfirmationDialog(activityResultLauncher);
            confirmationDialogShown = true;
          }
          break;

        case AiPackStatus.NOT_INSTALLED:
          // AI pack is not downloaded yet.
          break;
        case AiPackStatus.UNKNOWN:
          Log.wtf(TAG, "AI pack status unknown")
          break;
      }
    }
}

এছাড়াও, আপনি getPackStates() পদ্ধতি ব্যবহার করে বর্তমান ডাউনলোডের স্ট্যাটাস জানতে পারবেন। AiPackStates ডাউনলোডের অগ্রগতি, ডাউনলোডের স্ট্যাটাস এবং কোনও ব্যর্থতার ত্রুটি কোড থাকে।

AI প্যাক অ্যাক্সেস করুন

ডাউনলোডের অনুরোধ COMPLETED স্টেটে পৌঁছানোর পরে আপনি ফাইল সিস্টেম কল ব্যবহার করে AI প্যাক অ্যাক্সেস করতে পারবেন। AI প্যাকের রুট ফোল্ডার পেতে getPackLocation() পদ্ধতি ব্যবহার করুন।

AI প্যাক রুট ডিরেক্টরির মধ্যে assets ডিরেক্টরিতে AI প্যাক স্টোর করা হয়। আপনি assetsPath() সুবিধাজনক পদ্ধতি ব্যবহার করে assets ডিরেক্টরির পাথ পেতে পারেন। নির্দিষ্ট অ্যাসেটের পাথ পেতে নিম্নলিখিত পদ্ধতি ব্যবহার করুন:

private String getAbsoluteAiAssetPath(String aiPack, String relativeAiAssetPath) {
    AiPackLocation aiPackPath = aiPackManager.getPackLocation(aiPack);

    if (aiPackPath == null) {
        // AI pack is not ready
        return null;
    }

    String aiAssetsFolderPath = aiPackPath.assetsPath();
    // equivalent to: FilenameUtils.concat(aiPackPath.path(), "assets");
    String aiAssetPath = FilenameUtils.concat(aiAssetsFolderPath, relativeAiAssetPath);
    return aiAssetPath;
}

ডিভাইস টার্গেটিং কনফিগার করা

আপনার AI প্যাক কোন ডিভাইস বা ডিভাইসের গ্রুপে পাঠানো হবে তা নির্দিষ্ট করতে, আপনি ডিভাইস টার্গেট করার নির্দেশাবলী অনুসরণ করতে পারেন।

অন্যান্য Play AI Delivery API পদ্ধতি

আপনার অ্যাপে ব্যবহার করতে পারেন এমন কিছু অতিরিক্ত API পদ্ধতি নিচে দেওয়া হল।

অনুরোধ বাতিল করুন

অ্যাক্টিভ AI প্যাকের অনুরোধ বাতিল করতে cancel() ব্যবহার করুন। মনে রাখবেন যে এই অনুরোধটি একটি সেরা-প্রচেষ্টা অপারেশন।

AI প্যাক সরানো

AI প্যাক সরানোর শিডিউল করতে removePack() ব্যবহার করুন।

একাধিক AI প্যাকের লোকেশন পান

একসাথে একাধিক AI প্যাকের স্ট্যাটাস কোয়েরি করতে getPackLocations() ব্যবহার করুন, যা AI প্যাক এবং সেগুলির লোকেশনের একটি ম্যাপ রিটার্ন করে। getPackLocations()-এর মাধ্যমে ফেরত পাঠানো ম্যাপে বর্তমানে ডাউনলোড করা ও আপ-টু-ডেট প্রতিটি প্যাকের জন্য এন্ট্রি থাকে।

ডিভাইস টার্গেটিং

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

আপনি ডিভাইসের এইসব প্রপার্টি টার্গেট করতে পারবেন:

প্রয়োজনীয় ধাপের ওভারভিউ

ডিভাইস টার্গেট করার সুবিধা চালু করতে নিম্নলিখিত ধাপগুলি অনুসরণ করতে হবে:

  1. XML ফাইলে আপনার ডিভাইস গ্রুপ নির্ধারণ করুন।
  2. আপনার বান্ডেলের কোন অংশ কোন ডিভাইস গ্রুপে যাবে তা নির্দিষ্ট করুন।
  3. [ঐচ্ছিক] আপনার কনফিগারেশন লোকালি টেস্ট করুন।
  4. Google Play-তে আপনার বান্ডেল (XML ফাইল সহ) আপলোড করুন।

Android Gradle প্লাগ-ইন ভার্সন চেক করুন

ডিভাইস টার্গেট করার সুবিধা ব্যবহার করতে, আপনার Android Gradle Plugin (AGP) ভার্সন অন্তত 8.10.0 হতে হবে। এটি Android Studio (Meerkat 2 এবং তার পরবর্তী ভার্সন)-এর সাথে প্যাকেজ করা আছে। Android Studio-এর লেটেস্ট স্টেবল ভার্সন ডাউনলোড করুন।

Android Gradle প্লাগ-ইনে এই ফিচার চালু করুন

আপনার gradle.properties ফাইলে ডিভাইস টার্গেটিং স্পষ্টভাবে চালু করতে হবে:

android.experimental.enableDeviceTargetingConfigApi=true

ডিভাইস টার্গেটিং কনফিগারেশন XML ফাইল তৈরি করুন

ডিভাইস টার্গেটিং কনফিগারেশন ফাইল হল একটি XML ফাইল যেখানে আপনি নিজের কাস্টম ডিভাইস গ্রুপ সংজ্ঞায়িত করেন। যেমন, আপনি qti_v79 নামে একটি ডিভাইস গ্রুপ তৈরি করতে পারেন যাতে Qualcomm SM8750 সিস্টেম অন চিপ সহ সব ডিভাইস অন্তর্ভুক্ত থাকে:

<config:device-targeting-config
    xmlns:config="http://schemas.android.com/apk/config">

    <config:device-group name="qti_v79">
        <config:device-selector>
            <config:system-on-chip manufacturer="QTI" model="SM8750"/>
        </config:device-selector>
    </config:device-group>

</config:device-targeting-config>

ডিভাইস গ্রুপ সর্বাধিক ৫টি ডিভাইস সিলেক্টর নিয়ে গঠিত হয়। কোনও ডিভাইস যদি তার যেকোনও ডিভাইস সিলেক্টরের শর্ত পূরণ করে, তাহলে সেটি ডিভাইস গ্রুপে অন্তর্ভুক্ত করা হয়।

ডিভাইস বাছাইকারীতে এক বা একাধিক ডিভাইস প্রপার্টি থাকতে পারে। কোনও ডিভাইস তখনই বেছে নেওয়া হয় যখন এটি সিলেক্টরের সব ডিভাইস প্রপার্টির সাথে ম্যাচ করে।

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

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

উপলভ্য ডিভাইসের প্রপার্টি

  • device_ram: ডিভাইসের RAM সংক্রান্ত প্রয়োজনীয়তা
    • min_bytes (ইনক্লুসিভ): ন্যূনতম প্রয়োজনীয় RAM (বাইটে)
    • max_bytes (এক্সক্লুসিভ): সর্বাধিক প্রয়োজনীয় RAM (বাইটে)
  • included_device_ids: এই সিলেক্টরে অন্তর্ভুক্ত করার জন্য ডিভাইসের মডেল (প্রতি গ্রুপে সর্বাধিক ১০০০০ device_ids)। ডিভাইসটি তালিকার যেকোনও device_id-এর সাথে ম্যাচ করলে এই প্রপার্টিটি পূরণ হয়।
    • build_brand: ডিভাইস প্রস্তুতকারক
    • build_device: ডিভাইস মডেল কোড
  • excluded_device_ids: এই সিলেক্টরে বাদ দেওয়া ডিভাইসের মডেল (প্রতি গ্রুপে সর্বাধিক ১০০০০ device_ids)। ডিভাইসটি তালিকায় থাকা কোনও device_id-এর সাথে ম্যাচ না করলে এই প্রপার্টি পূরণ হয়।
    • build_brand: ডিভাইস প্রস্তুতকারক
    • build_device: ডিভাইস মডেল কোড
  • required_system_features: এই সিলেক্টরের মাধ্যমে অন্তর্ভুক্ত করার জন্য ডিভাইসে যেসব ফিচার থাকতে হবে (প্রতি গ্রুপে সর্বাধিক ১০০টি ফিচার)। এই প্রপার্টি পূরণ করতে ডিভাইসে এই তালিকার সব সিস্টেম ফিচার থাকতে হবে।

    সিস্টেম ফিচার রেফারেন্স

    • নাম: সিস্টেম ফিচার
  • forbidden_system_features: এই সিলেক্টর দ্বারা অন্তর্ভুক্ত করার জন্য ডিভাইসে অবশ্যই থাকতে হবে না এমন ফিচার (প্রতি গ্রুপে সর্বাধিক ১০০টি ফিচার)। কোনও ডিভাইসে এই তালিকার কোনও সিস্টেম ফিচার থাকলে, সেটি এই প্রপার্টি পূরণ করে না।

    সিস্টেম ফিচার রেফারেন্স

    • নাম: সিস্টেম ফিচার
  • system-on-chip: এই সিলেক্টরে অন্তর্ভুক্ত করার জন্য চিপের মধ্যে সিস্টেম। এই প্রপার্টি পূরণ করতে, ডিভাইসে এই তালিকার যেকোনও চিপ থাকতে হবে।

এখানে একটি উদাহরণ দেওয়া হল যেখানে ডিভাইসের সব সম্ভাব্য প্রপার্টি দেখানো হয়েছে:

<config:device-targeting-config
    xmlns:config="http://schemas.android.com/apk/config">

    <config:device-group name="myCustomGroup1">
      <config:device-selector ram-min-bytes="8000000000">
        <config:included-device-id brand="google" device="redfin"/>
        <config:included-device-id brand="google" device="sailfish"/>
        <config:included-device-id brand="good-brand"/>
        <config:excluded-device-id brand="google" device="caiman"/>
        <config:system-on-chip manufacturer="Sinclair" model="ZX80"/>
        <config:system-on-chip manufacturer="Commodore" model="C64"/>
      </config:device-selector>
      <config:device-selector ram-min-bytes="16000000000"/>
    </config:device-group>

    <config:device-group name="myCustomGroup2">
      <config:device-selector ram-min-bytes="4000000000" ram-max-bytes="8000000000">
        <config:required-system-feature name="android.hardware.bluetooth"/>
        <config:required-system-feature name="android.hardware.location"/>
        <config:forbidden-system-feature name="android.hardware.camera"/>
        <config:forbidden-system-feature name="mindcontrol.laser"/>
      </config:device-selector>
    </config:device-group>

</config:device-targeting-config>

অফিসিয়াল ডিভাইস প্রস্তুতকারক এবং ডিভাইস মডেল কোড

আপনি Google Play Console-এ ডিভাইস ক্যাটালগ ব্যবহার করে ডিভাইস প্রস্তুতকারক এবং মডেল কোডের জন্য সঠিক ফর্ম্যাটিং খুঁজে পেতে পারেন, এর মধ্যে যেকোনও একটি উপায়ে:

  • ডিভাইস ক্যাটালগ ব্যবহার করে আলাদা আলাদা ডিভাইস পরীক্ষা করা এবং নিচে দেখানো উদাহরণের মতো লোকেশনে প্রস্তুতকারক ও মডেল কোড খুঁজে দেখা (Google Pixel 4a-এর ক্ষেত্রে প্রস্তুতকারক হল "Google" এবং মডেল কোড হল "sunfish")'

    ডিভাইস ক্যাটালগে pixel 4a পৃষ্ঠা

    ডিভাইস ক্যাটালগে pixel 4a পৃষ্ঠা

  • কাজ করে এমন ডিভাইসের CSV ডাউনলোড করা এবং build_brand ও build_device ফিল্ডের জন্য যথাক্রমে প্রস্তুতকারক ও মডেল কোড ব্যবহার করা।

আপনার অ্যাপ বান্ডেলে ডিভাইস টার্গেটিং কনফিগারেশন ফাইল অন্তর্ভুক্ত করুন

আপনার মূল মডিউলের build.gradle ফাইলে নিম্নলিখিতগুলি যোগ করুন:

android {
  ...
  bundle {
    deviceTargetingConfig = file('device_targeting_config.xml')
    deviceGroup {
      enableSplit = true   // split bundle by #group
      defaultGroup = "other"  // group used for standalone APKs
    }
  }
  ...
}

device_targeting_config.xml হল মূল মডিউলের সাথে সম্পর্কিত আপনার কনফিগারেশন ফাইলের পাথ। এটি নিশ্চিত করে যে আপনার কনফিগারেশন ফাইলটি আপনার অ্যাপ বান্ডেলের সাথে প্যাকেজ করা হয়েছে।

deviceGroup ক্লজ নিশ্চিত করে যে আপনার বান্ডেল থেকে তৈরি করা APKগুলি ডিভাইস গ্রুপ দ্বারা বিভক্ত।

আপনার AI প্যাকের জন্য ডিভাইস টার্গেট করা ব্যবহার করুন

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

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

আগের ধাপের পরে, এটি দেখতে এমন হতে পারে:

...
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup1/
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup2/
...

এই উদাহরণে, আপনি কোনও পোস্টফিক্স ছাড়াই ai-pack-name/assets/image-classifier/ রেফারেন্স করবেন।

myCustomGroup1-এ থাকা ডিভাইসগুলি image-classifier#group_myCustomGroup1/-এর অধীনে থাকা সমস্ত অ্যাসেট পাবে, যখন myCustomGroup2-এ থাকা ডিভাইসগুলি image-classifier#group_myCustomGroup2/-এর অধীনে থাকা সমস্ত অ্যাসেট পাবে।

myCustomGroup1 বা myCustomGroup2-এর মধ্যে কোনওটিরই অন্তর্ভুক্ত নয় এমন ডিভাইস একটি খালি ai-pack-name প্যাক পাবে।

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

AI প্যাক ডাউনলোড করার পরে, আপনার মডেল আছে কিনা তা চেক করতে পারবেন। এর জন্য ইনস্টল-টাইম প্যাকের ক্ষেত্রে AssetManager অথবা ফাস্ট-ফলো ও অন-ডিমান্ড প্যাকের ক্ষেত্রে AiPackManager ব্যবহার করতে হবে। এটি করার উদাহরণ সব ডেলিভারি মোডের জন্য স্যাম্পেল অ্যাপে দেখানো হয়েছে।

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

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

myCustomGroup1 বা myCustomGroup2-এর মধ্যে যেকোনও একটির অন্তর্ভুক্ত ডিভাইসে ফিচার মডিউল ডেলিভার করতে, এটির AndroidManifest.xml পরিবর্তন করুন:

<manifest ...>
  ...
  <dist:module dist:title="...">
    <dist:delivery>
      <dist:install-time>
        <dist:conditions>
          <dist:device-groups>
            <dist:device-group dist:name="myCustomGroup1"/>
            <dist:device-group dist:name="myCustomGroup2"/>
          </dist:device-groups>
          ...
        </dist:conditions>
      </dist:install-time>
    </dist:delivery>
  </dist:module>
  ...
</manifest>

স্থানীয়ভাবে পরীক্ষা করুন

আপনার নতুন বান্ডেলের জন্য রিলিজ তৈরি করার আগে, আপনি ইন্টার্নাল অ্যাপ শেয়ারিং বা Bundletool-এর মাধ্যমে স্থানীয়ভাবে পরীক্ষা করতে পারেন।

ইন্টার্নাল অ্যাপ শেয়ারিং

ইন্টার্নাল অ্যাপ শেয়ারিং আপনাকে অ্যাপ বান্ডেল ব্যবহার করে দ্রুত একটি URL তৈরি করতে দেয়। আপনি স্থানীয় ডিভাইসে সেই URL-এ ট্যাপ করে ঠিক সেই অ্যাপটিই ইনস্টল করতে পারবেন যা Google Play সেই ডিভাইসের জন্য ইনস্টল করত, যদি অ্যাপের সেই ভার্সনটি কোনও টেস্ট বা প্রোডাকশন ট্র্যাকে লাইভ থাকত।

ইন্টার্নাল অ্যাপ শেয়ারিং সংক্রান্ত নির্দেশাবলী দেখুন।

Bundletool

বিকল্প হিসেবে, আপনি bundletool (1.18.0 বা তার পরবর্তী যেকোনও ভার্সন) ব্যবহার করে APK তৈরি করতে এবং আপনার ডিভাইসে সেগুলি সাইডলোড করতে পারবেন। bundletool ব্যবহার করে আপনার অ্যাপ স্থানীয়ভাবে পরীক্ষা করতে এই ধাপগুলি অনুসরণ করুন:

  1. Android Studio বা bundletool-এর সাহায্যে আপনার অ্যাপ বান্ডেল তৈরি করুন।

  2. --local-testing ফ্ল্যাগ সহ APK জেনারেট করুন:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. একটি ডিভাইস কানেক্ট করুন এবং APK সাইডলোড করতে bundletool রান করুন:

    # Example without Device Targeting Configuration
    java -jar bundletool.jar install-apks --apks=output.apks
    
    # Example with Device Targeting Configuration (you must specify which groups the connected device belongs to)
    java -jar bundletool.jar install-apks --apks=output.apks --device-groups=myCustomGroup1,myCustomGroup2
    

bundletool-এর মাধ্যমে লোকাল টেস্টিংয়ের সীমাবদ্ধতা

bundletool-এর মাধ্যমে স্থানীয়ভাবে পরীক্ষা করার ক্ষেত্রে নিম্নলিখিত সীমাবদ্ধতাগুলি রয়েছে:

  • fast-follow প্যাক on-demand প্যাকের মতো কাজ করে। অর্থাৎ, অ্যাপ সাইডলোড করা হলে, সেগুলি অটোমেটিক ফেচ করা হবে না। অ্যাপ চালু হওয়ার সময় ডেভেলপারদের ম্যানুয়ালি অনুরোধ করতে হবে; এর জন্য আপনার অ্যাপে কোনও কোড পরিবর্তন করতে হবে না।
  • প্যাকগুলি Play-এর পরিবর্তে এক্সটার্নাল স্টোরেজ থেকে ফেচ করা হয়, তাই নেটওয়ার্কের সমস্যা হলে আপনার কোড কীভাবে কাজ করে তা আপনি পরীক্ষা করতে পারবেন না।
  • লোকাল টেস্টিংয়ে ওয়াই-ফাইয়ের জন্য অপেক্ষা করার পরিস্থিতি কভার করা হয় না।
  • আপডেট কাজ করে না। আপনার বিল্ডের নতুন ভার্সন ইনস্টল করার আগে, আগের ভার্সন ম্যানুয়ালি আনইনস্টল করুন।

সঠিক APK ইনস্টল করা হচ্ছে কিনা তা যাচাই করুন

ডিভাইসে শুধুমাত্র সঠিক APK ইনস্টল করা হয়েছে কিনা তা নিশ্চিত করতে নিম্নলিখিত পদ্ধতি ব্যবহার করুন ডিভাইস

adb shell pm path {packageName}

আপনি এই ধরনের কিছু দেখতে পাবেন:

package:{...}/base.apk
package:{...}/split_config.en.apk
package:{...}/split_config.xxhdpi.apk
package:{...}/split_main_ai-pack-name.apk
package:{...}/split_main_ai-pack-name.config.group_myCustomGroup1.apk

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

Google Play-তে পরীক্ষা ও রিলিজ করা

আমরা সাজেস্ট করি যে আপনি Google Play-তে ইন্টার্নাল টেস্ট ট্র্যাক-এর মাধ্যমে আপনার অ্যাপ শুরু থেকে শেষ পর্যন্ত টেস্ট করুন।

এটি করার পরে, আপনি স্টেজড রিলিজ-এর মাধ্যমে প্রোডাকশনে আপনার অ্যাপ আপডেট ইনক্রিমেন্টাল রিলিজ করতে পারবেন।

অন-ডিভাইস AI-এর জন্য Play ব্যবহার করে স্যাম্পেল অ্যাপ

স্যাম্পেল অ্যাপ ডাউনলোড করুন।

এটি প্রতিটি ডেলিভারি মোড এবং ডিভাইস টার্গেটিং কনফিগারেশন কীভাবে ব্যবহার করতে হয় তা দেখায়। শুরু করতে লোকাল টেস্টিং বিভাগ দেখুন।

Android App Bundle সম্পর্কে আরও জানুন এবং AI Delivery SDK-এর রেফারেন্স পড়ুন।