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

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

ऐसे गेम के बारे में सोचें जिसमें कम डेटा वाले फ़ीचर मॉड्यूल में, गेम के शुरुआती कुछ लेवल शामिल हों. इस मॉड्यूल को तुरंत चालू किया जा सकता है, ताकि उपयोगकर्ता ऐप्लिकेशन इंस्टॉल किए बिना, यूआरएल लिंक या “अभी आज़माएं” बटन की मदद से, गेम को तुरंत आज़मा सकें. फ़ीचर मॉड्यूल बनाएं और इंस्टैंट डिलीवरी को कॉन्फ़िगर करें. इसके बाद, आपका ऐप्लिकेशन 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 विश्लेषक का इस्तेमाल करके, अपने फ़ीचर मॉड्यूल APK की जांच की जा सकती है. साथ ही, पैकेज का नाम भी तय किया जा सकता है:

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

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

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

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

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 Instant के ज़रिए, इंस्टैंट इस्तेमाल की सुविधा के तौर पर उपलब्ध कराया जाना चाहिए या नहीं.

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

इस एक्सएमएल एलिमेंट को 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" /> इससे यह तय होता है कि मॉड्यूल को उन मल्टी-APK में शामिल करना है या नहीं जो Android 4.4 (एपीआई लेवल 20) और उससे पहले के वर्शन पर चल रहे डिवाइसों को टारगेट करते हैं.

इसके अलावा, जब किसी ऐप्लिकेशन बंडल से 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>
</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 की सुविधा डिलीवरी लाइब्रेरी को ऐक्सेस या इस्तेमाल करने का मतलब है कि आप Play Core Software Development Kit की सेवा की शर्तों से सहमत हैं. लाइब्रेरी को ऐक्सेस करने से पहले, कृपया इस पर लागू होने वाली सभी शर्तों और नीतियों को पढ़कर समझ लें.

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

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

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

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

Play Feature Delivery

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

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