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

Google Play का ऐप्लिकेशन डिलीवरी मॉडल, हर उपयोगकर्ता के डिवाइस कॉन्फ़िगरेशन के लिए ऑप्टिमाइज़ किए गए APK जनरेट करने और उन्हें डिलीवर करने के लिए, 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 इंस्टेंट का इस्तेमाल किया जा सकता है. इससे, उपयोगकर्ताओं को ऐप्लिकेशन इंस्टॉल किए बिना ही, उसकी कुछ सुविधाओं का तुरंत अनुभव मिल सकता है.

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

ध्यान रखें कि फ़ीचर मॉड्यूल का इस्तेमाल करके, अपने ऐप्लिकेशन की सुविधाओं को मॉड्यूलर बनाना सिर्फ़ पहला चरण है. 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();

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

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

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

इसके अलावा, जब किसी 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. अपने base मॉड्यूल के मेनिफ़ेस्ट में यह जोड़ें:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
...
</manifest>

अन्य संसाधन

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

ब्लॉग पोस्ट

वीडियो

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

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

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

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

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

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

Play Feature Delivery

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

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