Play Feature Delivery के बारे में खास जानकारी

Google Play का ऐप्लिकेशन डिलीवरी मॉडल, हर उपयोगकर्ता के डिवाइस कॉन्फ़िगरेशन के हिसाब से ऑप्टिमाइज़ किए गए APKs जनरेट करने और उन्हें डिलीवर करने के लिए, Android ऐप्लिकेशन बंडल का इस्तेमाल करता है. इससे, उपयोगकर्ता सिर्फ़ उस कोड और संसाधनों को डाउनलोड करते हैं जिनकी उन्हें आपका ऐप्लिकेशन चलाने के लिए ज़रूरत होती है.

Play Feature Delivery, ऐप्लिकेशन बंडल की बेहतर सुविधाओं का इस्तेमाल करता है. इससे आपके ऐप्लिकेशन की कुछ सुविधाओं को किसी शर्त के साथ डिलीवर किया जा सकता है या मांगने पर डाउनलोड किया जा सकता है. इसके लिए, आपको इन सुविधाओं को अपने मुख्य ऐप्लिकेशन से अलग करके, फ़ीचर मॉड्यूल में रखना होगा.

फ़ीचर मॉड्यूल का बिल्ड कॉन्फ़िगरेशन

Android Studio का इस्तेमाल करके नया फ़ीचर मॉड्यूल बनाते समय, IDE मॉड्यूल की build.gradle फ़ाइल में यह Gradle प्लगइन लागू करता है.

// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.

plugins {
  id 'com.android.dynamic-feature'
}

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

फ़ीचर मॉड्यूल के बिल्ड कॉन्फ़िगरेशन में क्या शामिल नहीं करना चाहिए

हर सुविधा मॉड्यूल, बुनियादी मॉड्यूल पर निर्भर करता है. इसलिए, यह कुछ कॉन्फ़िगरेशन को भी इनहेरिट करता है. इसलिए, आपको फ़ीचर मॉड्यूल की build.gradle फ़ाइल में यह जानकारी शामिल नहीं करनी चाहिए:

  • साइनिंग कॉन्फ़िगरेशन: ऐप्लिकेशन बंडलों को साइन करने के लिए, साइनिंग कॉन्फ़िगरेशन का इस्तेमाल किया जाता है. ये कॉन्फ़िगरेशन, बेस मॉड्यूल में तय किए जाते हैं.
  • minifyEnabled प्रॉपर्टी: आपके पास पूरे ऐप्लिकेशन प्रोजेक्ट के लिए, सिर्फ़ बुनियादी मॉड्यूल के बिल्ड कॉन्फ़िगरेशन से कोड छोटा करने की सुविधा चालू करने का विकल्प होता है. इसलिए, आपको इस प्रॉपर्टी को फ़ीचर मॉड्यूल से हटा देना चाहिए. हालांकि, हर सुविधा मॉड्यूल के लिए, ProGuard के अतिरिक्त नियम तय किए जा सकते हैं.
  • versionCode और versionName: ऐप्लिकेशन बंडल बनाते समय, Gradle, ऐप्लिकेशन के वर्शन की उस जानकारी का इस्तेमाल करता है जो बेस मॉड्यूल देता है. आपको इन प्रॉपर्टी को अपने फ़ीचर मॉड्यूल की build.gradle फ़ाइल से हटाना होगा.

बेस मॉड्यूल से संबंध जोड़ना

Android Studio, फ़ीचर मॉड्यूल बनाते समय उसे बेस मॉड्यूल में दिखाता है. इसके लिए, वह बेस मॉड्यूल की build.gradle फ़ाइल में android.dynamicFeatures प्रॉपर्टी जोड़ता है. इसे नीचे दिखाया गया है:

// In the base module’s build.gradle file.
android {
    ...
    // Specifies feature modules that have a dependency on
    // this base module.
    dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}

