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

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

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

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

कस्टम डिलीवरी के लिए फ़ीचर मॉड्यूल इस्तेमाल करना

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

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

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

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

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

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

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

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

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

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

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

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

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

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

संसाधन के पाथ का हर हिस्सा रन टाइम के दौरान बनाया जाता है. इससे यह पक्का होता है कि split 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 ऐनालाइज़र का स्क्रीनशॉट, जिसमें कंपाइल की गई रिसॉर्स फ़ाइल के कॉन्टेंट की जांच की जा रही है.
पहली इमेज. कंपाइल की गई संसाधन फ़ाइल में पैकेज का नाम देखने के लिए, APK ऐनालाइज़र का इस्तेमाल करें.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

अगर इसे सेट नहीं किया गया है या false पर सेट किया गया है, तो बंडल से split 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 Feature Delivery लाइब्रेरी को ऐक्सेस या इस्तेमाल करने का मतलब है कि आपको Play Core सॉफ़्टवेयर डेवलपमेंट किट की सेवा की शर्तें मंज़ूर हैं. लाइब्रेरी को ऐक्सेस करने से पहले, कृपया लागू होने वाली सभी शर्तों और नीतियों को पढ़ें और समझें.

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

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

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

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

Play Feature Delivery

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

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