অন-ডিভাইস এআই প্রারম্ভিক অ্যাক্সেস প্রোগ্রামের জন্য খেলুন (EAP)

ভূমিকা

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

সুবিধা

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

বিবেচনা

  • প্লে ফর অন-ডিভাইস AI ব্যবহার করার মাধ্যমে আপনি Google Play ডেভেলপার ডিস্ট্রিবিউশন এগ্রিমেন্ট এবং প্লে কোর সফটওয়্যার ডেভেলপমেন্ট কিট পরিষেবার শর্তাবলীতে সম্মত হন।
  • প্রারম্ভিক অ্যাক্সেস প্রোগ্রামে অংশগ্রহণকারী বিকাশকারীরা ডিভাইসে এআই-এর জন্য প্লে মূল্যায়ন করবে এবং Google Play-কে প্রতিক্রিয়া প্রদান করবে বলে আশা করা হচ্ছে।
  • প্লে ফর অন-ডিভাইস AI দ্বারা ডাউনলোড করা মডেলগুলি শুধুমাত্র সেই অ্যাপ দ্বারাই ব্যবহার করা যেতে পারে যেটি মডেলটি ডাউনলোড করেছে৷ মডেলগুলি অন্য অ্যাপগুলিতে অফার করা উচিত নয়, উদাহরণস্বরূপ একটি পরিষেবা সংযোগের মাধ্যমে৷
  • স্বতন্ত্র AI প্যাকগুলি তাদের সংকুচিত ডাউনলোড আকারের উপর ভিত্তি করে 1.5GB পর্যন্ত হতে পারে। আপনার অ্যাপ বান্ডেল থেকে জেনারেট করা আপনার অ্যাপের যেকোনো সংস্করণের সর্বাধিক ক্রমবর্ধমান অ্যাপের আকার হল 4GB।
  • 1GB এর বেশি আকারের অ্যাপগুলিকে অবশ্যই ন্যূনতম SDK লেভেল 21 বা তার বেশি সেট করতে হবে।
  • প্রারম্ভিক অ্যাক্সেস প্রোগ্রামের সময়, প্লে ফর অন-ডিভাইস AI পরিবর্তন সাপেক্ষে।

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

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

আপনার অ্যাপ বান্ডেলের সাথে AI প্যাকগুলি প্যাকেজ করে, আপনি আপনার কাস্টম মডেলগুলির সাথে আপনার অ্যাপের বিতরণ পরিচালনা করতে প্লে-এর বিদ্যমান সমস্ত টেস্টিং এবং রিলিজ টুল, যেমন টেস্ট ট্র্যাক এবং স্টেজড রোলআউটগুলি ব্যবহার করতে পারেন।

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

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

AI প্যাকের সাথে LiteRT এবং MediaPipe ব্যবহার করুন

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

আরও পড়া:

AI প্যাক দিয়ে শুরু করুন

একটি উচ্চ স্তরে, আপনি কীভাবে অন-ডিভাইস এআই-এর জন্য প্লে ব্যবহার শুরু করতে পারেন তা এখানে রয়েছে:

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

আপনার প্লে ডেভেলপার অ্যাকাউন্ট আইডি প্রদান করুন

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ পরীক্ষা করুন

AI প্যাকগুলি ব্যবহার করতে, নিশ্চিত করুন যে আপনার Android Gradle Plugin (AGP) সংস্করণটি কমপক্ষে 8.8। এই সংস্করণটি অ্যান্ড্রয়েড স্টুডিও লেডিবাগ 2 এর সাথে প্যাকেজ করা হয়েছে।

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

নিম্নলিখিত পদক্ষেপগুলির জন্য Android স্টুডিওর প্রয়োজন নেই।

  1. আপনার প্রকল্পের শীর্ষ-স্তরের ডিরেক্টরিতে, এআই প্যাকের জন্য একটি ডিরেক্টরি তৈরি করুন। এই ডিরেক্টরির নামটি 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-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 ডেলিভারি লাইব্রেরি ব্যবহার করুন৷

প্লে এআই ডেলিভারি লাইব্রেরির উপর নির্ভরতা ঘোষণা করুন

আপনার অ্যাপের build.gradle ফাইলে, প্লে এআই ডেলিভারি লাইব্রেরির উপর নির্ভরতা ঘোষণা করুন:

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

স্থিতি পরীক্ষা করুন

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

রিটার্ন মান স্ট্যাটাস
একটি বৈধ AiPackLocation অবজেক্ট AI প্যাক রুট ফোল্ডার assetsPath() এ অবিলম্বে অ্যাক্সেসের জন্য প্রস্তুত
null অজানা 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 প্যাক ডাউনলোড করতে fetch() পদ্ধতি ব্যবহার করুন বা সম্পূর্ণ করার জন্য একটি AI প্যাক আপডেট করার জন্য কল করুন:

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

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

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

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

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
বড় ডাউনলোড

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

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

প্রয়োজনীয় ব্যবহারকারী নিশ্চিতকরণ

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

নিম্নলিখিত একটি শ্রোতা বাস্তবায়ন একটি উদাহরণ:

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 ডাউনলোডের অগ্রগতি, ডাউনলোডের স্থিতি এবং যেকোনো ব্যর্থতার ত্রুটি কোড রয়েছে।

এআই প্যাকগুলি অ্যাক্সেস করুন

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

এআই প্যাকগুলি এআই প্যাক রুট ডিরেক্টরির মধ্যে assets ডিরেক্টরিতে সংরক্ষণ করা হয়। আপনি সুবিধার পদ্ধতি 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 প্যাকগুলি গ্রহণ করা উচিত এমন ডিভাইস বা ডিভাইসগুলির গ্রুপ নির্দিষ্ট করতে আপনি ডিভাইস টার্গেটিং নির্দেশাবলী অনুসরণ করতে পারেন।

অন্যান্য প্লে এআই ডেলিভারি এপিআই পদ্ধতি

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

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

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

একটি AI প্যাক সরান

একটি AI প্যাক অপসারণের সময়সূচী করতে removePack() ব্যবহার করুন।

একাধিক এআই প্যাকের অবস্থান পান

বাল্কে একাধিক AI প্যাকের স্থিতি জিজ্ঞাসা করতে getPackLocations() ব্যবহার করুন, যা AI প্যাক এবং তাদের অবস্থানগুলির একটি মানচিত্র প্রদান করে৷ getPackLocations() দ্বারা প্রত্যাবর্তিত মানচিত্রে বর্তমানে ডাউনলোড করা এবং আপ-টু-ডেট প্রতিটি প্যাকের জন্য একটি এন্ট্রি রয়েছে।

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

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

আপনি ডিভাইস বৈশিষ্ট্য লক্ষ্য করতে পারেন যেমন:

প্রয়োজনীয় পদক্ষেপের ওভারভিউ

ডিভাইস টার্গেটিং সক্ষম করতে নিম্নলিখিত পদক্ষেপগুলি প্রয়োজন:

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ পরীক্ষা করুন

ডিভাইস টার্গেটিং ব্যবহার করতে, নিশ্চিত করুন যে আপনার Android Gradle Plugin (AGP) সংস্করণটি কমপক্ষে 8.10.0-alpha01। এটি অ্যান্ড্রয়েড স্টুডিও মিরকাট 2 এর সাথে প্যাকেজ করা হয়েছে, যা ক্যানারিতে রয়েছে।

অ্যান্ড্রয়েড গ্রেডল প্লাগইনে এই বৈশিষ্ট্যটি সক্ষম করুন

ডিভাইস টার্গেটিং আপনার 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>

একটি ডিভাইস গ্রুপ 5টি পর্যন্ত ডিভাইস নির্বাচকের সমন্বয়ে গঠিত। একটি ডিভাইস একটি ডিভাইস গ্রুপে অন্তর্ভুক্ত করা হয় যদি এটি তার ডিভাইস নির্বাচকদের কোনোটিকে সন্তুষ্ট করে।

একটি ডিভাইস নির্বাচকের এক বা একাধিক ডিভাইস বৈশিষ্ট্য থাকতে পারে। একটি ডিভাইস নির্বাচন করা হয় যদি এটি নির্বাচকের ডিভাইস বৈশিষ্ট্যগুলির সাথে মেলে।

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

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