इसके अलावा, Android Studio में बेस मॉड्यूल को फ़ीचर मॉड्यूल की डिपेंडेंसी के तौर पर शामिल किया जाता है. इसे यहां दिखाया गया है:

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

ProGuard के अतिरिक्त नियम तय करना

हालांकि, आपके ऐप्लिकेशन प्रोजेक्ट के लिए, सिर्फ़ बेस मॉड्यूल के बिल्ड कॉन्फ़िगरेशन में कोड छोटा करने की सुविधा चालू की जा सकती है. हालांकि, proguardFiles प्रॉपर्टी का इस्तेमाल करके, हर फ़ीचर मॉड्यूल के लिए कस्टम ProGuard नियम दिए जा सकते हैं. इसके बारे में यहां बताया गया है.

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

ध्यान दें कि ProGuard के ये नियम, बिल्ड के समय अन्य मॉड्यूल (बेसिक मॉड्यूल भी शामिल है) के नियमों के साथ मर्ज हो जाते हैं. इसलिए, हर सुविधा मॉड्यूल नियमों का नया सेट तय कर सकता है. हालांकि, ये नियम ऐप्लिकेशन प्रोजेक्ट के सभी मॉड्यूल पर लागू होते हैं.

अपना ऐप्लिकेशन डिप्लॉय करना

सुविधा मॉड्यूल के साथ काम करने वाला ऐप्लिकेशन डेवलप करते समय, कनेक्ट किए गए डिवाइस पर ऐप्लिकेशन को आम तौर पर डिप्लॉय किया जा सकता है. इसके लिए, मेन्यू बार में जाकर Run > Run को चुनें. इसके अलावा, टूलबार में मौजूद Run पर क्लिक करके भी ऐप्लिकेशन को डिप्लॉय किया जा सकता है.

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

  1. मेन्यू बार में, चलाएं > कॉन्फ़िगरेशन में बदलाव करें को चुनें.
  2. रन/डीबग कॉन्फ़िगरेशन डायलॉग के बाएं पैनल में, अपनी पसंद का Android ऐप्लिकेशन कॉन्फ़िगरेशन चुनें.
  3. सामान्य टैब में, डाइनैमिक फ़ीचर डिप्लॉय करें में जाकर, हर उस फ़ीचर मॉड्यूल के बगल में मौजूद बॉक्स को चुनें जिसे आपको अपना ऐप्लिकेशन डिप्लॉय करते समय शामिल करना है.
  4. ठीक है पर क्लिक करें.

डिफ़ॉल्ट रूप से, Android Studio आपके ऐप्लिकेशन को डिप्लॉय करने के लिए, ऐप्लिकेशन बंडल का इस्तेमाल नहीं करता. इसके बजाय, IDE आपके डिवाइस पर ऐसे APK बनाता है और उन्हें इंस्टॉल करता है जिन्हें डिप्लॉयमेंट की स्पीड के लिए ऑप्टिमाइज़ किया गया है. ये APK, APK के साइज़ के हिसाब से ऑप्टिमाइज़ नहीं किए जाते. Android Studio को कॉन्फ़िगर करने के लिए, ऐप्लिकेशन बंडल से APK और इंस्टैंट ऐप्लिकेशन बनाएं और उन्हें डिप्लॉय करें. इसके लिए, रन/डीबग कॉन्फ़िगरेशन में बदलाव करें.

पसंद के मुताबिक डिलीवरी के लिए, सुविधा वाले मॉड्यूल इस्तेमाल करना

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

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

मान लें कि आपके पास एक ऐसा ऐप्लिकेशन है जो लोगों को ऑनलाइन मार्केटप्लेस में सामान खरीदने और बेचने की सुविधा देता है. ऐप्लिकेशन की इन सुविधाओं को अलग-अलग फ़ीचर मॉड्यूल में बांटा जा सकता है:

  • खाते में लॉगिन करने और खाता बनाने से जुड़ी समस्याएं
  • मार्केटप्लेस ब्राउज़ करना
  • बिक्री के लिए कोई आइटम पोस्ट करना
  • पेमेंट प्रोसेस किए जा रहे हैं

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

