Play for On-device AI (बीटा वर्शन)

शुरुआती जानकारी

Play for On-device AI, कस्टम एमएल मॉडल डिस्ट्रिब्यूशन के लिए Android ऐप्लिकेशन बंडल और Google Play डिलीवरी के फ़ायदे देता है. इससे, डिवाइस के ईकोसिस्टम की जटिलता को कम करके, मॉडल की परफ़ॉर्मेंस को बेहतर बनाया जा सकता है. इसके लिए, आपको कोई अतिरिक्त शुल्क नहीं देना होगा. इसकी मदद से, Play पर एक ही आर्टफ़ैक्ट पब्लिश किया जा सकता है. इसमें आपका कोड, ऐसेट, और एमएल मॉडल शामिल होते हैं. साथ ही, डिलीवरी मोड और टारगेटिंग के कई विकल्पों में से किसी एक को चुना जा सकता है.

फ़ायदे

  • Google Play पर एक ही पब्लिशिंग आर्टफ़ैक्ट अपलोड करें. साथ ही, होस्टिंग, डिलीवरी, अपडेट, और टारगेटिंग की ज़िम्मेदारी Play को सौंपें. इसके लिए, आपको कोई अतिरिक्त शुल्क नहीं देना होगा.
  • अपने एमएल मॉडल को इंस्टॉल के समय, फ़ास्ट-फ़ॉलो या मांग पर उपलब्ध कराएं.
    • इंस्टॉल-टाइम डिलीवरी की सुविधा यह पक्का करती है कि जब आपका ऐप्लिकेशन खोला जाए, तब उसमें बहुत बड़ा मॉडल मौजूद हो. आपका मॉडल, APK के तौर पर इंस्टॉल किया जाएगा.
    • ऐप्लिकेशन इंस्टॉल हो जाने के बाद, फ़ास्ट-फ़ॉलो डिलीवरी की सुविधा बैकग्राउंड में अपने-आप काम करती है. ऐसा हो सकता है कि मॉडल पूरी तरह डाउनलोड होने से पहले ही उपयोगकर्ता आपका ऐप्लिकेशन खोल लें. आपका मॉडल, ऐप्लिकेशन के इंटरनल स्टोरेज में डाउनलोड हो जाएगा.
    • ऑन-डिमांड डिलीवरी की सुविधा की मदद से, रनटाइम के दौरान मॉडल का अनुरोध किया जा सकता है. यह सुविधा तब काम आती है, जब मॉडल की ज़रूरत सिर्फ़ कुछ उपयोगकर्ता फ़्लो के लिए होती है. आपका मॉडल, ऐप्लिकेशन के इंटरनल स्टोरेज में डाउनलोड किया जाएगा.
  • अपने एमएल मॉडल के ऐसे वैरिएंट उपलब्ध कराएं जो डिवाइस के मॉडल, सिस्टम प्रॉपर्टी या रैम के आधार पर, खास डिवाइसों को टारगेट करते हैं.
  • Play की ऑटोमैटिक पैचिंग की सुविधा का इस्तेमाल करके, ऐप्लिकेशन के अपडेट को छोटा और ऑप्टिमाइज़ रखें. इसका मतलब है कि सिर्फ़ फ़ाइलों में हुए बदलावों को डाउनलोड करने की ज़रूरत होती है.

ज़रूरी बातें

  • Play for On-device AI का इस्तेमाल करने का मतलब है कि आप Google Play Developer Distribution Agreement और Play Core Software Development Kit की सेवा की शर्तों में दी गई शर्तों से सहमत हैं.
  • Play से डाउनलोड किए गए ऑन-डिवाइस एआई मॉडल का इस्तेमाल सिर्फ़ आपके ऐप्लिकेशन को करना चाहिए. मॉडल को दूसरे ऐप्लिकेशन के साथ शेयर नहीं किया जाना चाहिए.
  • हर एआई पैक का साइज़ 1.5 जीबी तक हो सकता है. यह साइज़, कंप्रेस किए गए डाउनलोड साइज़ के आधार पर तय होता है. आपके ऐप्लिकेशन बंडल से जनरेट किए गए ऐप्लिकेशन के किसी भी वर्शन का कुल साइज़ 4 जीबी से ज़्यादा नहीं होना चाहिए.
  • जिन ऐप्लिकेशन का साइज़ 1 जीबी से ज़्यादा है उनके लिए, एसडीके का कम से कम लेवल 21 या इससे ज़्यादा होना चाहिए.