উপলব্ধ ডিভাইস বৈশিষ্ট্য

  • device_ram : ডিভাইস RAM এর প্রয়োজনীয়তা
    • min_bytes ( অন্তর্ভুক্ত) : ন্যূনতম প্রয়োজনীয় RAM (বাইটে)
    • max_bytes ( একচেটিয়া) : সর্বাধিক প্রয়োজনীয় RAM (বাইটে)
  • include_device_ids : ডিভাইস মডেল এই নির্বাচকে অন্তর্ভুক্ত করতে হবে (প্রতি গ্রুপে সর্বাধিক 10000টি ডিভাইস_আইডি) । ডিভাইসটি তালিকার যেকোনো ডিভাইস_আইডির সাথে মেলে তাহলে এই সম্পত্তিটি সন্তুষ্ট।
    • build_brand : ডিভাইস প্রস্তুতকারক
    • build_device : ডিভাইস মডেল কোড
  • excluded_device_ids : ডিভাইস মডেলগুলিকে এই নির্বাচকে বাদ দিতে হবে (প্রতি গ্রুপে সর্বাধিক 10000টি ডিভাইস_আইডি) । এই বৈশিষ্ট্যটি সন্তুষ্ট যদি ডিভাইসটি তালিকার কোনো device_id-এর সাথে মেলে না।
    • build_brand : ডিভাইস প্রস্তুতকারক
    • build_device : ডিভাইস মডেল কোড
  • প্রয়োজনীয়_সিস্টেম_বিশিষ্ট : একটি ডিভাইসের যে বৈশিষ্ট্যগুলিকে এই নির্বাচক দ্বারা অন্তর্ভুক্ত করতে হবে (প্রতি গ্রুপে সর্বাধিক 100টি বৈশিষ্ট্য) । এই বৈশিষ্ট্যটি পূরণ করতে একটি ডিভাইসের এই তালিকায় সমস্ত সিস্টেম বৈশিষ্ট্য থাকা প্রয়োজন৷

    সিস্টেম বৈশিষ্ট্য উল্লেখ

    • নাম : একটি সিস্টেম বৈশিষ্ট্য
  • forbidden_system_features : বৈশিষ্ট্যগুলি যা একটি ডিভাইসকে এই নির্বাচক দ্বারা অন্তর্ভুক্ত করতে হবে না (প্রতি গ্রুপে সর্বাধিক 100টি বৈশিষ্ট্য) । যদি একটি ডিভাইসে এই তালিকায় সিস্টেম বৈশিষ্ট্যগুলির কোনোটি থাকে তবে এটি এই সম্পত্তিকে সন্তুষ্ট করে না।

    সিস্টেম বৈশিষ্ট্য উল্লেখ

    • নাম : একটি সিস্টেম বৈশিষ্ট্য
  • সিস্টেম-অন-চিপ : সিস্টেম অন চিপ এই নির্বাচকের মধ্যে অন্তর্ভুক্ত করা হবে। এই বৈশিষ্ট্যটি পূরণ করতে একটি ডিভাইসের এই তালিকায় যেকোনো চিপ থাকা প্রয়োজন।

এখানে সমস্ত সম্ভাব্য ডিভাইস বৈশিষ্ট্য দেখানো একটি উদাহরণ:

<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" এবং মডেল কোড হল "সানফিশ")'

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

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

  • সমর্থিত ডিভাইসগুলির একটি CSV ডাউনলোড করা এবং বিল্ড_ব্র্যান্ড এবং বিল্ড_ডিভাইস ক্ষেত্রের জন্য যথাক্রমে প্রস্তুতকারক এবং মডেল কোড ব্যবহার করা।

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

আপনার প্রধান মডিউল এর 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 প্যাক ডিরেক্টরিগুলি নিয়ে আপনার AI প্যাকগুলিকে ডিভাইস গোষ্ঠীগুলির দ্বারা উপবিভাজন করুন এবং #group_myCustomGroup1, #group_myCustomGroup2, ইত্যাদির সাথে উপযুক্ত ফোল্ডারগুলি (নিচে বর্ণিত হিসাবে) পোস্ট-ফিক্সিং করুন৷ আপনার অ্যাপে 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>

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

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

অভ্যন্তরীণ অ্যাপ শেয়ারিং

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

অভ্যন্তরীণ অ্যাপ শেয়ারিং নির্দেশাবলী একবার দেখুন।

বান্ডলেটুল

বিকল্পভাবে, আপনি 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
    

বান্ডলেটুল সহ স্থানীয় পরীক্ষার সীমাবদ্ধতা

নিম্নলিখিত বান্ডলেটুল সহ স্থানীয় পরীক্ষার সীমাবদ্ধতা রয়েছে:

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

যাচাই করুন যে সঠিক 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 প্যাকগুলি থেকে তৈরি। অন-ডিমান্ড এবং ফাস্ট-ফলো এআই প্যাকগুলি APK হিসাবে ইনস্টল করা হয় না।

Google Play-তে পরীক্ষা করুন এবং প্রকাশ করুন

আমরা সুপারিশ করি যে আপনি একটি অভ্যন্তরীণ পরীক্ষা ট্র্যাক দিয়ে Google Play-তে আপনার অ্যাপের শেষ থেকে শেষ পর্যন্ত পরীক্ষা করুন৷

একবার আপনি এটি করে ফেললে, আপনি পর্যায়ক্রমে রোল-আউটগুলির সাথে উত্পাদনে আপনার অ্যাপ আপডেটটি ক্রমবর্ধমানভাবে প্রকাশ করতে পারেন৷

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

আমাদের নমুনা অ্যাপে অ্যাক্সেস পেতে আপনার Google Play অংশীদার পরিচালকের সাথে যোগাযোগ করুন।

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

মতামত প্রদান

প্রারম্ভিক অ্যাক্সেস প্রোগ্রামে অংশগ্রহণকারীদের সমস্যাগুলি রিপোর্ট করা এবং প্রতিক্রিয়া প্রদান করা উচিত। আপনি আপনার Google Play অংশীদার ম্যানেজারের সাথে যোগাযোগ করতে পারেন বা অন-ডিভাইস AI টিমের জন্য Play এর সাথে যোগাযোগ করতে পারেন৷

অ্যান্ড্রয়েড অ্যাপ বান্ডেল সম্পর্কে আরও জানুন এবং এআই ডেলিভারি SDK-এর রেফারেন্সগুলি পড়ুন।

,

ভূমিকা

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

সুবিধা

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

বিবেচনা

  • প্লে ফর অন-ডিভাইস AI ব্যবহার করার মাধ্যমে আপনি Google Play ডেভেলপার ডিস্ট্রিবিউশন এগ্রিমেন্ট এবং প্লে কোর সফটওয়্যার ডেভেলপমেন্ট কিট পরিষেবার শর্তাবলীতে সম্মত হন।
  • প্রারম্ভিক অ্যাক্সেস প্রোগ্রামে অংশগ্রহণকারী বিকাশকারীরা ডিভাইসে এআই-এর জন্য প্লে মূল্যায়ন করবে এবং Google Play-কে প্রতিক্রিয়া প্রদান করবে বলে আশা করা হচ্ছে।
  • প্লে ফর অন-ডিভাইস AI দ্বারা ডাউনলোড করা মডেলগুলি শুধুমাত্র সেই অ্যাপ দ্বারাই ব্যবহার করা যেতে পারে যেটি মডেলটি ডাউনলোড করেছে৷ মডেলগুলি অন্য অ্যাপগুলিতে অফার করা উচিত নয়, উদাহরণস্বরূপ একটি পরিষেবা সংযোগের মাধ্যমে৷
  • স্বতন্ত্র AI প্যাকগুলি তাদের সংকুচিত ডাউনলোড আকারের উপর ভিত্তি করে 1.5GB পর্যন্ত হতে পারে। আপনার অ্যাপ বান্ডেল থেকে জেনারেট করা আপনার অ্যাপের যেকোনো সংস্করণের সর্বাধিক ক্রমবর্ধমান অ্যাপের আকার হল 4GB।
  • 1GB এর বেশি আকারের অ্যাপগুলিকে অবশ্যই ন্যূনতম SDK লেভেল 21 বা তার বেশি সেট করতে হবে।
  • প্রারম্ভিক অ্যাক্সেস প্রোগ্রামের সময়, প্লে ফর অন-ডিভাইস AI পরিবর্তন সাপেক্ষে।

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

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

আপনার অ্যাপ বান্ডেলের সাথে AI প্যাকগুলি প্যাকেজ করে, আপনি আপনার কাস্টম মডেলগুলির সাথে আপনার অ্যাপের বিতরণ পরিচালনা করতে প্লে-এর বিদ্যমান সমস্ত টেস্টিং এবং রিলিজ টুল, যেমন টেস্ট ট্র্যাক এবং স্টেজড রোলআউটগুলি ব্যবহার করতে পারেন।

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

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

AI প্যাকের সাথে LiteRT এবং MediaPipe ব্যবহার করুন

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

আরও পড়া:

AI প্যাক দিয়ে শুরু করুন

একটি উচ্চ স্তরে, আপনি কীভাবে অন-ডিভাইস এআই-এর জন্য প্লে ব্যবহার শুরু করতে পারেন তা এখানে রয়েছে:

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

আপনার প্লে ডেভেলপার অ্যাকাউন্ট আইডি প্রদান করুন

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ পরীক্ষা করুন

AI প্যাকগুলি ব্যবহার করতে, নিশ্চিত করুন যে আপনার Android Gradle Plugin (AGP) সংস্করণটি কমপক্ষে 8.8। এই সংস্করণটি অ্যান্ড্রয়েড স্টুডিও লেডিবাগ 2 এর সাথে প্যাকেজ করা হয়েছে।

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