डिलीवरी का विकल्प व्यवहार इस्तेमाल के उदाहरण का सैंपल शुरू करना
ऐप्लिकेशन इंस्टॉल करते समय डिलीवरी जिन सुविधा वाले मॉड्यूल के लिए, ऊपर बताए गए डिलीवरी के किसी भी विकल्प को कॉन्फ़िगर नहीं किया जाता उन्हें डिफ़ॉल्ट रूप से, ऐप्लिकेशन इंस्टॉल करते समय डाउनलोड किया जाता है. यह एक अहम सुविधा है, क्योंकि इसका मतलब है कि आपके पास अडवांस डिलीवरी के विकल्पों को धीरे-धीरे अपनाने का विकल्प है. उदाहरण के लिए, ऐप्लिकेशन की सुविधाओं को मॉड्यूलर बनाने से आपको फ़ायदा मिल सकता है. साथ ही, Play Feature Delivery Library का इस्तेमाल करके, मांग पर डाउनलोड करने की सुविधा को पूरी तरह से लागू करने के बाद ही, मांग पर डिलीवरी की सुविधा चालू की जा सकती है.

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

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

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

ऐसे फ़ीचर मॉड्यूल का इस्तेमाल करके अपने ऐप्लिकेशन को मॉड्यूलर बनाएं जो डिलीवरी के ऐडवांस विकल्पों को कॉन्फ़िगर नहीं करते हैं.

अगर आपको अपने ऐप्लिकेशन के इंस्टॉल किए गए साइज़ को कम करना है, तो कुछ ऐसे फ़ीचर मॉड्यूल हटाएं जिनकी अब उपयोगकर्ता को ज़रूरत नहीं है. इसके लिए, इंस्टॉल किए गए मॉड्यूल मैनेज करें लेख पढ़ें.

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

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

एक फ़ीचर मॉड्यूल बनाएं और मांग पर डिलीवरी की सुविधा कॉन्फ़िगर करें. इसके बाद, आपका ऐप्लिकेशन Play Feature Delivery Library का इस्तेमाल करके, ज़रूरत के हिसाब से मॉड्यूल डाउनलोड करने का अनुरोध कर सकता है.
शर्तों के हिसाब से डिलीवरी इसकी मदद से, उपयोगकर्ता के डिवाइस के लिए कुछ ज़रूरी शर्तें तय की जा सकती हैं. जैसे, हार्डवेयर की सुविधाएँ, स्थान-भाषा, और कम से कम एपीआई लेवल. इससे यह तय किया जा सकता है कि ऐप्लिकेशन इंस्टॉल करते समय, मॉड्यूलर फ़ीचर डाउनलोड की गई है या नहीं. अगर मार्केटप्लेस ऐप्लिकेशन दुनिया भर में उपलब्ध है, तो आपको पेमेंट के उन तरीकों के लिए सहायता देनी पड़ सकती है जो सिर्फ़ कुछ देशों या इलाकों में लोकप्रिय हैं. ऐप्लिकेशन के शुरुआती डाउनलोड साइज़ को कम करने के लिए, पेमेंट के कुछ तरीकों को प्रोसेस करने के लिए अलग-अलग फ़ीचर मॉड्यूल बनाए जा सकते हैं. साथ ही, उन्हें उपयोगकर्ता के डिवाइस पर, रजिस्टर किए गए स्थान-भाषा के आधार पर इंस्टॉल किया जा सकता है. सुविधा वाला मॉड्यूल बनाएं और शर्त के हिसाब से डिलीवरी की सुविधा कॉन्फ़िगर करें.
तुरंत डिलीवरी Google Play झटपट की सुविधा की मदद से, लोग आपके ऐप्लिकेशन को अपने डिवाइस पर इंस्टॉल किए बिना ही उसका इस्तेमाल कर सकते हैं. इसके बजाय, वे Google Play Store पर मौजूद "अभी आज़माएं" बटन या आपके बनाए गए यूआरएल के ज़रिए, आपके ऐप्लिकेशन को आज़मा सकते हैं. इस तरह से कॉन्टेंट डिलीवर करने से, आपको अपने ऐप्लिकेशन के साथ लोगों का जुड़ाव बढ़ाने में आसानी होती है.