Play for On-device AI का इस्तेमाल कैसे करें

Play for On-device AI, एआई पैक का इस्तेमाल करता है. अपने ऐप्लिकेशन बंडल में, एआई पैक में डिस्ट्रिब्यूट करने के लिए तैयार कस्टम मॉडल पैकेज करें. आपके पास यह चुनने का विकल्प होता है कि एआई पैक को इंस्टॉल के समय, फ़ास्ट-फ़ॉलो या मांग पर उपलब्ध कराया जाए.

अपने ऐप्लिकेशन बंडल के साथ एआई पैक को पैकेज करके, Play के सभी मौजूदा टेस्टिंग और रिलीज़ टूल का इस्तेमाल किया जा सकता है. जैसे, टेस्ट ट्रैक और स्टेज किए गए रोलआउट. इससे, कस्टम मॉडल के साथ अपने ऐप्लिकेशन के डिस्ट्रिब्यूशन को मैनेज किया जा सकता है.

एआई पैक, ऐप्लिकेशन बाइनरी के साथ अपडेट किए जाते हैं. अगर ऐप्लिकेशन के नए वर्शन में एआई पैक में कोई बदलाव नहीं किया गया है, तो Play की ऑटोमैटिक पैचिंग की प्रोसेस यह पक्का करेगी कि उपयोगकर्ता को इसे फिर से डाउनलोड न करना पड़े. Play, ऐप्लिकेशन को अपडेट करते समय सिर्फ़ उन फ़ाइलों को डाउनलोड करेगा जिनमें बदलाव हुआ है.

एआई पैक में सिर्फ़ मॉडल होते हैं. Java/Kotlin और नेटिव लाइब्रेरी का इस्तेमाल नहीं किया जा सकता. अगर आपको एमएल मॉडल चलाने के लिए लाइब्रेरी या कोड शिप करने की ज़रूरत है, तो उसे बेस मॉड्यूल या सुविधा वाले मॉड्यूल में ले जाएं. आपके पास अपने फ़ीचर मॉड्यूल को कॉन्फ़िगर करने का विकल्प होता है, ताकि उसमें एआई पैक जैसी ही डाउनलोड और टारगेटिंग सेटिंग हों.

एआई पैक के साथ LiteRT और MediaPipe का इस्तेमाल करना

एआई पैक के साथ, LiteRT और MediaPipe का इस्तेमाल किया जा सकता है. अपने मॉडल को एआई पैक में पैकेज करें. इसके बाद, इंस्टॉल के समय उपलब्ध होने वाले पैक या ऐप्लिकेशन इंस्टॉल होने के बाद, खुद डिलीवर हो जाने वाले (फ़ास्ट-फ़ॉलो) और मांग पर उपलब्ध होने वाले (ऑन-डिमांड) पैक के निर्देशों का इस्तेमाल करके इसे ऐक्सेस करें.

इसके बारे में और पढ़ें:

एआई पैक का इस्तेमाल शुरू करना