নিম্নলিখিত পদক্ষেপগুলির জন্য Android স্টুডিওর প্রয়োজন নেই।

  1. আপনার প্রকল্পের শীর্ষ-স্তরের ডিরেক্টরিতে, এআই প্যাকের জন্য একটি ডিরেক্টরি তৈরি করুন। এই ডিরেক্টরির নামটি 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-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 ডেলিভারি লাইব্রেরি ব্যবহার করুন৷

প্লে এআই ডেলিভারি লাইব্রেরির উপর নির্ভরতা ঘোষণা করুন

আপনার অ্যাপের build.gradle ফাইলে, প্লে এআই ডেলিভারি লাইব্রেরির উপর নির্ভরতা ঘোষণা করুন:

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

স্থিতি পরীক্ষা করুন

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

রিটার্ন মান স্ট্যাটাস
একটি বৈধ AiPackLocation অবজেক্ট AI প্যাক রুট ফোল্ডার assetsPath() এ অবিলম্বে অ্যাক্সেসের জন্য প্রস্তুত
null অজানা 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 পদ্ধতিগুলি এআই প্যাকের আকার, এখনও পর্যন্ত ডাউনলোড করা পরিমাণ (যদি অনুরোধ করা হয়) এবং অ্যাপ্লিকেশনটিতে ইতিমধ্যে স্থানান্তরিত পরিমাণ সরবরাহ করে:

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

যদি কোনও অনুরোধ ব্যর্থ হয় তবে errorCode() পদ্ধতিটি ব্যবহার করুন, যার রিটার্ন মান AiPackErrorCode শ্রেণিতে একটি ধ্রুবক ক্ষেত্রের সাথে মিলে যায়।

ইনস্টল করুন

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

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

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

ডাউনলোড রাজ্যগুলি মনিটর করুন

এআই প্যাকগুলির ইনস্টলেশন অগ্রগতি ট্র্যাক করতে আপনার একটি AiPackStateUpdateListener প্রয়োগ করা উচিত। পৃথক এআই প্যাকগুলির স্থিতি ট্র্যাকিং সমর্থন করার জন্য প্রতি প্যাক প্রতি স্ট্যাটাস আপডেটগুলি ভেঙে দেওয়া হয়। আপনার অনুরোধের জন্য অন্যান্য সমস্ত ডাউনলোড শেষ হওয়ার আগে আপনি উপলব্ধ এআই প্যাকগুলি ব্যবহার শুরু করতে পারেন।

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
বড় ডাউনলোড

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

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

প্রয়োজনীয় ব্যবহারকারী নিশ্চিতকরণ

যদি কোনও প্যাকের REQUIRES_USER_CONFIRMATION স্ট্যাটাস থাকে তবে ব্যবহারকারী showConfirmationDialog() এর সাথে প্রদর্শিত ডায়ালগটি গ্রহণ না করা পর্যন্ত ডাউনলোডটি এগিয়ে যাবে না। যখন অ্যাপটি প্লে দ্বারা স্বীকৃত না হয় তখন এই অবস্থাটি ঘটতে পারে example উদাহরণস্বরূপ, যদি অ্যাপটি সাইডলোড করা হয়। নোট করুন যে এই ক্ষেত্রে showConfirmationDialog() কল করা অ্যাপটি আপডেট করা হবে। আপডেটের পরে, আপনাকে আবার এআই প্যাকগুলি অনুরোধ করতে হবে।

নিম্নলিখিত শ্রোতার একটি উদাহরণ বাস্তবায়ন:

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 ডাউনলোডের অগ্রগতি, ডাউনলোডের স্থিতি এবং কোনও ব্যর্থতার ত্রুটি কোড রয়েছে।

এআই প্যাকগুলি অ্যাক্সেস করুন

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

এআই প্যাকগুলি এআই প্যাক রুট ডিরেক্টরিতে assets ডিরেক্টরিতে সংরক্ষণ করা হয়। আপনি সুবিধা পদ্ধতি 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;
}

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

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

অন্যান্য খেলুন এআই ডেলিভারি এপিআই পদ্ধতি

নিম্নলিখিতগুলি আপনার অ্যাপ্লিকেশনটিতে ব্যবহার করতে চাইতে পারেন এমন কিছু অতিরিক্ত এপিআই পদ্ধতি রয়েছে।

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

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

একটি এআই প্যাক সরান

একটি এআই প্যাক অপসারণের সময়সূচী করতে removePack() ব্যবহার করুন।

একাধিক এআই প্যাকগুলির অবস্থানগুলি পান

বাল্কে একাধিক এআই প্যাকগুলির স্থিতি জিজ্ঞাসা করতে getPackLocations() ব্যবহার করুন, যা এআই প্যাকগুলি এবং তাদের অবস্থানগুলির মানচিত্র দেয়। getPackLocations() দ্বারা ফিরে আসা মানচিত্রে প্রতিটি প্যাকের জন্য একটি এন্ট্রি রয়েছে যা বর্তমানে ডাউনলোড এবং আপ-টু-ডেট রয়েছে।

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

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

আপনি ডিভাইসের বৈশিষ্ট্যগুলিকে লক্ষ্য করতে পারেন যেমন:

প্রয়োজনীয় পদক্ষেপগুলির ওভারভিউ

ডিভাইস টার্গেটিং সক্ষম করতে নিম্নলিখিত পদক্ষেপগুলি প্রয়োজন:

  1. একটি এক্সএমএল ফাইলে আপনার ডিভাইস গ্রুপগুলি সংজ্ঞায়িত করুন।
  2. আপনার বান্ডিলের কোন অংশগুলি কোন ডিভাইস গ্রুপে যেতে হবে তা নির্দিষ্ট করুন।
  3. [Al চ্ছিক] স্থানীয়ভাবে আপনার কনফিগারেশনটি পরীক্ষা করুন।
  4. গুগল প্লেতে আপনার বান্ডিল (এক্সএমএল ফাইলযুক্ত) আপলোড করুন।

অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ পরীক্ষা করুন

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইনে এই বৈশিষ্ট্যটি সক্ষম করুন

ডিভাইস টার্গেটিং অবশ্যই আপনার gradle.properties ফাইল:

android.experimental.enableDeviceTargetingConfigApi=true

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

ডিভাইস টার্গেটিং কনফিগারেশন ফাইলটি একটি এক্সএমএল ফাইল যা আপনি আপনার কাস্টম ডিভাইস গ্রুপগুলি সংজ্ঞায়িত করেন। উদাহরণস্বরূপ, আপনি qti_v79 নামে একটি ডিভাইস গ্রুপকে সংজ্ঞায়িত করতে পারেন যা চিপে কোয়ালকম এসএম 8750 সিস্টেমের সাথে সমস্ত ডিভাইস ধারণ করে:

<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>

একটি ডিভাইস গ্রুপ 5 টি পর্যন্ত ডিভাইস নির্বাচকের সমন্বয়ে গঠিত। কোনও ডিভাইস কোনও ডিভাইস গ্রুপে অন্তর্ভুক্ত করা হয় যদি এটি তার ডিভাইস নির্বাচনকারীদের কোনওটি সন্তুষ্ট করে।

একটি ডিভাইস নির্বাচকের এক বা একাধিক ডিভাইস বৈশিষ্ট্য থাকতে পারে। যদি এটি নির্বাচকের সমস্ত ডিভাইস বৈশিষ্ট্যের সাথে মেলে তবে একটি ডিভাইস নির্বাচন করা হয়।

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

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