झटपट डिलीवरी की सुविधा की मदद से, Google Play Instant का इस्तेमाल किया जा सकता है. इससे, उपयोगकर्ताओं को ऐप्लिकेशन इंस्टॉल किए बिना ही, उसकी कुछ सुविधाओं का तुरंत अनुभव मिल सकता है.

ऐसे गेम के बारे में सोचें जिसमें गेम के शुरुआती कुछ लेवल, लाइटवेट फ़ीचर मॉड्यूल में शामिल हों. उस मॉड्यूल को तुरंत चालू किया जा सकता है, ताकि उपयोगकर्ता ऐप्लिकेशन इंस्टॉल किए बिना, यूआरएल लिंक या “अभी आज़माएं" बटन के ज़रिए गेम को तुरंत आज़मा सकें. कोई फ़ीचर मॉड्यूल बनाएं और तुरंत डिलीवरी की सुविधा कॉन्फ़िगर करें. इसके बाद, आपका ऐप्लिकेशन Play Feature Delivery Library का इस्तेमाल करके, ज़रूरत के हिसाब से मॉड्यूल डाउनलोड करने का अनुरोध कर सकता है.

ध्यान रखें कि फ़ीचर मॉड्यूल का इस्तेमाल करके, ऐप्लिकेशन की सुविधाओं को मॉड्यूलर बनाना सिर्फ़ पहला चरण है. Google Play Instant की सुविधा के लिए, आपके ऐप्लिकेशन के बेस मॉड्यूल और झटपट ऐक्सेस की सुविधा वाले किसी फ़ीचर का डाउनलोड साइज़, तय की गई सीमाओं के दायरे में होना चाहिए. ज़्यादा जानने के लिए, ऐप्लिकेशन या गेम का साइज़ कम करके इंस्टैंट एक्सपीरियंस की सुविधा चालू करना लेख पढ़ें.

किसी संसाधन के लिए यूआरआई बनाना

अगर आपको यूआरआई का इस्तेमाल करके, किसी फ़ीचर मॉड्यूल में सेव किए गए रिसॉर्स को ऐक्सेस करना है, तो Uri.Builder() का इस्तेमाल करके, फ़ीचर मॉड्यूल के रिसॉर्स यूआरआई को जनरेट करने का तरीका यहां बताया गया है:

Kotlin

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build()

Java

String uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build().toString();

संसाधन के पाथ का हर हिस्सा रन टाइम पर बनाया जाता है. इससे यह पक्का होता है कि स्प्लिट किए गए APK लोड होने के बाद, सही नेमस्पेस जनरेट हो.

यूआरआई जनरेट होने के तरीके के उदाहरण के तौर पर, मान लें कि आपके पास एक ऐप्लिकेशन और इन नामों वाले फ़ीचर मॉड्यूल हैं:

  • ऐप्लिकेशन के पैकेज का नाम: com.example.my_app_package
  • सुविधा के संसाधनों के पैकेज का नाम: com.example.my_app_package.my_dynamic_feature

अगर ऊपर दिए गए कोड स्निपेट में मौजूद resId, आपके फ़ीचर मॉड्यूल में “my_video” नाम की रॉ फ़ाइल रिसॉर्स को दिखाता है, तो ऊपर दिया गया Uri.Builder() कोड यह आउटपुट देगा:

android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video

इसके बाद, आपका ऐप्लिकेशन इस यूआरआई का इस्तेमाल करके, फ़ीचर मॉड्यूल के संसाधन को ऐक्सेस कर सकता है.