Play for On-device AI का इस्तेमाल शुरू करने का तरीका यहां बताया गया है:

  1. अपने मॉडल को Android ऐप्लिकेशन बंडल में एआई पैक के तौर पर पैकेज करें. साथ ही, यह बताएं कि एआई पैक कैसे डिलीवर किए जाने चाहिए.
  2. [ज़रूरी नहीं] अगर आपको अलग-अलग डिवाइसों पर अलग-अलग मॉडल उपलब्ध कराने हैं, तो अपने एआई पैक के लिए डिवाइस टारगेटिंग कॉन्फ़िगर करें. उदाहरण के लिए, किसी खास डिवाइस मॉडल को एआई पैक A, कम से कम 6 जीबी रैम वाले डिवाइसों को एआई पैक B, और अन्य सभी डिवाइसों को कोई मॉडल नहीं दिया जा सकता.
  3. [ज़रूरी नहीं] अगर आपको मांग पर या तुरंत डिलीवरी की सुविधा का इस्तेमाल करना है, तो Play AI Delivery Library को अपने ऐप्लिकेशन में इंटिग्रेट करें. इससे, ज़रूरत के हिसाब से एआई पैक डाउनलोड किए जा सकेंगे.
  4. अपने ऐप्लिकेशन बंडल की जांच करें और उसे Google Play पर रिलीज़ करें.

Android Gradle प्लग इन का वर्शन देखना

एआई पैक का इस्तेमाल करने के लिए, पक्का करें कि आपके Android Gradle प्लगिन (एजीपी) का वर्शन कम से कम 8.8 हो. यह वर्शन, Android Studio Ladybug 2 के साथ पैकेज किया गया है.

अपने मॉडल को एआई पैक में एक्सट्रैक्ट करना

यहां बताया गया तरीका अपनाने के लिए, Android Studio की ज़रूरत नहीं है.

  1. अपने प्रोजेक्ट की टॉप-लेवल डायरेक्ट्री में, AI पैक के लिए एक डायरेक्ट्री बनाएं. इस डायरेक्ट्री के नाम का इस्तेमाल, एआई पैक के नाम के तौर पर किया जाता है. एआई पैक के नाम किसी अक्षर से शुरू होने चाहिए. साथ ही, उनमें सिर्फ़ अक्षर, संख्याएं, और अंडरस्कोर शामिल होने चाहिए.
  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. अपने मॉडल को लोड और चलाने के लिए कोड जोड़ें. इसे कैसे किया जाएगा, यह एआई पैक की डिलीवरी के मोड पर निर्भर करेगा. नीचे install-time और fast-follow/on-demand के निर्देश देखें.

  8. [ज़रूरी नहीं] अलग-अलग डिवाइसों पर अलग-अलग मॉडल उपलब्ध कराने के लिए, डिवाइस टारगेटिंग कॉन्फ़िगर करें.

  9. Gradle की मदद से Android ऐप्लिकेशन बंडल बनाएं. जनरेट किए गए ऐप्लिकेशन बंडल में, रूट-लेवल की डायरेक्ट्री में अब यह शामिल है:

    • ai-pack-name/manifest/AndroidManifest.xml: इससे एआई पैक के आइडेंटिफ़ायर और डिलीवरी मोड को कॉन्फ़िगर किया जाता है
    • ai-pack-name/assets/your-model-directories: यह डायरेक्ट्री, एआई पैक के हिस्से के तौर पर डिलीवर की गई सभी ऐसेट को सेव करती है

    Gradle, हर एआई पैक के लिए मेनिफ़ेस्ट जनरेट करता है और आपके लिए assets/ डाइरेक्ट्री आउटपुट करता है.

इंस्टॉल के समय डिलीवरी की सुविधा कॉन्फ़िगर करना

इंस्टॉल-टाइम के तौर पर कॉन्फ़िगर किए गए एआई पैक, ऐप्लिकेशन लॉन्च होने पर तुरंत उपलब्ध हो जाते हैं. इस मोड में दिखाए गए ऐसेट पैक को ऐक्सेस करने के लिए, 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");

फ़ास्ट-फ़ॉलो और मांग पर उपलब्ध डिलीवरी को कॉन्फ़िगर करना

