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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

अगर आपको किसी यूआरआई का इस्तेमाल करके, सुविधा वाले मॉड्यूल में सेव किए गए संसाधन को ऐक्सेस करना है, तो 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();

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

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

  • ऐप्लिकेशन के पैकेज का नाम: 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 की जांच करने और पैकेज का नाम तय करने के लिए, APK Analytics का इस्तेमाल करें:

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

दूसरी इमेज. APK विश्लेषक का इस्तेमाल करके, कंपाइल की गई रिसॉर्स फ़ाइल में पैकेज के नाम की जांच करें.

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

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

  • किसी शर्त के साथ या मांग पर डिलीवरी की सुविधा का इस्तेमाल करके, एक डिवाइस पर 50 या उससे ज़्यादा सुविधा वाले मॉड्यूल इंस्टॉल करने पर, परफ़ॉर्मेंस से जुड़ी समस्याएं आ सकती हैं. इंस्टॉल-टाइम वाले मॉड्यूल, जिन्हें हटाने की सुविधा के तौर पर कॉन्फ़िगर नहीं किया जाता है वे बेस मॉड्यूल में अपने-आप शामिल होते हैं. वे हर डिवाइस पर सिर्फ़ एक सुविधा मॉड्यूल के तौर पर गिने जाते हैं.
  • इंस्टॉल के समय डिलीवरी के लिए, हटाए जा सकने वाले तौर पर कॉन्फ़िगर किए गए मॉड्यूल की संख्या को 10 या उससे कम पर सीमित करें. ऐसा न करने पर, आपके ऐप्लिकेशन को डाउनलोड और इंस्टॉल करने में ज़्यादा समय लग सकता है.
  • मांग पर सुविधाएं डाउनलोड और इंस्टॉल करने की सुविधा, सिर्फ़ Android 5.0 (एपीआई लेवल 21) और इसके बाद के वर्शन वाले डिवाइसों पर काम करती है. Android के पुराने वर्शन पर सुविधा उपलब्ध कराने के लिए, फ़ीचर मॉड्यूल बनाते समय Fused को चालू करें.
  • 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 लाइब्रेरी का इस्तेमाल करके, ज़रूरत पड़ने पर करता है.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

अन्य संसाधन

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

ब्लॉग पोस्ट

वीडियो

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

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

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

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

अन्य भाषाओं के एपीआई

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

Play Feature Delivery

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

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