अपने यूआरआई में मौजूद पाथ की पुष्टि करने के लिए, APK Analyzer का इस्तेमाल किया जा सकता है. इससे, अपने फ़ीचर मॉड्यूल APK की जांच की जा सकती है और पैकेज का नाम पता लगाया जा सकता है:

APK Analyzer का स्क्रीनशॉट. इसमें कंपाइल की गई संसाधन फ़ाइल के कॉन्टेंट की जांच की जा रही है.
पहली इमेज. संकलित रिसॉर्स फ़ाइल में पैकेज का नाम देखने के लिए, APK Analyzer का इस्तेमाल करें.

फ़ीचर मॉड्यूल के लिए ध्यान देने वाली बातें

फ़ीचर मॉड्यूल की मदद से, बिल्ड की स्पीड और इंजीनियरिंग वेलोसिटी को बेहतर बनाया जा सकता है. साथ ही, ऐप्लिकेशन के साइज़ को कम करने के लिए, ऐप्लिकेशन की सुविधाओं को अपनी पसंद के मुताबिक बनाया जा सकता है. हालांकि, फ़ीचर मॉड्यूल का इस्तेमाल करते समय, कुछ सीमाओं और खास मामलों का ध्यान रखना ज़रूरी है:

  • किसी एक डिवाइस पर, शर्त के साथ या मांग पर डिलीवरी के ज़रिए 50 या इससे ज़्यादा सुविधा वाले मॉड्यूल इंस्टॉल करने से, परफ़ॉर्मेंस से जुड़ी समस्याएं आ सकती हैं. इंस्टॉल के समय डिलीवरी देने वाले ऐसे मॉड्यूल जिन्हें हटाने के लिए कॉन्फ़िगर नहीं किया गया है वे बेस मॉड्यूल में अपने-आप शामिल हो जाते हैं. साथ ही, हर डिवाइस पर उन्हें सिर्फ़ एक फ़ीचर मॉड्यूल के तौर पर गिना जाता है.
  • इंस्टॉल-टाइम डिलीवरी के लिए, हटाए जा सकने वाले मॉड्यूल की संख्या को 10 या उससे कम पर सेट करें. ऐसा न करने पर, ऐप्लिकेशन को डाउनलोड और इंस्टॉल करने में ज़्यादा समय लग सकता है.
  • Android 5.0 (एपीआई लेवल 21) और इसके बाद के वर्शन पर चलने वाले डिवाइसों पर ही, मांग पर डाउनलोड और इंस्टॉल करने की सुविधाएं काम करती हैं. अपनी सुविधा को Android के पुराने वर्शन पर उपलब्ध कराने के लिए, सुविधा मॉड्यूल बनाते समय फ़्यूज़िंग को चालू करें.
  • SplitCompat को चालू करें, ताकि आपके ऐप्लिकेशन के पास डाउनलोड किए गए फ़ीचर मॉड्यूल का ऐक्सेस हो. ये मॉड्यूल, मांग पर डिलीवर किए जाते हैं.
  • सुविधा वाले मॉड्यूल को अपने मेनिफ़ेस्ट में ऐसी गतिविधियां नहीं बतानी चाहिए जिनके लिए android:exported को true पर सेट किया गया हो. ऐसा इसलिए होता है, क्योंकि इस बात की कोई गारंटी नहीं होती कि जब कोई दूसरा ऐप्लिकेशन गतिविधि लॉन्च करने की कोशिश करता है, तब डिवाइस ने सुविधा मॉड्यूल डाउनलोड कर लिया हो. इसके अलावा, आपके ऐप्लिकेशन को यह पुष्टि करनी चाहिए कि किसी सुविधा के कोड और संसाधनों को ऐक्सेस करने से पहले, उसे डाउनलोड किया गया है. ज़्यादा जानने के लिए, इंस्टॉल किए गए मॉड्यूल मैनेज करना लेख पढ़ें.
  • Play Feature Delivery के लिए, आपको ऐप्लिकेशन बंडल का इस्तेमाल करके अपना ऐप्लिकेशन पब्लिश करना होगा. इसलिए, पक्का करें कि आपको ऐप्लिकेशन बंडल की जानी-पहचानी समस्याओं के बारे में पता हो.