উপলব্ধ ডিভাইস বৈশিষ্ট্য

  • ডিভাইস_রাম : ডিভাইস র‌্যামের প্রয়োজনীয়তা
    • মিন_বাইটস ( অন্তর্ভুক্ত) : সর্বনিম্ন প্রয়োজনীয় র‌্যাম (বাইটে)
    • ম্যাক্স_বাইটস ( একচেটিয়া) : সর্বাধিক প্রয়োজনীয় র‌্যাম (বাইটে)
  • অন্তর্ভুক্ত_ডেভিস_আইডিএস : ডিভাইস মডেলগুলি এই নির্বাচক (প্রতি গ্রুপে সর্বোচ্চ 10000 ডিভাইস_আইডি) অন্তর্ভুক্ত করতে হবে। ডিভাইসটি তালিকার কোনও ডিভাইস_আইডির সাথে মেলে যদি এই সম্পত্তিটি সন্তুষ্ট।
    • বিল্ড_ব্র্যান্ড : ডিভাইস প্রস্তুতকারক
    • বিল্ড_ডেভাইস : ডিভাইস মডেল কোড
  • বাদ দেওয়া_ডেভাইস_আইডিএস : ডিভাইস মডেলগুলি এই নির্বাচককে বাদ দিতে হবে (প্রতি গ্রুপে 10000 ডিভাইস_আইডি সর্বোচ্চ) । ডিভাইসটি তালিকায় কোনও ডিভাইস_আইডির সাথে মেলে না তবে এই সম্পত্তিটি সন্তুষ্ট।
    • বিল্ড_ব্র্যান্ড : ডিভাইস প্রস্তুতকারক
    • বিল্ড_ডেভাইস : ডিভাইস মডেল কোড
  • প্রয়োজনীয়_সিস্টেম_ফেচারস : বৈশিষ্ট্যগুলি যে কোনও ডিভাইসকে এই নির্বাচক দ্বারা অন্তর্ভুক্ত করতে হবে (প্রতি গ্রুপে 100 টি বৈশিষ্ট্য) । এই সম্পত্তিটি সন্তুষ্ট করতে একটি ডিভাইসের এই তালিকায় সমস্ত সিস্টেমের বৈশিষ্ট্য থাকা দরকার।

    সিস্টেম বৈশিষ্ট্য রেফারেন্স

    • নাম : একটি সিস্টেম বৈশিষ্ট্য
  • নিষিদ্ধ_সিস্টেম_ফিয়াচারস : বৈশিষ্ট্যগুলি যে কোনও ডিভাইসকে এই নির্বাচক দ্বারা অন্তর্ভুক্ত করতে হবে না (প্রতি গ্রুপে সর্বোচ্চ 100 টি বৈশিষ্ট্য) । যদি কোনও ডিভাইসে এই তালিকায় সিস্টেমের কোনও বৈশিষ্ট্য থাকে তবে এটি এই সম্পত্তিটি সন্তুষ্ট করে না।

    সিস্টেম বৈশিষ্ট্য রেফারেন্স

    • নাম : একটি সিস্টেম বৈশিষ্ট্য
  • সিস্টেম-অন-চিপ : এই নির্বাচকটিতে অন্তর্ভুক্ত করার জন্য চিপগুলিতে সিস্টেম। এই সম্পত্তিটি সন্তুষ্ট করতে একটি ডিভাইসের এই তালিকায় কোনও চিপ থাকা দরকার।

এখানে সমস্ত সম্ভাব্য ডিভাইসের বৈশিষ্ট্য দেখানো একটি উদাহরণ রয়েছে:

<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>

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

আপনি গুগল প্লে কনসোলে ডিভাইস ক্যাটালগ ব্যবহার করে ডিভাইস প্রস্তুতকারক এবং মডেল কোডের জন্য সঠিক ফর্ম্যাটিংটি খুঁজে পেতে পারেন:

  • ডিভাইস ক্যাটালগ ব্যবহার করে পৃথক ডিভাইসগুলি পরিদর্শন করা, এবং নীচের উদাহরণে প্রদর্শিত স্থানগুলিতে প্রস্তুতকারক এবং মডেল কোড সন্ধান করা (গুগল পিক্সেল 4 এ এর ​​জন্য, প্রস্তুতকারকটি "গুগল" এবং মডেল কোডটি "সানফিশ") ''

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

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

  • সমর্থিত ডিভাইসগুলির একটি সিএসভি ডাউনলোড করা, এবং যথাক্রমে বিল্ড_ব্র্যান্ড এবং বিল্ড_ডেভাইস ক্ষেত্রগুলির জন্য প্রস্তুতকারক এবং মডেল কোড ব্যবহার করে।

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

আপনার প্রধান মডিউলটির 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 ক্লজটি নিশ্চিত করে যে আপনার বান্ডিল থেকে উত্পন্ন এপিকে ডিভাইস গ্রুপগুলি দ্বারা বিভক্ত করা হয়েছে।

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

আপনি কেবল আপনার বৃহত মডেলগুলিকে ডিভাইসগুলিতে সরবরাহ করতে পারে এমন ডিভাইসগুলিতে আকারটি অনুকূলিত রাখতে পারেন।

শেষ ধাপে তৈরি বিদ্যমান এআই প্যাক ডিরেক্টরিগুলি গ্রহণ করে ডিভাইস গ্রুপগুলি দ্বারা আপনার এআই প্যাকগুলি বিভক্ত করুন এবং #গ্রুপ_মাইকুস্টোমগ্রুপ 1, #গ্রুপ_মাইকুস্টোমগ্রুপ 2 ইত্যাদি সহ উপযুক্ত ফোল্ডারগুলি (নীচে বর্ণিত হিসাবে) পরে ফিক্সিং করে আপনার অ্যাপটিতে এআই প্যাকগুলি ব্যবহার করার সময় আপনাকে পোস্টফিক্সের মাধ্যমে ফোল্ডারগুলি ব্যবহার করার প্রয়োজন হবে না ()

পূর্ববর্তী পদক্ষেপের পরে, এটি দেখতে কেমন হতে পারে:

...
.../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 1 বা myCustomGroup2 এর অন্তর্গত নয় সেগুলি একটি খালি ai-pack-name প্যাক পাবেন।

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

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

আপনার বৈশিষ্ট্য মডিউলগুলির জন্য ডিভাইস টার্গেটিং ব্যবহার করুন

আপনি বৈশিষ্ট্য মডিউলগুলির জন্য ডিভাইস টার্গেটিংও ব্যবহার করতে পারেন। ডিভাইস গ্রুপ দ্বারা বৈশিষ্ট্য মডিউলগুলিকে বিভক্ত করার পরিবর্তে, আপনি নির্দিষ্ট করেছেন যে ডিভাইস গ্রুপের সদস্যতার ভিত্তিতে পুরো মডিউলটি সরবরাহ করা উচিত কিনা।

myCustomGroup1 1 বা 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 (1.18.0 বা তার বেশি) ব্যবহার করে এপিকে তৈরি করতে পারেন এবং এগুলি আপনার ডিভাইসে সাইডলোড করতে পারেন। বুন্ডলেটল ব্যবহার করে স্থানীয়ভাবে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করার জন্য এই পদক্ষেপগুলি অনুসরণ করুন:

  1. অ্যান্ড্রয়েড স্টুডিও বা বুন্ডলেটল দিয়ে আপনার অ্যাপ্লিকেশন বান্ডিলটি তৈরি করুন।

  2. --local-testing পতাকা সহ APKS উত্পন্ন করুন:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. একটি ডিভাইস সংযুক্ত করুন এবং APKSকে সাইডলোড করতে 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
    

বুন্ডলেটুলের সাথে স্থানীয় পরীক্ষার সীমাবদ্ধতা

নীচে বুন্ডলেটুলের সাথে স্থানীয় পরীক্ষার সীমাবদ্ধতা রয়েছে:

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

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

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

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

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

গুগল প্লেতে পরীক্ষা এবং প্রকাশ

আমরা আপনাকে সুপারিশ করি যে আপনি অভ্যন্তরীণ পরীক্ষার ট্র্যাকের সাথে গুগল প্লেতে শেষ হওয়ার জন্য আপনার অ্যাপটি শেষ করতে পরীক্ষা করুন।

একবার আপনি এটি সম্পন্ন করার পরে, আপনি মঞ্চযুক্ত রোল-আউট সহ উত্পাদনে আপনার অ্যাপ্লিকেশন আপডেটটি ক্রমবর্ধমানভাবে প্রকাশ করতে পারেন।

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

আমাদের নমুনা অ্যাপ্লিকেশনটিতে অ্যাক্সেস পেতে আপনার গুগল প্লে পার্টনার ম্যানেজারের সাথে যোগাযোগ করুন।

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

মতামত প্রদান

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

অ্যান্ড্রয়েড অ্যাপ্লিকেশন বান্ডিলগুলি সম্পর্কে আরও জানুন এবং এআই ডেলিভারি এসডিকে -র জন্য রেফারেন্সগুলি পড়ুন।

,

ভূমিকা

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

সুবিধা

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

বিবেচনা

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

অন-ডিভাইস এআইয়ের জন্য কীভাবে প্লে ব্যবহার করবেন

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

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

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

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

এআই প্যাকগুলি সহ লিটার্ট এবং মিডিয়াপাইপ ব্যবহার করুন

আপনি এআই প্যাকগুলি সহ লিটার্ট এবং মিডিয়াপাইপ ব্যবহার করতে পারেন। একটি এআই প্যাকটিতে আপনার মডেলটি প্যাকেজ করুন এবং তারপরে ইনস্টল-টাইম প্যাকগুলির জন্য বা দ্রুত অনুসরণ এবং অন-ডিমান্ড প্যাকগুলির জন্য নির্দেশাবলী ব্যবহার করে এটি অ্যাক্সেস করুন।

আরও পড়া:

এআই প্যাকগুলি দিয়ে শুরু করুন

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

  1. EAP এ যোগদানের জন্য গুগল প্লেতে আপনার প্লে বিকাশকারী অ্যাকাউন্ট আইডি সরবরাহ করুন।
  2. আপনার মডেলগুলি আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশন বান্ডেলে এআই প্যাকগুলিতে প্যাকেজ করুন এবং এআই প্যাকগুলি কীভাবে সরবরাহ করা উচিত তা নির্দিষ্ট করুন।
  3. [Al চ্ছিক] আপনি যদি বিভিন্ন ডিভাইসে বিভিন্ন মডেল সরবরাহ করতে চান তবে আপনি আপনার এআই প্যাকগুলির জন্য ডিভাইস টার্গেটিং কনফিগার করতে পারেন। উদাহরণস্বরূপ, আপনি এআই প্যাক এ একটি নির্দিষ্ট ডিভাইস মডেল, এআই প্যাক বি কমপক্ষে 6 জিবি র‌্যাম সহ ডিভাইসে সরবরাহ করতে পারেন এবং অন্যান্য সমস্ত ডিভাইস কোনও মডেল পেতে পারে না।
  4. [Al চ্ছিক] আপনি যদি অন-ডিমান্ড বা দ্রুত-অনুসরণ বিতরণ ব্যবহার করছেন তবে প্রয়োজন অনুযায়ী আপনার এআই প্যাকগুলি ডাউনলোড করতে আপনার অ্যাপ্লিকেশনটিতে প্লে এআই ডেলিভারি লাইব্রেরিটি সংহত করুন।
  5. আপনার অ্যাপ্লিকেশন বান্ডিলটি গুগল প্লেতে পরীক্ষা করুন এবং ছেড়ে দিন।

আপনার প্লে বিকাশকারী অ্যাকাউন্ট আইডি সরবরাহ করুন

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ পরীক্ষা করুন

এআই প্যাকগুলি ব্যবহার করতে, আপনার অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) সংস্করণটি কমপক্ষে 8.8 রয়েছে তা নিশ্চিত করুন। এই সংস্করণটি অ্যান্ড্রয়েড স্টুডিও লেডিবাগ 2 সহ প্যাকেজ করা হয়েছে।

আপনার মডেলটি একটি এআই প্যাকটিতে বের করুন

নিম্নলিখিত পদক্ষেপগুলির জন্য অ্যান্ড্রয়েড স্টুডিওর প্রয়োজন নেই।

  1. আপনার প্রকল্পের শীর্ষ স্তরের ডিরেক্টরিতে, এআই প্যাকের জন্য একটি ডিরেক্টরি তৈরি করুন। এই ডিরেক্টরি নামটি এআই প্যাকের নাম হিসাবে ব্যবহৃত হয়। এআই প্যাকের নামগুলি অবশ্যই একটি চিঠি দিয়ে শুরু করতে হবে এবং কেবল অক্ষর, সংখ্যা এবং আন্ডারস্কোর থাকতে পারে।
  2. এআই প্যাক ডিরেক্টরিতে, একটি build.gradle ফাইল তৈরি করুন এবং নিম্নলিখিত কোডটি যুক্ত করুন। এআই প্যাকের নাম এবং কেবলমাত্র একটি বিতরণ প্রকার নির্দিষ্ট করার বিষয়টি নিশ্চিত করুন:

    // 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 ফাইলে, নীচের মতো দেখানো হিসাবে আপনার প্রকল্পের প্রতিটি এআই প্যাকের নাম যুক্ত করুন:

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

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. আপনার এআই প্যাকের ভিতরে, একটি 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. আপনার মডেলগুলি লোড করতে এবং চালাতে কোড যুক্ত করুন। আপনি কীভাবে এটি করেন তা আপনার এআই প্যাকগুলির বিতরণ মোডের উপর নির্ভর করবে। নীচে ইনস্টল-টাইম এবং দ্রুত অনুসরণ/অন-ডিমান্ডের জন্য নির্দেশাবলী দেখুন।

  8. [Al চ্ছিক] বিভিন্ন ডিভাইসে বিভিন্ন মডেল সরবরাহ করতে ডিভাইসকে লক্ষ্য করে কনফিগার করুন

  9. গ্রেডের সাথে অ্যান্ড্রয়েড অ্যাপ বান্ডিলটি তৈরি করুন । উত্পন্ন অ্যাপ্লিকেশন বান্ডলে, মূল-স্তরের ডিরেক্টরিতে এখন নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

    • ai-pack-name/manifest/AndroidManifest.xml : এআই প্যাকের সনাক্তকারী এবং বিতরণ মোড কনফিগার করে
    • ai-pack-name/assets/your-model-directories : ডিরেক্টরিটিতে এআই প্যাকের অংশ হিসাবে বিতরণ করা সমস্ত সম্পদ রয়েছে

    গ্রেডল প্রতিটি এআই প্যাকের জন্য ম্যানিফেস্ট উত্পন্ন করে এবং আপনার জন্য assets/ ডিরেক্টরি আউটপুট দেয়।

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

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

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

দ্রুত অনুসরণ এবং অন-ডিমান্ড বিতরণ কনফিগার করুন

দ্রুত-অনুসরণ বা অন-ডিমান্ড ডেলিভারি সহ এআই প্যাকগুলি ডাউনলোড করতে, প্লে এআই ডেলিভারি লাইব্রেরি ব্যবহার করুন।

প্লে এআই ডেলিভারি লাইব্রেরির উপর নির্ভরতা ঘোষণা করুন

আপনার অ্যাপের build.gradle ফাইলে, প্লে এআই ডেলিভারি লাইব্রেরির উপর নির্ভরতা ঘোষণা করুন:

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

স্থিতি পরীক্ষা করুন

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

রিটার্ন মান স্ট্যাটাস
একটি বৈধ AiPackLocation অবজেক্ট এআই প্যাক রুট ফোল্ডারটি assetsPath() এ তাত্ক্ষণিক অ্যাক্সেসের জন্য প্রস্তুত
null অজানা এআই প্যাক বা এআই প্যাকগুলি উপলভ্য নয়

এআই প্যাকগুলি সম্পর্কে ডাউনলোডের তথ্য পান

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

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

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

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 পদ্ধতিগুলি এআই প্যাকের আকার, এখনও পর্যন্ত ডাউনলোড করা পরিমাণ (যদি অনুরোধ করা হয়) এবং অ্যাপ্লিকেশনটিতে ইতিমধ্যে স্থানান্তরিত পরিমাণ সরবরাহ করে:

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

যদি কোনও অনুরোধ ব্যর্থ হয় তবে errorCode() পদ্ধতিটি ব্যবহার করুন, যার রিটার্ন মান AiPackErrorCode শ্রেণিতে একটি ধ্রুবক ক্ষেত্রের সাথে মিলে যায়।

ইনস্টল করুন

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

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

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

ডাউনলোড রাজ্যগুলি মনিটর করুন

এআই প্যাকগুলির ইনস্টলেশন অগ্রগতি ট্র্যাক করতে আপনার একটি AiPackStateUpdateListener প্রয়োগ করা উচিত। পৃথক এআই প্যাকগুলির স্থিতি ট্র্যাকিং সমর্থন করার জন্য প্রতি প্যাক প্রতি স্ট্যাটাস আপডেটগুলি ভেঙে দেওয়া হয়। আপনার অনুরোধের জন্য অন্যান্য সমস্ত ডাউনলোড শেষ হওয়ার আগে আপনি উপলব্ধ এআই প্যাকগুলি ব্যবহার শুরু করতে পারেন।

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
বড় ডাউনলোড

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

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

প্রয়োজনীয় ব্যবহারকারী নিশ্চিতকরণ

যদি কোনও প্যাকের REQUIRES_USER_CONFIRMATION স্ট্যাটাস থাকে তবে ব্যবহারকারী showConfirmationDialog() এর সাথে প্রদর্শিত ডায়ালগটি গ্রহণ না করা পর্যন্ত ডাউনলোডটি এগিয়ে যাবে না। যখন অ্যাপটি প্লে দ্বারা স্বীকৃত না হয় তখন এই অবস্থাটি ঘটতে পারে example উদাহরণস্বরূপ, যদি অ্যাপটি সাইডলোড করা হয়। নোট করুন যে এই ক্ষেত্রে showConfirmationDialog() কল করা অ্যাপটি আপডেট করা হবে। আপডেটের পরে, আপনাকে আবার এআই প্যাকগুলি অনুরোধ করতে হবে।

নিম্নলিখিত শ্রোতার একটি উদাহরণ বাস্তবায়ন:

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 ডাউনলোডের অগ্রগতি, ডাউনলোডের স্থিতি এবং কোনও ব্যর্থতার ত্রুটি কোড রয়েছে।

এআই প্যাকগুলি অ্যাক্সেস করুন

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

এআই প্যাকগুলি এআই প্যাক রুট ডিরেক্টরিতে assets ডিরেক্টরিতে সংরক্ষণ করা হয়। আপনি সুবিধা পদ্ধতি 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;
}

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

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

অন্যান্য খেলুন এআই ডেলিভারি এপিআই পদ্ধতি

নিম্নলিখিতগুলি আপনার অ্যাপ্লিকেশনটিতে ব্যবহার করতে চাইতে পারেন এমন কিছু অতিরিক্ত এপিআই পদ্ধতি রয়েছে।

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

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

একটি এআই প্যাক সরান

একটি এআই প্যাক অপসারণের সময়সূচী করতে removePack() ব্যবহার করুন।

একাধিক এআই প্যাকগুলির অবস্থানগুলি পান

