অন-ডিভাইস AI (বিটা) এর জন্য খেলুন

ভূমিকা

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

সুবিধা

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

বিবেচ্য বিষয়সমূহ

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

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

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

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

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

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

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

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

আরও পড়ুন:

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

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

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

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

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

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

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

  1. আপনার প্রোজেক্টের শীর্ষ-স্তরের ডিরেক্টরিতে, এআই প্যাকের জন্য একটি ডিরেক্টরি তৈরি করুন। এই ডিরেক্টরির নামটিই এআই প্যাকের নাম হিসেবে ব্যবহৃত হবে। এআই প্যাকের নাম অবশ্যই একটি অক্ষর দিয়ে শুরু হতে হবে এবং এতে শুধুমাত্র অক্ষর, সংখ্যা ও আন্ডারস্কোর থাকতে পারবে।
  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. প্রজেক্টের app 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. আপনার মডেলগুলো লোড ও রান করার জন্য কোড যোগ করুন। আপনি এটি কীভাবে করবেন তা আপনার এআই প্যাকগুলোর ডেলিভারি মোডের উপর নির্ভর করবে। নিচে ইন্সটল-টাইম এবং ফাস্ট-ফলো/অন-ডিমান্ডের জন্য নির্দেশাবলী দেখুন।

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

  9. Gradle ব্যবহার করে অ্যান্ড্রয়েড অ্যাপ বান্ডেলটি বিল্ড করুন । তৈরি হওয়া অ্যাপ বান্ডেলের রুট-লেভেল ডিরেক্টরিতে এখন নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকবে:

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

    Gradle প্রতিটি AI প্যাকের জন্য ম্যানিফেস্ট তৈরি করে এবং আপনার জন্য 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 ফাইলে, Play AI Delivery Library-এর উপর একটি ডিপেন্ডেন্সি ঘোষণা করুন:

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

অবস্থা পরীক্ষা করুন

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

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

মনিটর ডাউনলোড অবস্থা

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ডাউনলোড অনুরোধটি 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;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

প্রয়োজনীয় পদক্ষেপগুলির সংক্ষিপ্ত বিবরণ

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

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

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

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

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

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

android.experimental.enableDeviceTargetingConfigApi=true

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

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

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

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

</config:device-targeting-config>

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

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

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

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

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

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

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

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

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

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

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

<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 Pixel 4a-এর জন্য, প্রস্তুতকারক হল "Google" এবং মডেল কোড হল "sunfish")।

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

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

  • সমর্থিত ডিভাইসগুলোর একটি CSV ফাইল ডাউনলোড করা এবং যথাক্রমে build_brandbuild_device ফিল্ডের জন্য প্রস্তুতকারক (Manufacturer)মডেল কোড (Model Code) ব্যবহার করা।

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

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

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

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

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

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

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

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

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

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

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

myCustomGroup1 অথবা myCustomGroup2 এর অন্তর্ভুক্ত ডিভাইসগুলিতে একটি ফিচার মডিউল পৌঁছে দিতে, সেটির AndroidManifest.xml পরিবর্তন করুন:

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

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

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

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

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

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

বান্ডলটুল

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

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

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

গুগল প্লে-তে পরীক্ষা ও প্রকাশ করুন

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

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

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

নমুনা অ্যাপটি ডাউনলোড করুন।

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

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