फ़ीचर मॉड्यूल के मेनिफ़ेस्ट का रेफ़रंस

Android Studio का इस्तेमाल करके नया फ़ीचर मॉड्यूल बनाते समय, IDE में ज़्यादातर मेनिफ़ेस्ट एट्रिब्यूट शामिल होते हैं. ये एट्रिब्यूट, मॉड्यूल को फ़ीचर मॉड्यूल की तरह काम करने के लिए ज़रूरी होते हैं. इसके अलावा, कुछ एट्रिब्यूट को कंपाइल करने के समय, बिल्ड सिस्टम अपने-आप जोड़ देता है. इसलिए, आपको उन्हें खुद से तय करने या उनमें बदलाव करने की ज़रूरत नहीं होती. यहां दी गई टेबल में, मेनिफ़ेस्ट एट्रिब्यूट के बारे में बताया गया है. ये एट्रिब्यूट, फ़ीचर मॉड्यूल के लिए ज़रूरी होते हैं.

एट्रिब्यूट ब्यौरा
<manifest यह एक सामान्य <manifest> ब्लॉक है.
xmlns:dist="http://schemas.android.com/apk/distribution" यह एक नया dist: एक्सएमएल नेमस्पेस तय करता है. इसके बारे में यहां बताया गया है.
split="split_name" Android Studio, आपके ऐप्लिकेशन बंडल को बनाते समय इस एट्रिब्यूट को शामिल करता है. इसलिए, आपको इस एट्रिब्यूट की वैल्यू खुद से शामिल या उसमें बदलाव नहीं करना चाहिए.

यह मॉड्यूल का नाम तय करता है. Play Feature Delivery Library का इस्तेमाल करके, मांग पर उपलब्ध मॉड्यूल का अनुरोध करते समय, आपका ऐप्लिकेशन इस नाम को तय करता है.

Gradle इस एट्रिब्यूट की वैल्यू कैसे तय करता है:

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

ऐप्लिकेशन बंडल बनाते समय, Gradle सबप्रोजेक्ट पाथ के आखिरी एलिमेंट का इस्तेमाल करता है. इससे वह इस मेनिफ़ेस्ट एट्रिब्यूट को मॉड्यूल के मेनिफ़ेस्ट में जोड़ पाता है. उदाहरण के लिए, अगर आपने MyAppProject/features/ डायरेक्ट्री में कोई नया फ़ीचर मॉड्यूल बनाया है और उसके मॉड्यूल का नाम "dynamic_feature1" के तौर पर तय किया है, तो IDE आपकी settings.gradle फ़ाइल में ':features:dynamic_feature1' को सबप्रोजेक्ट के तौर पर जोड़ता है. ऐप्लिकेशन बंडल बनाते समय, Gradle, मॉड्यूल के मेनिफ़ेस्ट में <manifest split="dynamic_feature1"> को इंजेक्ट करता है.

android:isFeatureSplit="true | false"> Android Studio, आपके ऐप्लिकेशन बंडल को बनाते समय, इस एट्रिब्यूट को शामिल करता है. इसलिए, आपको इस एट्रिब्यूट को मैन्युअल तरीके से शामिल नहीं करना चाहिए या इसमें बदलाव नहीं करना चाहिए.

इससे पता चलता है कि यह मॉड्यूल, एक फ़ीचर मॉड्यूल है. बेस मॉड्यूल और कॉन्फ़िगरेशन APK के मेनिफ़ेस्ट में, इस एट्रिब्यूट को शामिल नहीं किया जाता या इसे false पर सेट किया जाता है.