বাল্কে একাধিক এআই প্যাকগুলির স্থিতি জিজ্ঞাসা করতে getPackLocations() ব্যবহার করুন, যা এআই প্যাকগুলি এবং তাদের অবস্থানগুলির মানচিত্র দেয়। getPackLocations() দ্বারা ফিরে আসা মানচিত্রে প্রতিটি প্যাকের জন্য একটি এন্ট্রি রয়েছে যা বর্তমানে ডাউনলোড এবং আপ-টু-ডেট রয়েছে।

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

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

আপনি ডিভাইসের বৈশিষ্ট্যগুলিকে লক্ষ্য করতে পারেন যেমন:

প্রয়োজনীয় পদক্ষেপগুলির ওভারভিউ

ডিভাইস টার্গেটিং সক্ষম করতে নিম্নলিখিত পদক্ষেপগুলি প্রয়োজন:

  1. একটি এক্সএমএল ফাইলে আপনার ডিভাইস গ্রুপগুলি সংজ্ঞায়িত করুন।
  2. আপনার বান্ডিলের কোন অংশগুলি কোন ডিভাইস গ্রুপে যেতে হবে তা নির্দিষ্ট করুন।
  3. [Al চ্ছিক] স্থানীয়ভাবে আপনার কনফিগারেশনটি পরীক্ষা করুন।
  4. গুগল প্লেতে আপনার বান্ডিল (এক্সএমএল ফাইলযুক্ত) আপলোড করুন।

অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ পরীক্ষা করুন

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইনে এই বৈশিষ্ট্যটি সক্ষম করুন

ডিভাইস টার্গেটিং অবশ্যই আপনার gradle.properties ফাইল:

android.experimental.enableDeviceTargetingConfigApi=true

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

ডিভাইস টার্গেটিং কনফিগারেশন ফাইলটি একটি এক্সএমএল ফাইল যা আপনি আপনার কাস্টম ডিভাইস গ্রুপগুলি সংজ্ঞায়িত করেন। উদাহরণস্বরূপ, আপনি qti_v79 নামে একটি ডিভাইস গ্রুপকে সংজ্ঞায়িত করতে পারেন যা চিপে কোয়ালকম এসএম 8750 সিস্টেমের সাথে সমস্ত ডিভাইস ধারণ করে:

<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>

একটি ডিভাইস গ্রুপ 5 টি পর্যন্ত ডিভাইস নির্বাচকের সমন্বয়ে গঠিত। কোনও ডিভাইস কোনও ডিভাইস গ্রুপে অন্তর্ভুক্ত করা হয় যদি এটি তার ডিভাইস নির্বাচনকারীদের কোনওটি সন্তুষ্ট করে।

একটি ডিভাইস নির্বাচকের এক বা একাধিক ডিভাইস বৈশিষ্ট্য থাকতে পারে। যদি এটি নির্বাচকের সমস্ত ডিভাইস বৈশিষ্ট্যের সাথে মেলে তবে একটি ডিভাইস নির্বাচন করা হয়।

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

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

উপলব্ধ ডিভাইস বৈশিষ্ট্য

  • ডিভাইস_রাম : ডিভাইস র‌্যামের প্রয়োজনীয়তা
    • মিন_বাইটস ( অন্তর্ভুক্ত) : সর্বনিম্ন প্রয়োজনীয় র‌্যাম (বাইটে)
    • ম্যাক্স_বাইটস ( একচেটিয়া) : সর্বাধিক প্রয়োজনীয় র‌্যাম (বাইটে)
  • অন্তর্ভুক্ত_ডেভিস_আইডিএস : ডিভাইস মডেলগুলি এই নির্বাচক (প্রতি গ্রুপে সর্বোচ্চ 10000 ডিভাইস_আইডি) অন্তর্ভুক্ত করতে হবে। ডিভাইসটি তালিকার কোনও ডিভাইস_আইডির সাথে মেলে যদি এই সম্পত্তিটি সন্তুষ্ট।
    • বিল্ড_ব্র্যান্ড : ডিভাইস প্রস্তুতকারক
    • বিল্ড_ডেভাইস : ডিভাইস মডেল কোড
  • বাদ দেওয়া_ডেভাইস_আইডিএস : ডিভাইস মডেলগুলি এই নির্বাচককে বাদ দিতে হবে (প্রতি গ্রুপে 10000 ডিভাইস_আইডি সর্বোচ্চ) । ডিভাইসটি তালিকায় কোনও ডিভাইস_আইডির সাথে মেলে না তবে এই সম্পত্তিটি সন্তুষ্ট।
    • বিল্ড_ব্র্যান্ড : ডিভাইস প্রস্তুতকারক
    • বিল্ড_ডেভাইস : ডিভাইস মডেল কোড
  • প্রয়োজনীয়_সিস্টেম_ফেচারস : বৈশিষ্ট্যগুলি যে কোনও ডিভাইসকে এই নির্বাচক দ্বারা অন্তর্ভুক্ত করতে হবে (প্রতি গ্রুপে 100 টি বৈশিষ্ট্য) । এই সম্পত্তিটি সন্তুষ্ট করতে একটি ডিভাইসের এই তালিকায় সমস্ত সিস্টেমের বৈশিষ্ট্য থাকা দরকার।

    সিস্টেম বৈশিষ্ট্য রেফারেন্স

    • নাম : একটি সিস্টেম বৈশিষ্ট্য
  • নিষিদ্ধ_সিস্টেম_ফিয়াচারস : বৈশিষ্ট্যগুলি যে কোনও ডিভাইসকে এই নির্বাচক দ্বারা অন্তর্ভুক্ত করতে হবে না (প্রতি গ্রুপে সর্বোচ্চ 100 টি বৈশিষ্ট্য) । যদি কোনও ডিভাইসে এই তালিকায় সিস্টেমের কোনও বৈশিষ্ট্য থাকে তবে এটি এই সম্পত্তিটি সন্তুষ্ট করে না।

    সিস্টেম বৈশিষ্ট্য রেফারেন্স

    • নাম : একটি সিস্টেম বৈশিষ্ট্য
  • সিস্টেম-অন-চিপ : এই নির্বাচকটিতে অন্তর্ভুক্ত করার জন্য চিপগুলিতে সিস্টেম। এই সম্পত্তিটি সন্তুষ্ট করতে একটি ডিভাইসের এই তালিকায় কোনও চিপ থাকা দরকার।

এখানে সমস্ত সম্ভাব্য ডিভাইসের বৈশিষ্ট্য দেখানো একটি উদাহরণ রয়েছে:

<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>

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

আপনি গুগল প্লে কনসোলে ডিভাইস ক্যাটালগ ব্যবহার করে ডিভাইস প্রস্তুতকারক এবং মডেল কোডের জন্য সঠিক ফর্ম্যাটিংটি খুঁজে পেতে পারেন:

  • ডিভাইস ক্যাটালগ ব্যবহার করে পৃথক ডিভাইসগুলি পরিদর্শন করা এবং নীচের উদাহরণে যেমন দেখানো হয়েছে (গুগল পিক্সেল 4 এ এর ​​জন্য, প্রস্তুতকারকটি "গুগল" এবং মডেল কোডটি "সানফিশ") "

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

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

  • সমর্থিত ডিভাইসগুলির একটি সিএসভি ডাউনলোড করা, এবং যথাক্রমে বিল্ড_ব্র্যান্ড এবং বিল্ড_ডেভাইস ক্ষেত্রগুলির জন্য প্রস্তুতকারক এবং মডেল কোড ব্যবহার করে।

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

Add the following to your main module's build.gradle file:

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 is the path of your configuration file relative to the main module. This ensures that your configuration file is packaged with your app bundle.

The deviceGroup clause ensures that the APKs generated from your bundle are split by device groups.

Use device targeting for your AI packs

You can keep size optimized on devices by only delivering your large models to devices that can run them.

Subdivide your AI packs by device groups by taking the existing AI pack directories created in the last step, and post-fixing the appropriate folders (as described below) with #group_myCustomGroup1, #group_myCustomGroup2, etc. When using the AI packs in your app, you won't need to address folders by postfix (in other words, the postfix is automatically stripped during the build process).

After the previous step, this might look like:

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

In this example, you would reference ai-pack-name/assets/image-classifier/ without any postfixes.

Devices in myCustomGroup1 will receive all the assets under image-classifier#group_myCustomGroup1/ , while devices in myCustomGroup2 will receive all the assets under image-classifier#group_myCustomGroup2/ .

Devices that don't belong to either myCustomGroup1 or myCustomGroup2 will receive an empty ai-pack-name pack.

This is because devices that don't match any device group will receive the default variant of your AI pack. This includes anything that is not inside a directory with a #group_suffix .

Once you have downloaded the AI pack, you can check whether your model is present by using the AssetManager for install-time packs or the AiPackManager for fast-follow and on-demand packs. Examples for doing this are shown for all delivery modes in the sample app .

Use device targeting for your feature modules

You can also use device targeting for feature modules. Instead of subdividing feature modules by device group, you specify whether the entire module should be delivered based on device group membership.

To deliver a feature module to devices that belong to either myCustomGroup1 or myCustomGroup2 , modify its 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>

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