तेज़ी से फ़ॉलो करने या मांग पर डिलीवरी की सुविधा के साथ एआई पैक डाउनलोड करने के लिए, Play AI Delivery Library का इस्तेमाल करें.

Play AI Delivery Library पर डिपेंडेंसी का एलान करना

अपने ऐप्लिकेशन की build.gradle फ़ाइल में, Play AI Delivery Library पर निर्भरता का एलान करें:

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() के साथ दिखाए गए डायलॉग को स्वीकार नहीं कर लेता. यह स्थिति तब हो सकती है, जब Play ऐप्लिकेशन को नहीं पहचानता. उदाहरण के लिए, अगर ऐप्लिकेशन को अलग से लोड किया गया हो. ध्यान दें कि इस मामले में 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 डायरेक्ट्री में सेव किए जाते हैं. assets डायरेक्ट्री का पाथ पाने के लिए, assetsPath() तरीके का इस्तेमाल किया जा सकता है. किसी ऐसेट का पाथ पाने के लिए, यह तरीका अपनाएं:

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

डिवाइस टारगेटिंग को कॉन्फ़िगर करना

डिवाइस टारगेटिंग से जुड़े निर्देशों का पालन करके, उन डिवाइसों या डिवाइसों के ग्रुप के बारे में बताया जा सकता है जिन्हें आपके एआई पैक मिलने चाहिए.

Play AI Delivery API के अन्य तरीके

यहां कुछ अन्य एपीआई तरीके दिए गए हैं, जिनका इस्तेमाल अपने ऐप्लिकेशन में किया जा सकता है.

अनुरोध रद्द करें

चालू एआई पैक के अनुरोध को रद्द करने के लिए, cancel() का इस्तेमाल करें. ध्यान दें कि यह अनुरोध, सबसे सही तरीके से किया गया अनुरोध है.

किसी एआई पैक को हटाना

एआई पैक को हटाने का शेड्यूल करने के लिए, removePack() का इस्तेमाल करें.

एक से ज़्यादा एआई पैक की लोकेशन पाना

getPackLocations() का इस्तेमाल करके, एक साथ कई एआई पैक के स्टेटस के बारे में क्वेरी करें. इससे आपको एआई पैक और उनकी जगहों का मैप मिलेगा. getPackLocations() से मिले मैप में, फ़िलहाल डाउनलोड किए गए और अप-टू-डेट हर पैक के लिए एक एंट्री होती है.

डिवाइस टारगेटिंग

डिवाइस टारगेटिंग की मदद से, यह कंट्रोल किया जा सकता है कि आपके ऐप्लिकेशन बंडल के कौनसे हिस्से, खास डिवाइसों पर डिलीवर किए जाएं. उदाहरण के लिए, यह पक्का किया जा सकता है कि बड़ा मॉडल सिर्फ़ ज़्यादा रैम वाले डिवाइसों पर डिलीवर हो. इसके अलावा, अलग-अलग डिवाइसों पर मॉडल के अलग-अलग वर्शन डिलीवर किए जा सकते हैं.

डिवाइस की प्रॉपर्टी को टारगेट किया जा सकता है. जैसे:

ज़रूरी चरणों के बारे में खास जानकारी

डिवाइस टारगेटिंग की सुविधा चालू करने के लिए, यह तरीका अपनाएं:

  1. एक्सएमएल फ़ाइल में अपने डिवाइस ग्रुप तय करें.
  2. यह तय करें कि आपके बंडल के कौनसे हिस्से को किस डिवाइस ग्रुप में शामिल किया जाना चाहिए.
  3. [ज़रूरी नहीं] अपने कॉन्फ़िगरेशन की स्थानीय तौर पर जांच करें.
  4. Google Play पर, अपना बंडल (जिसमें एक्सएमएल फ़ाइल शामिल है) अपलोड करें.

Android Gradle प्लग इन का वर्शन देखना