<dist:module ऐसे एट्रिब्यूट तय करता है जिनसे यह तय होता है कि मॉड्यूल को कैसे पैकेज किया जाए और APK के तौर पर कैसे डिस्ट्रिब्यूट किया जाए.
dist:instant="true | false" इससे यह तय होता है कि मॉड्यूल को Google Play Instant के ज़रिए, इंस्टैंट ऐप्लिकेशन के तौर पर उपलब्ध कराया जाना चाहिए या नहीं.

अगर आपके ऐप्लिकेशन में एक या उससे ज़्यादा ऐसे सुविधा मॉड्यूल शामिल हैं जिन्हें झटपट ऐक्सेस किया जा सकता है, तो आपको बेस मॉड्यूल को भी झटपट ऐक्सेस करने की सुविधा देनी होगी. Android Studio 3.5 या इसके बाद के वर्शन का इस्तेमाल करने पर, इंस्टेंट ऐप्लिकेशन की सुविधा वाला फ़ीचर मॉड्यूल बनाने के दौरान, IDE यह काम अपने-आप कर देता है.

<dist:on-demand/> को सेट करते समय, इस एक्सएमएल एलिमेंट को true पर सेट नहीं किया जा सकता. हालांकि, Play Feature Delivery लाइब्रेरी का इस्तेमाल करके, इंस्टैंट इस्तेमाल की सुविधा देने वाले ऐप्लिकेशन के तौर पर, इंस्टैंट इस्तेमाल की सुविधा देने वाले फ़ीचर मॉड्यूल को मांग पर डाउनलोड करने का अनुरोध किया जा सकता है. जब कोई उपयोगकर्ता आपका ऐप्लिकेशन डाउनलोड और इंस्टॉल करता है, तो डिवाइस डिफ़ॉल्ट रूप से, आपके ऐप्लिकेशन के इंस्टेंट ऐप्लिकेशन की सुविधा वाले मॉड्यूल डाउनलोड और इंस्टॉल करता है. साथ ही, वह बेस APK भी डाउनलोड और इंस्टॉल करता है.

dist:title="@string/feature_name"> इस विकल्प की मदद से, मॉड्यूल के लिए उपयोगकर्ता को दिखने वाला टाइटल तय किया जाता है. उदाहरण के लिए, डिवाइस, डाउनलोड की पुष्टि करने का अनुरोध करते समय यह टाइटल दिखा सकता है.

आपको इस टाइटल के लिए स्ट्रिंग रिसॉर्स को बेस मॉड्यूल की module_root/src/source_set/res/values/strings.xml फ़ाइल में शामिल करना होगा.

<dist:fusing dist:include="true | false" /> इससे यह तय होता है कि Android 4.4 (एपीआई लेवल 20) और इससे पहले के वर्शन पर चल रहे डिवाइसों को टारगेट करने वाले मल्टी-APK में मॉड्यूल को शामिल करना है या नहीं.

इसके अलावा, जब किसी app bundle से APK जनरेट करने के लिए bundletool का इस्तेमाल किया जाता है, तो यूनिवर्सल APK में सिर्फ़ वे फ़ीचर मॉड्यूल शामिल होते हैं जो इस प्रॉपर्टी को true पर सेट करते हैं. यूनिवर्सल APK, एक मोनोलिथिक APK होता है. इसमें आपके ऐप्लिकेशन के साथ काम करने वाले सभी डिवाइस कॉन्फ़िगरेशन के लिए कोड और संसाधन शामिल होते हैं.

<dist:delivery> इसमें मॉड्यूल डिलीवरी को पसंद के मुताबिक बनाने के विकल्प शामिल होते हैं. इन्हें यहां दिखाया गया है. ध्यान रखें कि हर सुविधा मॉड्यूल को, डिलीवरी के इन कस्टम विकल्पों में से सिर्फ़ एक विकल्प कॉन्फ़िगर करना होगा.
<dist:install-time> इससे पता चलता है कि मॉड्यूल, इंस्टॉल के समय उपलब्ध होना चाहिए. यह उन फ़ीचर मॉड्यूल के लिए डिफ़ॉल्ट तरीका है जिनमें कस्टम डिलीवरी के किसी दूसरे विकल्प के बारे में नहीं बताया गया है.

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