Before creating a release for your new bundle, you can test locally with either Internal App Sharing or Bundletool.

Internal App Sharing

Internal App Sharing lets you use an app bundle to quickly generate a URL that you can tap on a local device to install exactly what Google Play would install for that device if that version of the app was live in a test or prod track.

Take a look at the internal app sharing instructions .

বান্ডলেটুল

Alternatively, you can generate APKs using bundletool (1.18.0 or above) and sideload them onto your device. Follow these steps to test your app locally using bundletool:

  1. Build your app bundle with Android Studio or bundletool.

  2. Generate APKs with the --local-testing flag:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. Connect a device and run bundletool to sideload the APKs:

    # 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
    

Limitations of local testing with bundletool

The following are limitations of local testing with bundletool:

  • fast-follow packs behave as on-demand packs. That is, they won't be automatically fetched when the app is sideloaded. Developers need to request them manually when the app starts; this does not require any code changes in your app.
  • Packs fetch from external storage instead of Play, so you cannot test how your code behaves in the case of network errors.
  • Local testing does not cover the wait-for-Wi-Fi scenario.
  • Updates are not supported. Before installing a new version of your build, manually uninstall the previous version.

Verify that the correct APKs are being installed

Use the following method to ensure only the correct APKs are installed on the device

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

Note that you will only see APKs in this list, which are made from feature modules and install-time AI packs. On-demand and fast-follow AI packs are not installed as APKs.

Test and release on Google Play

We recommend that you test your app end to end on Google Play with an internal test track .

Once you've done this, you can incrementally release your app update to production with staged roll-outs .

Sample app using Play for On-device AI

Contact your Google Play partner manager to get access to our sample app .

It demonstrates how to use each of the delivery modes as well as the device targeting configuration. See the local testing section to get started.

মতামত প্রদান

Participants in the early access program should report issues and provide feedback. You can reach out to your Google Play partner manager or contact the Play for On-device AI team.

Learn more about Android App Bundles and read the references for the AI Delivery SDK .

,

ভূমিকা

Play for On-device AI brings the benefits of Android App Bundles and Google Play delivery to custom ML model distribution so you can improve model performance with less ecosystem complexity at no additional cost. It lets you publish a single artifact to Play containing your code, assets, and ML models and to choose from a number of delivery modes and targeting options.

সুবিধা

  • Upload a single publishing artifact to Google Play and delegate hosting, delivery, updates, and targeting to Play at no additional cost.
  • Deliver your ML models at install-time, fast-follow, or on-demand.
    • Install-time delivery can guarantee that a very large model is present when your app is opened. Your model will be installed as an APK.
    • Fast-follow delivery occurs automatically in the background after your app has been installed. Users may open your app before your model has been fully downloaded. Your model will be downloaded to your app's internal storage space.
    • On-demand delivery lets you request the model at runtime, which is useful if the model is only required for certain user-flows. Your model will be downloaded to your app's internal storage space.
  • Deliver variants of your ML models that are targeted to specific devices based on device model, system properties, or RAM.
  • Keep app updates small and optimized with Play's automatic patching, which means only the differences in files need to be downloaded.

বিবেচনা

  • By using Play for On-device AI you agree to the terms in the Google Play Developer Distribution Agreement and the Play Core Software Development Kit Terms of Service .
  • Developers participating in the early access program are expected to evaluate Play for On-device AI and to provide feedback to Google Play.
  • Models downloaded by Play for On-device AI can only be used by the app which downloaded the model. Models shouldn't be offered to other apps, for example through a service connection.
  • Individual AI packs can be up to 1.5GB, based on their compressed download sizes. The maximum cumulative app size of any version of your app generated from your app bundle is 4GB.
  • Apps over 1GB in size must set min SDK Level to 21 or higher.
  • During the early access program, Play for On-device AI is subject to change.

How to use Play for On-device AI

Play for On-device AI uses AI packs. You package custom models that are ready for distribution in AI packs in your app bundle. You can choose whether the AI pack should be delivered at install-time, fast-follow, or on-demand.

By packaging AI packs with your app bundle, you can use all of Play's existing testing and release tools, such as test tracks and staged rollouts to manage your app's distribution with your custom models.

AI packs are updated together with the app binary. If your new app release doesn't make changes to an AI pack, then Play's automatic patching process will ensure the user doesn't have to re-download it. Play will just download what's changed when it updates the app.

AI packs only contain models. Java/Kotlin and native libraries are not allowed. If you need to ship libraries or code to run your ML model, move it into the base module or a feature module . You can configure your feature module so that it has the same download and targeting settings as the AI pack.

Use LiteRT and MediaPipe with AI packs

You can use LiteRT and MediaPipe with AI packs. Package your model in an AI pack and then access it using the instructions for install-time packs or for fast-follow and on-demand packs .

আরও পড়া:

Get started with AI packs

At a high level, here's how you can start using Play for On-device AI:

  1. Provide your Play developer account ID to Google Play to join the EAP.
  2. Package your models into AI packs into your Android App Bundle and specify how the AI packs should be delivered.
  3. [Optional] If you want to deliver different models to different devices, you can configure device targeting for your AI packs. For example, you could deliver AI pack A to a specific device model, AI pack B to devices with at least 6GB of RAM, and all other devices could receive no model.
  4. [Optional] If you're using on-demand or fast-follow delivery, integrate the Play AI Delivery Library into your app to download your AI packs as needed.
  5. Test and release your app bundle to Google Play.

Provide your Play developer account ID

Since this feature is in early access, your developer account needs to be allow-listed to have access to Play for On-device AI. Confirm the Play developer account IDs and app package names to your Google Play partner manager or Play for On-device AI team member. Specify whether you will be targeting your models to specific devices (this is step 3 from the previous section). At this time, we're inviting select Play partners to test this feature.

Check Android Gradle Plugin version

To use AI packs, ensure that your Android Gradle Plugin (AGP) version is at least 8.8. This version is packaged with Android Studio Ladybug 2.

Extract your model into an AI pack

Android Studio is not required for the following steps.

  1. In the top-level directory of your project, create a directory for the AI pack. This directory name is used as the AI pack name. AI pack names must start with a letter and can only contain letters, numbers, and underscores.
  2. In the AI pack directory, create a build.gradle file and add the following code. Make sure to specify the name of the AI pack and only one delivery type:

    // 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. In the project's app build.gradle file, add the name of every AI pack in your project as shown below:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. In the project's settings.gradle file, include all AI packs in your project as shown below:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. Inside your AI pack, create a src/main/assets/ directory.

  6. Place your models in the src/main/assets directory. You can create subdirectories in here as well. The directory structure for your app should now look like the following:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. Add code to load and run your models. How you do this will depend on the delivery mode of your AI packs. See instructions for install-time and fast-follow/on-demand below.

  8. [Optional] Configure device targeting to deliver different models to different devices.

  9. Build the Android App Bundle with Gradle . In the generated app bundle, the root-level directory now includes the following:

    • ai-pack-name/manifest/AndroidManifest.xml : Configures the AI pack's identifier and delivery mode
    • ai-pack-name/assets/your-model-directories : Directory that contains all assets delivered as part of the AI pack

    Gradle generates the manifest for each AI pack and outputs the assets/ directory for you.

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

AI packs configured as install-time are immediately available at app launch. Use the Java AssetManager API to access AI packs served in this mode:

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

Configure fast-follow and on-demand delivery

To download AI packs with fast-follow or on-demand delivery, use the Play AI Delivery Library.

Declare dependency on the Play AI Delivery Library

In your app's build.gradle file, declare a dependency on the Play AI Delivery Library:

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

স্থিতি পরীক্ষা করুন

Each AI pack is stored in a separate folder in the app's internal storage. Use the getPackLocation() method to determine the root folder of an AI pack. This method returns the following values:

রিটার্ন মান স্ট্যাটাস
A valid AiPackLocation object AI pack root folder is ready for immediate access at assetsPath()
null Unknown AI pack or AI packs are not available

Get download information about AI packs

ব্যবহার করুন
getPackStates() method to determine the size of the download and whether the pack is already downloading.

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

getPackStates() is an asynchronous method that returns a Task<AiPackStates> . The packStates() method of an AiPackStates object returns a Map<String, AiPackState> . This map contains the state of each requested AI pack, keyed by its name:

Map<String, AiPackState> AiPackStates#packStates()

The final request is shown by the following:

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;
            });

The following AiPackState methods provide the size of the AI pack, the downloaded amount so far (if requested), and the amount already transferred to the app:

To get the status of an AI pack, use the status() method, which returns the status as an integer that corresponds to a constant field in the AiPackStatus class. An AI pack that's not installed yet has the status AiPackStatus.NOT_INSTALLED .

If a request fails, use the errorCode() method, whose return value corresponds to a constant field in the AiPackErrorCode class.

ইনস্টল করুন

Use the fetch() method to download an AI pack for the first time or call for the update of an AI pack to complete:

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

This method returns an AiPackStates object containing a list of packs and their initial download states and sizes. If an AI pack requested via fetch() is already downloading, the download status is returned and no additional download is started.