डिवाइस टारगेटिंग का इस्तेमाल करने के लिए, पक्का करें कि आपके Android Gradle प्लगिन (एजीपी) का वर्शन कम से कम 8.10.0 हो. यह Android Studio (Meerkat 2 और उसके बाद के वर्शन) के साथ पैकेज किया गया है. Android Studio का स्टेबल वर्शन डाउनलोड करें.

Android Gradle प्लग इन में इस सुविधा को चालू करना

आपकी gradle.properties फ़ाइल में, डिवाइस टारगेटिंग की सुविधा साफ़ तौर पर चालू होनी चाहिए:

android.experimental.enableDeviceTargetingConfigApi=true

डिवाइस टारगेटिंग कॉन्फ़िगरेशन की एक्सएमएल फ़ाइल बनाना

डिवाइस टारगेटिंग कॉन्फ़िगरेशन फ़ाइल एक एक्सएमएल फ़ाइल होती है. इसमें, कस्टम डिवाइस ग्रुप तय किए जाते हैं. उदाहरण के लिए, 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>

डिवाइस ग्रुप में ज़्यादा से ज़्यादा पांच डिवाइस सिलेक्टर होते हैं. किसी डिवाइस को डिवाइस ग्रुप में तब शामिल किया जाता है, जब वह डिवाइस सिलेक्टर की किसी भी शर्त को पूरा करता हो.

डिवाइस चुनने के लिए उपलब्ध विकल्प में एक या उससे ज़्यादा डिवाइस प्रॉपर्टी हो सकती हैं. किसी डिवाइस को तब चुना जाता है, जब वह सिलेक्टर की सभी डिवाइस प्रॉपर्टी से मेल खाता हो.

अगर कोई डिवाइस एक से ज़्यादा ग्रुप से मैच होता है, तो उसे उस ग्रुप का कॉन्टेंट दिखाया जाएगा जिसे एक्सएमएल फ़ाइल में सबसे पहले तय किया गया है. एक्सएमएल फ़ाइल में ग्रुप तय करने का क्रम, प्राथमिकता का क्रम होता है.

अगर कोई डिवाइस किसी भी ग्रुप से मैच नहीं करता है, तो उसे डिफ़ॉल्ट "अन्य" ग्रुप में शामिल किया जाएगा. यह ग्रुप अपने-आप जनरेट होता है. इसे साफ़ तौर पर तय नहीं किया जाना चाहिए.

डिवाइस की उपलब्ध प्रॉपर्टी

  • device_ram: डिवाइस के रैम से जुड़ी ज़रूरी शर्तें
    • min_bytes (inclusive): कम से कम ज़रूरी रैम (बाइट में)
    • max_bytes (exclusive): ज़्यादा से ज़्यादा ज़रूरी रैम (बाइट में)
  • included_device_ids: इस सिलेक्टर में शामिल किए जाने वाले डिवाइस मॉडल (हर ग्रुप के लिए ज़्यादा से ज़्यादा 10,000 device_id). अगर डिवाइस, सूची में मौजूद किसी भी device_id से मेल खाता है, तो यह प्रॉपर्टी पूरी होती है.
    • build_brand: डिवाइस बनाने वाली कंपनी
    • build_device: डिवाइस के मॉडल का कोड
  • excluded_device_ids: इस सिलेक्टर में शामिल नहीं किए जाने वाले डिवाइस मॉडल (हर ग्रुप के लिए ज़्यादा से ज़्यादा 10,000 device_id). यह प्रॉपर्टी तब पूरी होती है, जब डिवाइस का device_id, सूची में मौजूद किसी भी device_id से मेल न खाए.
    • build_brand: डिवाइस बनाने वाली कंपनी
    • build_device: डिवाइस के मॉडल का कोड
  • required_system_features: ऐसी सुविधाएं जो किसी डिवाइस में होनी चाहिए, ताकि उसे इस सिलेक्टर में शामिल किया जा सके (हर ग्रुप में ज़्यादा से ज़्यादा 100 सुविधाएं). इस प्रॉपर्टी की ज़रूरी शर्तें पूरी करने के लिए, डिवाइस में इस सूची में दी गई सभी सिस्टम सुविधाएं होनी चाहिए.

    सिस्टम की सुविधा के बारे में जानकारी

    • name: सिस्टम की सुविधा
  • forbidden_system_features: ऐसी सुविधाएं जो किसी डिवाइस में नहीं होनी चाहिए, ताकि उसे इस सिलेक्टर में शामिल किया जा सके (हर ग्रुप के लिए ज़्यादा से ज़्यादा 100 सुविधाएं). अगर किसी डिवाइस में इस सूची में दी गई कोई भी सिस्टम सुविधा है, तो इसका मतलब है कि वह इस प्रॉपर्टी की ज़रूरी शर्तें पूरी नहीं करता.

    सिस्टम की सुविधा के बारे में जानकारी

    • name: सिस्टम की सुविधा
  • system-on-chip: इस सिलेक्टर में शामिल किए जाने वाले सिस्टम ऑन चिप. इस प्रॉपर्टी की वैल्यू के तौर पर, इस सूची में मौजूद किसी भी चिप का इस्तेमाल किया जा सकता है.