यह नोड, ऐसी शर्तें भी तय कर सकता है जिनसे मॉड्यूल को सिर्फ़ उन डिवाइसों पर इस्तेमाल किया जा सकता है जो कुछ ज़रूरी शर्तों को पूरा करते हैं. जैसे, डिवाइस की सुविधाएं, उपयोगकर्ता का देश या कम से कम एपीआई लेवल. ज़्यादा जानने के लिए, शर्त के हिसाब से डिलीवरी की सुविधा कॉन्फ़िगर करना लेख पढ़ें.

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

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

removable को true पर सेट करने पर: इंस्टॉल के समय वाले मॉड्यूल, बेस मॉड्यूल में नहीं जोड़े जाएंगे. अगर आपको बाद में मॉड्यूल अनइंस्टॉल करने हैं, तो true पर सेट करें. हालांकि, हटाने के लिए बहुत सारे मॉड्यूल कॉन्फ़िगर करने से, आपके ऐप्लिकेशन को इंस्टॉल करने में ज़्यादा समय लग सकता है.

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

ध्यान दें: यह सुविधा सिर्फ़ Android Gradle प्लगिन 4.2 का इस्तेमाल करने पर उपलब्ध है. इसके अलावा, इसे कमांड लाइन से bundletool v1.0 का इस्तेमाल करने पर भी ऐक्सेस किया जा सकता है.

</dist:install-time>  
<dist:on-demand /> इससे यह तय होता है कि मॉड्यूल को मांग पर डाउनलोड करने के लिए उपलब्ध कराया जाना चाहिए. इसका मतलब है कि मॉड्यूल को इंस्टॉल करने के समय उपलब्ध नहीं कराया जाता. हालांकि, आपका ऐप्लिकेशन इसे बाद में डाउनलोड करने का अनुरोध कर सकता है.

मांग पर डाउनलोड करने की सुविधा के बारे में ज़्यादा जानने के लिए, मांग पर डिलीवरी की सुविधा कॉन्फ़िगर करें लेख पढ़ें.

</dist:delivery>
</dist:module>
<application
android:hasCode="true | false">
...
</application>
अगर फ़ीचर मॉड्यूल कोई DEX फ़ाइल जनरेट नहीं करता है, तो इसका मतलब है कि इसमें ऐसा कोई कोड नहीं है जिसे बाद में DEX फ़ाइल फ़ॉर्मैट में कंपाइल किया जाता है. ऐसे में, आपको यह काम करना होगा. ऐसा न करने पर, आपको रनटाइम से जुड़ी गड़बड़ियां मिल सकती हैं:
  1. फ़ीचर मॉड्यूल के मेनिफ़ेस्ट में, android:hasCode को "false" पर सेट करें.
  2. अपने बेस मॉड्यूल के मेनिफ़ेस्ट में यह जोड़ें:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
...
</manifest>

अन्य संसाधन

सुविधा मॉड्यूल इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, यहां दिए गए लेख पढ़ें.

ब्लॉग पोस्ट

वीडियो

सेवा की शर्तें और डेटा की सुरक्षा

Play Feature Delivery Library को ऐक्सेस या इस्तेमाल करने का मतलब है कि आपको Play Core Software Development Kit की सेवा की शर्तें मंज़ूर हैं. कृपया लाइब्रेरी को ऐक्सेस करने से पहले, इस पर लागू होने वाली सभी शर्तों और नीतियों को पढ़कर समझ लें.

डेटा की सुरक्षा

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

ज़्यादा भाषाओं के एपीआई

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

Play Feature Delivery

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

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