Monitor download states

You should implement an AiPackStateUpdateListener to track the installation progress of AI packs. The status updates are broken down per pack to support tracking the status of individual AI packs. You can start using available AI packs before all other downloads for your request have completed.

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
বড় ডাউনলোড

If the download is larger than 200 MB and the user is not on Wi-Fi, the download does not start until the user explicitly gives their consent to proceed with the download using a mobile data connection. Similarly, if the download is large and the user loses Wi-Fi, the download is paused and explicit consent is required to proceed using a mobile data connection. A paused pack has state WAITING_FOR_WIFI . To trigger the UI flow to prompt the user for consent, use the showConfirmationDialog() method.

Note that if the app does not call this method, the download is paused and will resume automatically only when the user is back on a Wi-Fi connection.

Required user confirmation

If a pack has the REQUIRES_USER_CONFIRMATION status, the download won't proceed until the user accepts the dialog that is shown with showConfirmationDialog() . This status can occur when the app is not recognized by Play—for example, if the app was sideloaded. Note that calling showConfirmationDialog() in this case will cause the app to be updated. After the update, you will need to request the AI packs again.

The following is an example implementation of a listener:

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;
      }
    }
}

Alternatively, you can use the getPackStates() method to get the status of current downloads. AiPackStates contains the download progress, download status, and any failure error codes.

Access AI packs

You can access an AI pack using file system calls after the download request reaches the COMPLETED state. Use the getPackLocation() method to get the root folder of the AI pack.

AI packs are stored in the assets directory within the AI pack root directory. You can get the path to the assets directory by using the convenience method assetsPath() . Use the following method to get the path to a specific asset:

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;
}

Configure device targeting

You can follow the device targeting instructions to specify devices or groups of devices that should receive your AI packs.

Other Play AI Delivery API methods

The following are some additional API methods you may want to use in your app.

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

Use cancel() to cancel an active AI pack request. Note that this request is a best-effort operation.

Remove an AI pack

Use removePack() to schedule the removal of an AI pack.

Get locations of multiple AI packs

Use getPackLocations() to query the status of multiple AI packs in bulk, which returns a map of AI packs and their locations. The map returned by getPackLocations() contains an entry for each pack that is currently downloaded and up-to-date.

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

Device targeting gives you finer control over which parts of your app bundle are delivered to specific devices. For example, you could ensure that a large model is only delivered to devices with high RAM or you could deliver different versions of a model to different devices.

You can target device properties such as:

Overview of required steps

The following steps are required to enable device targeting:

  1. Define your device groups in an XML file.
  2. Specify which parts of your bundle should go to which device groups.
  3. [Optional] Test your configuration locally.
  4. Upload your bundle (containing the XML file) to Google Play.

Check Android Gradle Plugin version

To use device targeting, ensure that your Android Gradle Plugin (AGP) version is at least 8.10.0-alpha01. This is packaged with Android Studio Meerkat 2, which is in canary .

Enable this feature in Android Gradle Plugin

Device targeting must be enabled explicitly in your gradle.properties file:

android.experimental.enableDeviceTargetingConfigApi=true

Create a device targeting configuration XML file

The device targeting configuration file is an XML file in which you define your custom device groups. For example, you could define a device group called qti_v79 that contains all devices with the Qualcomm SM8750 system on chip:

<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>

A device group is composed of up to 5 device selectors . A device is included in a device group if it satisfies any of its device selectors.

A device selector can have one or more device properties . A device is selected if it matches all of the selector's device properties.

If a device matches multiple groups, it will be served the content for the group that is defined first in the XML file. The order you define groups in the XML file is your priority order.

If a device matches no groups, it will receive the default "other" group. This group is automatically generated and shouldn't be defined explicitly.

Available device properties

  • device_ram : Device RAM requirements
    • min_bytes ( inclusive) : Minimum required RAM (in bytes)
    • max_bytes ( exclusive) : Maximum required RAM (in bytes)
  • included_device_ids : Device models to be included in this selector (max of 10000 device_ids per group) . This property is satisfied if the device matches any device_id in the list.
    • build_brand : Device manufacturer
    • build_device : Device model code
  • excluded_device_ids : Device models to be excluded in this selector (max of 10000 device_ids per group) . This property is satisfied if the device matches no device_id in the list.
    • build_brand : Device manufacturer
    • build_device : Device model code
  • required_system_features : Features that a device needs to have to be included by this selector (max of 100 features per group) . A device needs to have all system features in this list to satisfy this property.

    System feature reference

    • name : A system feature
  • forbidden_system_features : Features that a device mustn't have to be included by this selector (max of 100 features per group) . If a device has any of the system features in this list it doesn't satisfy this property.

    System feature reference

    • name : A system feature
  • system-on-chip : System on chips to be included in this selector. A device needs to have any chip in this list to satisfy this property.

Here is an example showing all possible device properties:

<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>

Official device manufacturer and device model codes

You can find the correct formatting for the device manufacturer and model code by using the Device Catalog on the Google Play Console, by either:

  • Inspecting individual devices using the Device Catalog, and finding the manufacturer and model code in the locations as shown in the example below (For a Google Pixel 4a, the manufacturer is "Google" and the model code is "sunfish")'

    pixel 4a page in the device catalog

    pixel 4a page in the device catalog

  • Downloading a CSV of supported devices, and using the Manufacturer and Model Code for the build_brand and build_device fields, respectively.

Include your device targeting configuration file in your app bundle

Add the following to your main module's build.gradle file:

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 is the path of your configuration file relative to the main module. This ensures that your configuration file is packaged with your app bundle.

The deviceGroup clause ensures that the APKs generated from your bundle are split by device groups.

Use device targeting for your AI packs

You can keep size optimized on devices by only delivering your large models to devices that can run them.

Subdivide your AI packs by device groups by taking the existing AI pack directories created in the last step, and post-fixing the appropriate folders (as described below) with #group_myCustomGroup1, #group_myCustomGroup2, etc. When using the AI packs in your app, you won't need to address folders by postfix (in other words, the postfix is automatically stripped during the build process).

After the previous step, this might look like:

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

In this example, you would reference ai-pack-name/assets/image-classifier/ without any postfixes.

Devices in myCustomGroup1 will receive all the assets under image-classifier#group_myCustomGroup1/ , while devices in myCustomGroup2 will receive all the assets under image-classifier#group_myCustomGroup2/ .

Devices that don't belong to either myCustomGroup1 or myCustomGroup2 will receive an empty ai-pack-name pack.

This is because devices that don't match any device group will receive the default variant of your AI pack. This includes anything that is not inside a directory with a #group_suffix .

Once you have downloaded the AI pack, you can check whether your model is present by using the AssetManager for install-time packs or the AiPackManager for fast-follow and on-demand packs. Examples for doing this are shown for all delivery modes in the sample app .

Use device targeting for your feature modules

You can also use device targeting for feature modules. Instead of subdividing feature modules by device group, you specify whether the entire module should be delivered based on device group membership.

To deliver a feature module to devices that belong to either myCustomGroup1 or myCustomGroup2 , modify its 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>

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

Before creating a release for your new bundle, you can test locally with either Internal App Sharing or Bundletool.

Internal App Sharing

Internal App Sharing lets you use an app bundle to quickly generate a URL that you can tap on a local device to install exactly what Google Play would install for that device if that version of the app was live in a test or prod track.

Take a look at the internal app sharing instructions .

বান্ডলেটুল

Alternatively, you can generate APKs using bundletool (1.18.0 or above) and sideload them onto your device. Follow these steps to test your app locally using bundletool:

  1. Build your app bundle with Android Studio or bundletool.

  2. Generate APKs with the --local-testing flag:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. Connect a device and run bundletool to sideload the APKs:

    # 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
    

Limitations of local testing with bundletool

The following are limitations of local testing with bundletool:

  • fast-follow packs behave as on-demand packs. That is, they won't be automatically fetched when the app is sideloaded. Developers need to request them manually when the app starts; this does not require any code changes in your app.
  • Packs fetch from external storage instead of Play, so you cannot test how your code behaves in the case of network errors.
  • Local testing does not cover the wait-for-Wi-Fi scenario.
  • Updates are not supported. Before installing a new version of your build, manually uninstall the previous version.

Verify that the correct APKs are being installed

Use the following method to ensure only the correct APKs are installed on the device

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

Note that you will only see APKs in this list, which are made from feature modules and install-time AI packs. On-demand and fast-follow AI packs are not installed as APKs.

Test and release on Google Play

We recommend that you test your app end to end on Google Play with an internal test track .

Once you've done this, you can incrementally release your app update to production with staged roll-outs .

Sample app using Play for On-device AI

Contact your Google Play partner manager to get access to our sample app .

It demonstrates how to use each of the delivery modes as well as the device targeting configuration. See the local testing section to get started.

মতামত প্রদান

Participants in the early access program should report issues and provide feedback. You can reach out to your Google Play partner manager or contact the Play for On-device AI team.

Learn more about Android App Bundles and read the references for the AI Delivery SDK .