यहां सभी संभावित डिवाइस प्रॉपर्टी दिखाने वाला उदाहरण दिया गया है:

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

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

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

</config:device-targeting-config>

डिवाइस बनाने वाली कंपनी और डिवाइस के मॉडल के आधिकारिक कोड

Google Play Console पर डिवाइस कैटलॉग का इस्तेमाल करके, डिवाइस के मैन्युफ़ैक्चरर और मॉडल कोड के लिए सही फ़ॉर्मैटिंग देखी जा सकती है. इसके लिए, इनमें से कोई एक तरीका अपनाएं:

  • डिवाइस कैटलॉग का इस्तेमाल करके, अलग-अलग डिवाइसों की जांच करना. साथ ही, नीचे दिए गए उदाहरण में दिखाए गए स्थानों पर मैन्युफ़ैक्चरर और मॉडल कोड ढूंढना (Google Pixel 4a के लिए, मैन्युफ़ैक्चरर "Google" है और मॉडल कोड "sunfish" है)'

    डिवाइस कैटलॉग में Pixel 4a का पेज

    डिवाइस कैटलॉग में Pixel 4a का पेज

  • साथ ही, build_brand और build_device फ़ील्ड के लिए, मैन्युफ़ैक्चरर और मॉडल कोड का इस्तेमाल करके, काम करने वाले डिवाइसों की 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, डिवाइस ग्रुप के हिसाब से अलग-अलग हों.

एआई पैक के लिए डिवाइस टारगेटिंग का इस्तेमाल करना

डिवाइसों पर साइज़ को ऑप्टिमाइज़ किया जा सकता है. इसके लिए, बड़े मॉडल सिर्फ़ उन डिवाइसों पर डिलीवर करें जिन पर उन्हें चलाया जा सकता है.

डिवाइस ग्रुप के हिसाब से अपने एआई पैक को सबडिवाइड करें. इसके लिए, पिछले चरण में बनाई गई मौजूदा एआई पैक डायरेक्ट्री लें. इसके बाद, #group_myCustomGroup1, #group_myCustomGroup2 वगैरह के साथ सही फ़ोल्डर (नीचे दिए गए तरीके से) पोस्ट-फ़िक्स करें. अपने ऐप्लिकेशन में एआई पैक का इस्तेमाल करते समय, आपको पोस्टफ़िक्स के हिसाब से फ़ोल्डर को ऐक्सेस करने की ज़रूरत नहीं होगी. दूसरे शब्दों में कहें, तो बिल्ड प्रोसेस के दौरान पोस्टफ़िक्स अपने-आप हट जाता है.

पिछले चरण के बाद, यह कुछ ऐसा दिख सकता है:

...
.../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 का इस्तेमाल करके, स्थानीय तौर पर टेस्ट किया जा सकता है.

अंदरूनी तौर पर ऐप्लिकेशन शेयर करना

संगठन में काम करने वालों के साथ ऐप्लिकेशन शेयर करने की सुविधा की मदद से, ऐप्लिकेशन बंडल का इस्तेमाल करके तुरंत एक यूआरएल जनरेट किया जा सकता है. इस यूआरएल पर किसी लोकल डिवाइस पर टैप करके, ठीक वही ऐप्लिकेशन इंस्टॉल किया जा सकता है जो 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
    

bundletool की मदद से स्थानीय तौर पर टेस्टिंग करने की सीमाएं

bundletool की मदद से स्थानीय तौर पर टेस्टिंग करने से जुड़ी ये सीमाएं हैं:

  • fast-follow पैक, on-demand पैक की तरह काम करते हैं. इसका मतलब है कि ऐप्लिकेशन को साइडलोड करने पर, ये अपने-आप फ़ेच नहीं होंगे. ऐप्लिकेशन शुरू होने पर, डेवलपर को मैन्युअल तरीके से अनुरोध करना होगा. इसके लिए, आपके ऐप्लिकेशन के कोड में कोई बदलाव करने की ज़रूरत नहीं है.
  • पैक, Play के बजाय बाहरी स्टोरेज से फ़ेच किए जाते हैं. इसलिए, यह टेस्ट नहीं किया जा सकता कि नेटवर्क की गड़बड़ियों के मामले में आपका कोड कैसा काम करता है.
  • लोकल टेस्टिंग में, वाई-फ़ाई के उपलब्ध होने का इंतज़ार करने की सुविधा शामिल नहीं होती.
  • अपडेट नहीं किए जा सकते. अपनी बिल्ड का नया वर्शन इंस्टॉल करने से पहले, पिछले वर्शन को मैन्युअल तरीके से अनइंस्टॉल करें.

पुष्टि करें कि सही APK इंस्टॉल किए जा रहे हैं

यह पक्का करने के लिए कि डिवाइस पर सिर्फ़ सही APK इंस्टॉल किए गए हैं, यह तरीका अपनाएं

adb shell pm path {packageName}

आपको इस तरह की विंडो दिखेगी:

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

ध्यान दें कि आपको इस सूची में सिर्फ़ वे APK दिखेंगे जो सुविधा मॉड्यूल और इंस्टॉल के समय डिलीवरी देने वाले एआई पैक से बनाए गए हैं. मांग पर उपलब्ध और तेज़ी से काम करने वाले एआई पैक, APK के तौर पर इंस्टॉल नहीं होते हैं.

Google Play पर ऐप्लिकेशन की जांच करना और उसे रिलीज़ करना

हमारा सुझाव है कि Google Play पर अपने ऐप्लिकेशन को पूरी तरह से टेस्ट करें. इसके लिए, इंटरनल टेस्ट ट्रैक का इस्तेमाल करें.

ऐसा करने के बाद, कुछ लोगों के लिए रिलीज़ करने की सुविधा का इस्तेमाल करके, अपने ऐप्लिकेशन के अपडेट को प्रोडक्शन ट्रैक पर धीरे-धीरे रिलीज़ किया जा सकता है.

Play for On-device AI का इस्तेमाल करने वाले ऐप्लिकेशन का उदाहरण

सैंपल ऐप्लिकेशन डाउनलोड करें.

इसमें, डिलीवरी के हर मोड के साथ-साथ डिवाइस टारगेटिंग कॉन्फ़िगरेशन का इस्तेमाल करने का तरीका बताया गया है. शुरू करने के लिए, स्थानीय टेस्टिंग सेक्शन देखें.

Android ऐप्लिकेशन बंडल के बारे में ज़्यादा जानें. साथ ही, AI Delivery SDK के रेफ़रंस पढ़ें.