फ़ीचर मॉड्यूल की मदद से, ऐप्लिकेशन की कुछ सुविधाओं और संसाधनों को ऐप्लिकेशन के बेस मॉड्यूल से अलग किया जा सकता है. साथ ही, उन्हें ऐप्लिकेशन बंडल में शामिल किया जा सकता है. Play फ़ीचर डिलीवरी की मदद से, उपयोगकर्ता बाद में उन कॉम्पोनेंट को डाउनलोड और इंस्टॉल कर सकते हैं. उदाहरण के लिए, जब वे आपके ऐप्लिकेशन का बेस APK पहले ही इंस्टॉल कर चुके हों.
उदाहरण के लिए, मान लें कि कोई टेक्स्ट मैसेजिंग ऐप्लिकेशन, फ़ोटो मैसेज कैप्चर करने और भेजने की सुविधा देता है. हालांकि, सिर्फ़ कुछ प्रतिशत उपयोगकर्ता ही फ़ोटो मैसेज भेजते हैं. इसलिए, पिक्चर मैसेजिंग को डाउनलोड किए जा सकने वाले फ़ीचर मॉड्यूल के तौर पर शामिल किया जा सकता है. इस तरह, सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन का शुरुआती डाउनलोड छोटा होता है. साथ ही, सिर्फ़ उन उपयोगकर्ताओं को अतिरिक्त कॉम्पोनेंट डाउनलोड करना होता है जो पिक्चर मैसेज भेजते हैं.
ध्यान रखें कि इस तरह के मॉड्यूलर बनाने के लिए, ज़्यादा मेहनत करनी पड़ती है. साथ ही, हो सकता है कि आपको अपने ऐप्लिकेशन के मौजूदा कोड को फिर से व्यवस्थित करना पड़े. इसलिए, सोच-समझकर तय करें कि आपके ऐप्लिकेशन की किन सुविधाओं को उपयोगकर्ताओं के लिए, मांग पर उपलब्ध कराने से सबसे ज़्यादा फ़ायदा होगा. मांग पर उपलब्ध सुविधाओं के सबसे सही इस्तेमाल के उदाहरण और दिशा-निर्देशों के बारे में बेहतर तरीके से जानने के लिए, मांग पर डिलीवरी की सुविधा के लिए UX से जुड़े सबसे सही तरीके पढ़ें.
अगर आपको समय के साथ-साथ ऐप्लिकेशन की सुविधाओं को मॉड्यूलर बनाना है, तो ऐप्लिकेशन इंस्टॉल करते समय डिलीवरी को कॉन्फ़िगर करें. इसके बजाय, मांग पर उपलब्ध डिलीवरी जैसे ऐडवांस डिलीवरी के विकल्प चालू न करें.
इस पेज पर, आपको अपने ऐप्लिकेशन प्रोजेक्ट में फ़ीचर मॉड्यूल जोड़ने और उसे मांग पर डिलीवरी के लिए कॉन्फ़िगर करने में मदद मिलेगी. शुरू करने से पहले, पक्का करें कि आपके पास Android Studio 3.5 या इसके बाद का वर्शन और Android Gradle Plugin 3.5.0 या इसके बाद का वर्शन हो.
मांग पर डिलीवरी के लिए नया मॉड्यूल कॉन्फ़िगर करना
नया फ़ीचर मॉड्यूल बनाने का सबसे आसान तरीका है कि आप Android Studio 3.5 या इसके बाद के वर्शन का इस्तेमाल करें. फ़ीचर मॉड्यूल, बुनियादी ऐप्लिकेशन मॉड्यूल पर निर्भर होते हैं. इसलिए, इन्हें सिर्फ़ मौजूदा ऐप्लिकेशन प्रोजेक्ट में जोड़ा जा सकता है.
Android Studio का इस्तेमाल करके, अपने ऐप्लिकेशन प्रोजेक्ट में सुविधा मॉड्यूल जोड़ने के लिए, यह तरीका अपनाएं:
- अगर आपने पहले से ऐसा नहीं किया है, तो IDE में अपना ऐप्लिकेशन प्रोजेक्ट खोलें.
- मेन्यू बार में जाकर, फ़ाइल > नया > नया मॉड्यूल चुनें.
- नया मॉड्यूल बनाएं डायलॉग में, डाइनैमिक फ़ीचर मॉड्यूल चुनें. इसके बाद, आगे बढ़ें पर क्लिक करें.
- अपना नया मॉड्यूल कॉन्फ़िगर करें सेक्शन में जाकर, यह तरीका अपनाएं:
- ड्रॉपडाउन मेन्यू से, अपने ऐप्लिकेशन प्रोजेक्ट के लिए बेस ऐप्लिकेशन मॉड्यूल चुनें.
- मॉड्यूल का नाम डालें. आईडीई इस नाम का इस्तेमाल, मॉड्यूल को आपकी Gradle सेटिंग फ़ाइल में Gradle सबप्रोजेक्ट के तौर पर पहचानने के लिए करता है. ऐप्लिकेशन बंडल बनाते समय, Gradle, सबप्रोजेक्ट के नाम के आखिरी एलिमेंट का इस्तेमाल करके,
<manifest split>
एट्रिब्यूट को फ़ीचर मॉड्यूल के मेनिफ़ेस्ट में इंजेक्ट करता है. - मॉड्यूल का पैकेज का नाम डालें. डिफ़ॉल्ट रूप से, Android Studio, पैकेज का ऐसा नाम सुझाता है जिसमें बेस मॉड्यूल के रूट पैकेज का नाम और पिछले चरण में दिया गया मॉड्यूल का नाम शामिल होता है.
- वह एपीआई का कम से कम लेवल चुनें जिस पर आपको मॉड्यूल को सपोर्ट करना है. यह वैल्यू, बेस मॉड्यूल की वैल्यू से मेल खानी चाहिए.
- आगे बढ़ें पर क्लिक करें.
मॉड्यूल डाउनलोड करने के विकल्प सेक्शन में जाकर, यह तरीका अपनाएं:
ज़्यादा से ज़्यादा 50 वर्णों का इस्तेमाल करके, मॉड्यूल का टाइटल डालें. प्लैटफ़ॉर्म इस टाइटल का इस्तेमाल, उपयोगकर्ताओं को मॉड्यूल की पहचान कराने के लिए करता है. उदाहरण के लिए, यह पुष्टि करने के लिए कि क्या उपयोगकर्ता मॉड्यूल डाउनलोड करना चाहता है. इस वजह से, आपके ऐप्लिकेशन के बेस मॉड्यूल में मॉड्यूल का टाइटल, स्ट्रिंग रिसॉर्स के तौर पर शामिल होना चाहिए. इसे अनुवाद किया जा सकता है. Android Studio का इस्तेमाल करके मॉड्यूल बनाते समय, IDE आपके लिए बेस मॉड्यूल में स्ट्रिंग रिसॉर्स जोड़ता है. साथ ही, सुविधा मॉड्यूल के मेनिफ़ेस्ट में यह एंट्री डालता है:
<dist:module ... dist:title="@string/feature_title"> </dist:module>
इंस्टॉल के समय शामिल किए जाने वाले मॉड्यूल में मौजूद ड्रॉपडाउन मेन्यू में जाकर, इंस्टॉल के समय मॉड्यूल शामिल न करें चुनें. Android Studio, आपकी पसंद के हिसाब से मॉड्यूल के मेनिफ़ेस्ट में यह जानकारी जोड़ता है:
<dist:module ... > <dist:delivery> <dist:on-demand/> </dist:delivery> </dist:module>
अगर आपको इस मॉड्यूल को Android 4.4 (एपीआई लेवल 20) और इससे पहले के वर्शन पर चल रहे डिवाइसों के लिए उपलब्ध कराना है और इसे मल्टी-APK में शामिल करना है, तो फ़्यूज़िंग के बगल में मौजूद बॉक्स को चुनें. इसका मतलब है कि इस मॉड्यूल के लिए, मांग पर उपलब्ध होने की सुविधा चालू की जा सकती है. साथ ही, स्प्लिट किए गए APK डाउनलोड और इंस्टॉल करने की सुविधा न देने वाले डिवाइसों से इसे हटाने के लिए, फ़्यूज़ करने की सुविधा बंद की जा सकती है. Android Studio, आपकी पसंद के हिसाब से मॉड्यूल के मेनिफ़ेस्ट में यह जानकारी जोड़ता है:
<dist:module ...> <dist:fusing dist:include="true | false" /> </dist:module>
पूरा करें पर क्लिक करें.
Android Studio के मॉड्यूल बनाने के बाद, प्रोजेक्ट पैन से उसके कॉन्टेंट की जांच करें. इसके लिए, मेन्यू बार में जाकर व्यू > टूल विंडो > प्रोजेक्ट चुनें. डिफ़ॉल्ट कोड, संसाधन, और संगठन, स्टैंडर्ड ऐप्लिकेशन मॉड्यूल के जैसे होने चाहिए.
इसके बाद, आपको Play Feature Delivery लाइब्रेरी का इस्तेमाल करके, ज़रूरत के हिसाब से इंस्टॉल करने की सुविधा लागू करनी होगी.
अपने प्रोजेक्ट में Play Feature Delivery Library को शामिल करें
शुरू करने से पहले, आपको अपने प्रोजेक्ट में Play Feature Delivery Library जोड़नी होगी.
मांग पर उपलब्ध मॉड्यूल का अनुरोध करना
जब आपके ऐप्लिकेशन को किसी फ़ीचर मॉड्यूल का इस्तेमाल करना होता है, तब वह SplitInstallManager
क्लास के ज़रिए, फ़ोरग्राउंड में रहते हुए मॉड्यूल का अनुरोध कर सकता है. अनुरोध करते समय, आपके ऐप्लिकेशन को मॉड्यूल का नाम बताना होगा. यह नाम, टारगेट मॉड्यूल के मेनिफ़ेस्ट में split
एलिमेंट के ज़रिए तय किया जाता है. Android Studio का इस्तेमाल करके, कोई सुविधा वाला मॉड्यूल बनाते समय बिल्ड सिस्टम, आपके दिए गए मॉड्यूल के नाम का इस्तेमाल करता है. इससे, कंपाइल करने के समय इस प्रॉपर्टी को मॉड्यूल के मेनिफ़ेस्ट में इंजेक्ट किया जा सकता है.
ज़्यादा जानकारी के लिए, सुविधा वाले मॉड्यूल के मेनिफ़ेस्ट के बारे में पढ़ें.
उदाहरण के लिए, मान लें कि किसी ऐप्लिकेशन में डिवाइस के कैमरे का इस्तेमाल करके, फ़ोटो मैसेज कैप्चर करने और भेजने के लिए ऑन डिमांड मॉड्यूल है. साथ ही, इस ऑन डिमांड मॉड्यूल के मेनिफ़ेस्ट में split="pictureMessages"
मौजूद है. यहां दिए गए सैंपल में, SplitInstallManager
का इस्तेमाल करके pictureMessages
मॉड्यूल का अनुरोध किया गया है. साथ ही, कुछ प्रमोशनल फ़िल्टर के लिए एक अतिरिक्त मॉड्यूल का अनुरोध किया गया है:
Kotlin
// Creates an instance of SplitInstallManager. val splitInstallManager = SplitInstallManagerFactory.create(context) // Creates a request to install a module. val request = SplitInstallRequest .newBuilder() // You can download multiple on demand modules per // request by invoking the following method for each // module you want to install. .addModule("pictureMessages") .addModule("promotionalFilters") .build() splitInstallManager // Submits the request to install the module through the // asynchronous startInstall() task. Your app needs to be // in the foreground to submit the request. .startInstall(request) // You should also be able to gracefully handle // request state changes and errors. To learn more, go to // the section about how to Monitor the request state. .addOnSuccessListener { sessionId -> ... } .addOnFailureListener { exception -> ... }
Java
// Creates an instance of SplitInstallManager. SplitInstallManager splitInstallManager = SplitInstallManagerFactory.create(context); // Creates a request to install a module. SplitInstallRequest request = SplitInstallRequest .newBuilder() // You can download multiple on demand modules per // request by invoking the following method for each // module you want to install. .addModule("pictureMessages") .addModule("promotionalFilters") .build(); splitInstallManager // Submits the request to install the module through the // asynchronous startInstall() task. Your app needs to be // in the foreground to submit the request. .startInstall(request) // You should also be able to gracefully handle // request state changes and errors. To learn more, go to // the section about how to Monitor the request state. .addOnSuccessListener(sessionId -> { ... }) .addOnFailureListener(exception -> { ... });
जब आपका ऐप्लिकेशन, मांग पर उपलब्ध मॉड्यूल का अनुरोध करता है, तो Play Feature Delivery Library “फ़ायर-एंड-फ़ॉरगेट” रणनीति का इस्तेमाल करती है. इसका मतलब है कि यह प्लैटफ़ॉर्म को मॉड्यूल डाउनलोड करने का अनुरोध भेजता है, लेकिन यह मॉनिटर नहीं करता कि इंस्टॉलेशन पूरा हुआ या नहीं. इंस्टॉल करने के बाद, उपयोगकर्ता के अनुभव को बेहतर बनाने या गड़बड़ियों को ठीक से मैनेज करने के लिए, पक्का करें कि आपने अनुरोध की स्थिति की निगरानी की हो.
ध्यान दें: डिवाइस पर पहले से इंस्टॉल किए गए फ़ीचर मॉड्यूल का अनुरोध किया जा सकता है. अगर एपीआई को पता चलता है कि मॉड्यूल पहले से इंस्टॉल है, तो वह अनुरोध को तुरंत पूरा मान लेता है. इसके अलावा, मॉड्यूल इंस्टॉल होने के बाद, Google Play उसे अपने-आप अपडेट करता रहता है. इसका मतलब है कि जब ऐप्लिकेशन बंडल का नया वर्शन अपलोड किया जाता है, तो प्लैटफ़ॉर्म आपके ऐप्लिकेशन से जुड़े सभी इंस्टॉल किए गए APK को अपडेट कर देता है. ज़्यादा जानकारी के लिए, ऐप्लिकेशन के अपडेट मैनेज करना लेख पढ़ें.
मॉड्यूल के कोड और संसाधनों को ऐक्सेस करने के लिए, आपके ऐप्लिकेशन को SplitCompat चालू करना होगा. ध्यान दें कि Android इंस्टैंट ऐप्लिकेशन के लिए SplitCompat की ज़रूरत नहीं होती.
मांग पर उपलब्ध मॉड्यूल को इंस्टॉल करने में देरी करना
अगर आपको अपने ऐप्लिकेशन में, मांग पर उपलब्ध मॉड्यूल को तुरंत डाउनलोड और इंस्टॉल करने की ज़रूरत नहीं है, तो ऐप्लिकेशन के बैकग्राउंड में होने पर इंस्टॉल करने की सुविधा को कुछ समय के लिए रोका जा सकता है. उदाहरण के लिए, अगर आपको अपने ऐप्लिकेशन के लॉन्च के लिए, प्रमोशन से जुड़ा कुछ कॉन्टेंट पहले से लोड करना है.
deferredInstall()
तरीके का इस्तेमाल करके, बाद में डाउनलोड किए जाने वाले मॉड्यूल के बारे में बताया जा सकता है. इसके बारे में यहां बताया गया है. साथ ही, SplitInstallManager.startInstall()
के उलट, पोस्टपोन किए गए इंस्टॉलेशन का अनुरोध शुरू करने के लिए, आपके ऐप्लिकेशन का फ़ोरग्राउंड में होना ज़रूरी नहीं है.
Kotlin
// Requests an on demand module to be downloaded when the app enters // the background. You can specify more than one module at a time. splitInstallManager.deferredInstall(listOf("promotionalFilters"))
Java
// Requests an on demand module to be downloaded when the app enters // the background. You can specify more than one module at a time. splitInstallManager.deferredInstall(Arrays.asList("promotionalFilters"));
डिफ़र्ड इंस्टॉल के अनुरोधों को पूरा करने की पूरी कोशिश की जाती है. हालांकि, इनकी प्रोग्रेस को ट्रैक नहीं किया जा सकता. इसलिए, डेफ़र्ड इंस्टॉलेशन के लिए तय किए गए किसी मॉड्यूल को ऐक्सेस करने से पहले, आपको यह देखना चाहिए कि मॉड्यूल इंस्टॉल हो गया है या नहीं. अगर आपको मॉड्यूल तुरंत उपलब्ध कराना है, तो इसके लिए SplitInstallManager.startInstall()
का इस्तेमाल करके अनुरोध करें. ऐसा पिछले सेक्शन में दिखाए गए तरीके से करें.
अनुरोध की स्थिति को मॉनिटर करना
प्रोग्रेस बार को अपडेट करने, इंस्टॉल करने के बाद इंटेंट को ट्रिगर करने या अनुरोध से जुड़ी गड़बड़ी को ठीक से हैंडल करने के लिए, आपको एसिंक्रोनस SplitInstallManager.startInstall()
टास्क से मिलने वाले स्टेटस अपडेट सुनने होंगे.
इंस्टॉल करने के अनुरोध से जुड़े अपडेट पाने के लिए, सबसे पहले एक लिसनर रजिस्टर करें और अनुरोध के लिए सेशन आईडी पाएं. इसके लिए, यहां दिया गया तरीका अपनाएं.
Kotlin
// Initializes a variable to later track the session ID for a given request. var mySessionId = 0 // Creates a listener for request status updates. val listener = SplitInstallStateUpdatedListener { state -> if (state.sessionId() == mySessionId) { // Read the status of the request to handle the state update. } } // Registers the listener. splitInstallManager.registerListener(listener) ... splitInstallManager .startInstall(request) // When the platform accepts your request to download // an on demand module, it binds it to the following session ID. // You use this ID to track further status updates for the request. .addOnSuccessListener { sessionId -> mySessionId = sessionId } // You should also add the following listener to handle any errors // processing the request. .addOnFailureListener { exception -> // Handle request errors. } // When your app no longer requires further updates, unregister the listener. splitInstallManager.unregisterListener(listener)
Java
// Initializes a variable to later track the session ID for a given request. int mySessionId = 0; // Creates a listener for request status updates. SplitInstallStateUpdatedListener listener = state -> { if (state.sessionId() == mySessionId) { // Read the status of the request to handle the state update. } }; // Registers the listener. splitInstallManager.registerListener(listener); ... splitInstallManager .startInstall(request) // When the platform accepts your request to download // an on demand module, it binds it to the following session ID. // You use this ID to track further status updates for the request. .addOnSuccessListener(sessionId -> { mySessionId = sessionId; }) // You should also add the following listener to handle any errors // processing the request. .addOnFailureListener(exception -> { // Handle request errors. }); // When your app no longer requires further updates, unregister the listener. splitInstallManager.unregisterListener(listener);
अनुरोध से जुड़ी गड़बड़ियों को ठीक करना
ध्यान रखें कि फ़ीचर मॉड्यूल को मांग पर इंस्टॉल करने की सुविधा कभी-कभी काम नहीं करती. ठीक इसी तरह, ऐप्लिकेशन इंस्टॉल करने की सुविधा हमेशा काम नहीं करती. ऐप्लिकेशन इंस्टॉल न हो पाने की वजहें ये हो सकती हैं: डिवाइस में स्टोरेज कम होना, नेटवर्क कनेक्टिविटी न होना या उपयोगकर्ता का Google Play Store में साइन इन न होना. उपयोगकर्ता के नज़रिए से इन स्थितियों को बेहतर तरीके से मैनेज करने के सुझाव पाने के लिए, मांग पर डिलीवरी के लिए यूज़र एक्सपीरियंस से जुड़े दिशा-निर्देश देखें.
कोड के हिसाब से, आपको addOnFailureListener()
का इस्तेमाल करके, मॉड्यूल को डाउनलोड या इंस्टॉल करने में आने वाली समस्याओं को हल करना चाहिए. इसके बारे में यहां बताया गया है:
Kotlin
splitInstallManager .startInstall(request) .addOnFailureListener { exception -> when ((exception as SplitInstallException).errorCode) { SplitInstallErrorCode.NETWORK_ERROR -> { // Display a message that requests the user to establish a // network connection. } SplitInstallErrorCode.ACTIVE_SESSIONS_LIMIT_EXCEEDED -> checkForActiveDownloads() ... } } fun checkForActiveDownloads() { splitInstallManager // Returns a SplitInstallSessionState object for each active session as a List. .sessionStates .addOnCompleteListener { task -> if (task.isSuccessful) { // Check for active sessions. for (state in task.result) { if (state.status() == SplitInstallSessionStatus.DOWNLOADING) { // Cancel the request, or request a deferred installation. } } } } }
Java
splitInstallManager .startInstall(request) .addOnFailureListener(exception -> { switch (((SplitInstallException) exception).getErrorCode()) { case SplitInstallErrorCode.NETWORK_ERROR: // Display a message that requests the user to establish a // network connection. break; case SplitInstallErrorCode.ACTIVE_SESSIONS_LIMIT_EXCEEDED: checkForActiveDownloads(); ... }); void checkForActiveDownloads() { splitInstallManager // Returns a SplitInstallSessionState object for each active session as a List. .getSessionStates() .addOnCompleteListener( task -> { if (task.isSuccessful()) { // Check for active sessions. for (SplitInstallSessionState state : task.getResult()) { if (state.status() == SplitInstallSessionStatus.DOWNLOADING) { // Cancel the request, or request a deferred installation. } } } }); }
यहां दी गई टेबल में, गड़बड़ी की उन स्थितियों के बारे में बताया गया है जिन्हें आपके ऐप्लिकेशन को मैनेज करना पड़ सकता है:
गड़बड़ी कोड | ब्यौरा | सुझाई गई कार्रवाई |
---|---|---|
ACTIVE_SESSIONS_LIMIT_EXCEEDED | अनुरोध अस्वीकार कर दिया गया है, क्योंकि कम से कम एक मौजूदा अनुरोध फ़िलहाल डाउनलोड हो रहा है. | देखें कि क्या कोई अनुरोध अब भी डाउनलोड हो रहा है. जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है. |
MODULE_UNAVAILABLE | Google Play, ऐप्लिकेशन, डिवाइस, और उपयोगकर्ता के Google Play खाते के मौजूदा इंस्टॉल किए गए वर्शन के आधार पर, अनुरोध किया गया मॉड्यूल नहीं ढूंढ पा रहा है. | अगर उपयोगकर्ता के पास मॉड्यूल का ऐक्सेस नहीं है, तो उसे इसकी सूचना दें. |
INVALID_REQUEST | Google Play को अनुरोध मिला है, लेकिन यह मान्य नहीं है. | पुष्टि करें कि अनुरोध में शामिल की गई जानकारी पूरी और सटीक हो. |
SESSION_NOT_FOUND | दिए गए सेशन आईडी के लिए कोई सेशन नहीं मिला. | अगर आपको सेशन आईडी के हिसाब से किसी अनुरोध की स्थिति पर नज़र रखनी है, तो पक्का करें कि सेशन आईडी सही हो. |
API_NOT_AVAILABLE | Play Feature Delivery Library, इस डिवाइस पर काम नहीं करती. इसका मतलब है कि डिवाइस, मांग पर उपलब्ध सुविधाओं को डाउनलोड और इंस्टॉल नहीं कर सकता. | Android 4.4 (एपीआई लेवल 20) या इससे पहले के वर्शन वाले डिवाइसों के लिए, आपको इंस्टॉल करने के समय ही फ़ीचर मॉड्यूल शामिल करने चाहिए. इसके लिए, dist:fusing मेनिफ़ेस्ट प्रॉपर्टी का इस्तेमाल करें. ज़्यादा जानने के लिए, सुविधा वाले मॉड्यूल के मेनिफ़ेस्ट के बारे में पढ़ें.
|
NETWORK_ERROR | नेटवर्क की गड़बड़ी की वजह से अनुरोध पूरा नहीं किया जा सका. | उपयोगकर्ता को नेटवर्क कनेक्शन बनाने या किसी दूसरे नेटवर्क से कनेक्ट करने के लिए प्रॉम्प्ट करें. |
ACCESS_DENIED | ज़रूरी अनुमतियां न होने की वजह से, ऐप्लिकेशन अनुरोध को रजिस्टर नहीं कर सका. | आम तौर पर, ऐसा तब होता है, जब ऐप्लिकेशन बैकग्राउंड में चल रहा हो. ऐप्लिकेशन के फ़ोरग्राउंड में वापस आने पर, अनुरोध भेजें. |
INCOMPATIBLE_WITH_EXISTING_SESSION | अनुरोध में एक या इससे ज़्यादा ऐसे मॉड्यूल शामिल हैं जिनके लिए पहले ही अनुरोध किया जा चुका है, लेकिन उन्हें अब तक इंस्टॉल नहीं किया गया है. | कोई ऐसा नया अनुरोध बनाएं जिसमें वे मॉड्यूल शामिल न हों जिनके लिए आपका ऐप्लिकेशन पहले ही अनुरोध कर चुका है. इसके अलावा, अनुरोध को फिर से आज़माने से पहले, उन सभी मॉड्यूल के इंस्टॉल होने का इंतज़ार करें जिनके लिए फ़िलहाल अनुरोध किया गया है.
ध्यान रखें कि पहले से इंस्टॉल किए गए मॉड्यूल का अनुरोध करने पर, कोई गड़बड़ी नहीं होती. |
SERVICE_DIED | अनुरोध को हैंडल करने वाली सेवा बंद हो गई है. | अनुरोध को फिर से भेजें.
आपके |
INSUFFICIENT_STORAGE | डिवाइस में, सुविधा मॉड्यूल इंस्टॉल करने के लिए ज़रूरी स्टोरेज नहीं है. | उपयोगकर्ता को सूचना दें कि इस सुविधा को इंस्टॉल करने के लिए, उसके डिवाइस में ज़रूरी स्टोरेज उपलब्ध नहीं है. |
SPLITCOMPAT_VERIFICATION_ERROR, SPLITCOMPAT_EMULATION_ERROR, SPLITCOMPAT_COPY_ERROR | SplitCompat, सुविधा मॉड्यूल को लोड नहीं कर सका. | ऐप्लिकेशन को अगली बार रीस्टार्ट करने पर, ये गड़बड़ियां अपने-आप ठीक हो जानी चाहिए. |
PLAY_STORE_NOT_FOUND | डिवाइस पर Play Store ऐप्लिकेशन इंस्टॉल नहीं है. | उपयोगकर्ता को बताएं कि इस सुविधा को डाउनलोड करने के लिए, Play Store ऐप्लिकेशन ज़रूरी है. |
APP_NOT_OWNED | ऐप्लिकेशन को Google Play से इंस्टॉल नहीं किया गया है. इसलिए, इस सुविधा को डाउनलोड नहीं किया जा सकता. यह गड़बड़ी सिर्फ़ डेफ़र्ड इंस्टॉल के लिए हो सकती है. | अगर आपको उपयोगकर्ता को Google Play पर ऐप्लिकेशन उपलब्ध कराना है, तो startInstall() का इस्तेमाल करें. इससे उपयोगकर्ता की पुष्टि की जा सकती है. |
INTERNAL_ERROR | Play Store में कोई अंदरूनी गड़बड़ी हुई. | अनुरोध को फिर से भेजें. |
अगर कोई उपयोगकर्ता, मांग पर उपलब्ध मॉड्यूल को डाउनलोड करने का अनुरोध करता है और कोई गड़बड़ी होती है, तो उपयोगकर्ता को एक डायलॉग दिखाएं. इसमें उपयोगकर्ता के लिए दो विकल्प दिए गए हों: फिर से कोशिश करें (इससे अनुरोध को फिर से पूरा करने की कोशिश की जाती है) और रद्द करें (इससे अनुरोध को रद्द कर दिया जाता है). ज़्यादा मदद के लिए, आपको सहायता लिंक भी देना चाहिए. इस लिंक पर क्लिक करके, उपयोगकर्ता Google Play के सहायता केंद्र पर पहुंच सकते हैं.
स्टेट अपडेट मैनेज करना
लिसनर को रजिस्टर करने और अपने अनुरोध के लिए सेशन आईडी रिकॉर्ड करने के बाद, यहां दिखाए गए तरीके से, StateUpdatedListener.onStateUpdate()
का इस्तेमाल करके, स्थिति में होने वाले बदलावों को मैनेज करें.
Kotlin
override fun onStateUpdate(state : SplitInstallSessionState) { if (state.status() == SplitInstallSessionStatus.FAILED && state.errorCode() == SplitInstallErrorCode.SERVICE_DIED) { // Retry the request. return } if (state.sessionId() == mySessionId) { when (state.status()) { SplitInstallSessionStatus.DOWNLOADING -> { val totalBytes = state.totalBytesToDownload() val progress = state.bytesDownloaded() // Update progress bar. } SplitInstallSessionStatus.INSTALLED -> { // After a module is installed, you can start accessing its content or // fire an intent to start an activity in the installed module. // For other use cases, see access code and resources from installed modules. // If the request is an on demand module for an Android Instant App // running on Android 8.0 (API level 26) or higher, you need to // update the app context using the SplitInstallHelper API. } } } }
Java
@Override public void onStateUpdate(SplitInstallSessionState state) { if (state.status() == SplitInstallSessionStatus.FAILED && state.errorCode() == SplitInstallErrorCode.SERVICE_DIES) { // Retry the request. return; } if (state.sessionId() == mySessionId) { switch (state.status()) { case SplitInstallSessionStatus.DOWNLOADING: int totalBytes = state.totalBytesToDownload(); int progress = state.bytesDownloaded(); // Update progress bar. break; case SplitInstallSessionStatus.INSTALLED: // After a module is installed, you can start accessing its content or // fire an intent to start an activity in the installed module. // For other use cases, see access code and resources from installed modules. // If the request is an on demand module for an Android Instant App // running on Android 8.0 (API level 26) or higher, you need to // update the app context using the SplitInstallHelper API. } } }
इंस्टॉल करने के अनुरोध की संभावित स्थितियों के बारे में यहां दी गई टेबल में बताया गया है.
अनुरोध की स्थिति | ब्यौरा | सुझाई गई कार्रवाई |
---|---|---|
लंबित | अनुरोध स्वीकार कर लिया गया है. डाउनलोड जल्द ही शुरू हो जाएगा. | यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट शुरू करें. जैसे, प्रोग्रेस बार, ताकि उपयोगकर्ता को डाउनलोड के बारे में जानकारी दी जा सके. |
REQUIRES_USER_CONFIRMATION | डाउनलोड करने के लिए, उपयोगकर्ता की पुष्टि करना ज़रूरी है. आम तौर पर, यह स्टेटस तब दिखता है, जब ऐप्लिकेशन को Google Play से इंस्टॉल नहीं किया गया हो. | उपयोगकर्ता को Google Play से सुविधा डाउनलोड करने की पुष्टि करने के लिए प्रॉम्प्ट करता है. ज़्यादा जानने के लिए, उपयोगकर्ता की पुष्टि पाने के तरीके के बारे में सेक्शन पर जाएं. |
डाउनलोड करना | डाउनलोड हो रहा है. | अगर आपने डाउनलोड के लिए प्रोग्रेस बार दिया है, तो यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए, SplitInstallSessionState.bytesDownloaded() और SplitInstallSessionState.totalBytesToDownload() तरीकों का इस्तेमाल करें. इस टेबल के ऊपर कोड का सैंपल देखें. |
डाउनलोड किए गए | डिवाइस पर मॉड्यूल डाउनलोड हो गया है, लेकिन अभी तक इंस्टॉल नहीं हुआ है. | ऐप्लिकेशन को SplitCompat चालू करना चाहिए, ताकि डाउनलोड किए गए मॉड्यूल को ऐक्सेस किया जा सके और यह स्थिति न दिखे. इसकी ज़रूरत, फ़ीचर मॉड्यूल के कोड और संसाधनों को ऐक्सेस करने के लिए होती है. |
इंस्टॉल हो रहा है | फ़िलहाल, डिवाइस पर मॉड्यूल इंस्टॉल किया जा रहा है. | प्रोग्रेस बार को अपडेट करें. यह स्थिति आम तौर पर कम समय के लिए होती है. |
इंस्टॉल किया गया | मॉड्यूल को डिवाइस पर इंस्टॉल किया गया है. | मॉड्यूल में मौजूद ऐक्सेस कोड और संसाधन
की ज़रूरत होती है, ताकि उपयोगकर्ता का अनुभव बेहतर बना रहे.
अगर मॉड्यूल, Android 8.0 (एपीआई लेवल 26) या उसके बाद के वर्शन पर चलने वाले Android Instant App के लिए है, तो आपको |
FAILED | डिवाइस पर मॉड्यूल इंस्टॉल होने से पहले ही अनुरोध पूरा नहीं किया जा सका. | उपयोगकर्ता को अनुरोध फिर से करने या उसे रद्द करने के लिए प्रॉम्प्ट करें. |
रद्द करना | डिवाइस, अनुरोध को रद्द करने की प्रोसेस में है. | ज़्यादा जानने के लिए, इंस्टॉल करने का अनुरोध रद्द करने के तरीके के बारे में जानकारी देने वाले सेक्शन पर जाएं. |
रद्द | अनुरोध रद्द कर दिया गया है. |
उपयोगकर्ता की पुष्टि करना
कुछ मामलों में, डाउनलोड करने के अनुरोध को पूरा करने से पहले, Google Play को उपयोगकर्ता की पुष्टि की ज़रूरत पड़ सकती है. उदाहरण के लिए, अगर आपके ऐप्लिकेशन को Google Play ने इंस्टॉल नहीं किया है या अगर मोबाइल डेटा से कोई बड़ी फ़ाइल डाउनलोड की जा रही है. ऐसे मामलों में, अनुरोध की स्थिति REQUIRES_USER_CONFIRMATION
के तौर पर दिखती है. साथ ही, आपके ऐप्लिकेशन को उपयोगकर्ता की पुष्टि करानी होती है. इसके बाद ही, डिवाइस अनुरोध में शामिल मॉड्यूल को डाउनलोड और इंस्टॉल कर पाता है. पुष्टि पाने के लिए, आपके ऐप्लिकेशन को उपयोगकर्ता को इस तरह से सूचना देनी चाहिए:
Kotlin
override fun onSessionStateUpdate(state: SplitInstallSessionState) { if (state.status() == SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION) { // Displays a confirmation for the user to confirm the request. splitInstallManager.startConfirmationDialogForResult( state, // an activity result launcher registered via registerForActivityResult activityResultLauncher) } ... }
Java
@Override void onSessionStateUpdate(SplitInstallSessionState state) { if (state.status() == SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION) { // Displays a confirmation for the user to confirm the request. splitInstallManager.startConfirmationDialogForResult( state, // an activity result launcher registered via registerForActivityResult activityResultLauncher); } ... }
बिल्ट-इन ActivityResultContracts.StartIntentSenderForResult
कॉन्ट्रैक्ट का इस्तेमाल करके, गतिविधि के नतीजे को लॉन्च करने वाले टूल को रजिस्टर किया जा सकता है. Activity Result APIs देखें.
उपयोगकर्ता के जवाब के आधार पर, अनुरोध की स्थिति अपडेट की जाती है:
- अगर उपयोगकर्ता पुष्टि करने का अनुरोध स्वीकार करता है, तो अनुरोध का स्टेटस बदलकर
PENDING
हो जाता है और डाउनलोड शुरू हो जाता है. - अगर उपयोगकर्ता पुष्टि करने से मना कर देता है, तो अनुरोध का स्टेटस बदलकर
CANCELED
हो जाता है. - अगर उपयोगकर्ता, डायलॉग बंद होने से पहले कोई विकल्प नहीं चुनता है, तो अनुरोध की स्थिति
REQUIRES_USER_CONFIRMATION
के तौर पर बनी रहती है. आपका ऐप्लिकेशन, अनुरोध पूरा करने के लिए उपयोगकर्ता को फिर से सूचना दे सकता है.
उपयोगकर्ता के जवाब के साथ कॉलबैक पाने के लिए, नीचे दिए गए तरीके से ActivityResultCallback को बदला जा सकता है.
Kotlin
registerForActivityResult(StartIntentSenderForResult()) { result: ActivityResult -> { // Handle the user's decision. For example, if the user selects "Cancel", // you may want to disable certain functionality that depends on the module. } }
Java
registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { // Handle the user's decision. For example, if the user selects "Cancel", // you may want to disable certain functionality that depends on the module. } });
इंस्टॉल करने का अनुरोध रद्द करना
अगर आपके ऐप्लिकेशन को इंस्टॉल होने से पहले किसी अनुरोध को रद्द करना है, तो वह अनुरोध के सेशन आईडी का इस्तेमाल करके cancelInstall()
तरीके को लागू कर सकता है. इसे यहां दिखाया गया है.
Kotlin
splitInstallManager // Cancels the request for the given session ID. .cancelInstall(mySessionId)
Java
splitInstallManager // Cancels the request for the given session ID. .cancelInstall(mySessionId);
मॉड्यूल ऐक्सेस करना
डाउनलोड किए गए मॉड्यूल से कोड और संसाधनों को ऐक्सेस करने के लिए, आपके ऐप्लिकेशन को SplitCompat लाइब्रेरी को चालू करना होगा. ऐसा आपके ऐप्लिकेशन और आपके ऐप्लिकेशन के डाउनलोड किए गए फ़ीचर मॉड्यूल में मौजूद हर गतिविधि के लिए करना होगा.
हालांकि, आपको यह ध्यान रखना चाहिए कि मॉड्यूल डाउनलोड करने के बाद, कुछ समय (कुछ मामलों में, कुछ दिन) तक प्लैटफ़ॉर्म पर मॉड्यूल के कॉन्टेंट को ऐक्सेस करने से जुड़ी ये पाबंदियां लागू होती हैं:
- मॉड्यूल की ओर से जोड़ी गई नई मेनिफ़ेस्ट एंट्री को प्लैटफ़ॉर्म लागू नहीं कर सकता.
- प्लैटफ़ॉर्म, सिस्टम यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के लिए मॉड्यूल के संसाधनों को ऐक्सेस नहीं कर सकता. जैसे, सूचनाएं. अगर आपको ऐसे संसाधनों का तुरंत इस्तेमाल करना है, तो उन्हें अपने ऐप्लिकेशन के बेस मॉड्यूल में शामिल करें.
SplitCompat चालू करना
डाउनलोड किए गए मॉड्यूल से कोड और संसाधनों को ऐक्सेस करने के लिए, आपको SplitCompat को चालू करना होगा. इसके लिए, यहां दिए गए तरीकों में से किसी एक का इस्तेमाल करें.
अपने ऐप्लिकेशन के लिए SplitCompat चालू करने के बाद, आपको उन फ़ीचर मॉड्यूल में हर गतिविधि के लिए SplitCompat चालू करना होगा जिन्हें आपको अपने ऐप्लिकेशन में ऐक्सेस करना है.
मेनिफ़ेस्ट में SplitCompatApplication का एलान करना
SplitCompat को चालू करने का सबसे आसान तरीका यह है कि आप अपने ऐप्लिकेशन के मेनिफ़ेस्ट में SplitCompatApplication
को Application
सबक्लास के तौर पर एलान करें. इसके लिए, यहां दिया गया तरीका अपनाएं:
<application
...
android:name="com.google.android.play.core.splitcompat.SplitCompatApplication">
</application>
किसी डिवाइस पर ऐप्लिकेशन इंस्टॉल होने के बाद, डाउनलोड किए गए सुविधा मॉड्यूल से कोड और संसाधनों को अपने-आप ऐक्सेस किया जा सकता है.
रनटाइम के दौरान SplitCompat को शुरू करना
इसके अलावा, रनटाइम के दौरान कुछ खास गतिविधियों या सेवाओं में SplitCompat को चालू किया जा सकता है.
स्प्लिट कॉम्पैट को इस तरह से चालू करना ज़रूरी है, ताकि फ़ीचर मॉड्यूल में शामिल गतिविधियों को लॉन्च किया जा सके. इसके लिए, नीचे दिए गए तरीके से attachBaseContext
को बदलें.
अगर आपके पास कस्टम Application क्लास है, तो अपने ऐप्लिकेशन के लिए SplitCompat को चालू करने के लिए, इसे SplitCompatApplication
से एक्सटेंड करें. इसके बारे में यहां बताया गया है:
Kotlin
class MyApplication : SplitCompatApplication() { ... }
Java
public class MyApplication extends SplitCompatApplication { ... }
SplitCompatApplication
, ContextWrapper.attachBaseContext()
को SplitCompat.install(Context applicationContext)
शामिल करने के लिए बदल देता है. अगर आपको अपनी Application
क्लास को SplitCompatApplication
बढ़ाने की सुविधा नहीं चाहिए, तो attachBaseContext()
तरीके को मैन्युअल तरीके से बदला जा सकता है. इसके लिए, यह तरीका अपनाएं:
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) // Emulates installation of future on demand modules using SplitCompat. SplitCompat.install(this) }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // Emulates installation of future on demand modules using SplitCompat. SplitCompat.install(this); }
अगर आपका ऑन डिमांड मॉड्यूल, इंस्टैंट ऐप्लिकेशन और इंस्टॉल किए गए ऐप्लिकेशन, दोनों के साथ काम करता है, तो SplitCompat को इस तरह से लागू किया जा सकता है:
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) if (!InstantApps.isInstantApp(this)) { SplitCompat.install(this) } }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); if (!InstantApps.isInstantApp(this)) { SplitCompat.install(this); } }
मॉड्यूल की गतिविधियों के लिए SplitCompat चालू करना
अपने बेस ऐप्लिकेशन के लिए SplitCompat चालू करने के बाद, आपको हर उस गतिविधि के लिए SplitCompat चालू करना होगा जिसे आपका ऐप्लिकेशन किसी सुविधा मॉड्यूल में डाउनलोड करता है. इसके लिए, SplitCompat.installActivity()
तरीके का इस्तेमाल करें. इसके लिए, यह तरीका अपनाएं:
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) // Emulates installation of on demand modules using SplitCompat. SplitCompat.installActivity(this) }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // Emulates installation of on demand modules using SplitCompat. SplitCompat.installActivity(this); }
फ़ीचर मॉड्यूल में तय किए गए कॉम्पोनेंट ऐक्सेस करना
किसी फ़ीचर मॉड्यूल में तय की गई गतिविधि शुरू करना
SplitCompat को चालू करने के बाद, startActivity()
का इस्तेमाल करके, फ़ीचर मॉड्यूल में तय की गई गतिविधियों को लॉन्च किया जा सकता है.
Kotlin
startActivity(Intent() .setClassName("com.package", "com.package.module.MyActivity") .setFlags(...))
Java
startActivity(new Intent() .setClassName("com.package", "com.package.module.MyActivity") .setFlags(...));
setClassName
का पहला पैरामीटर, ऐप्लिकेशन का पैकेज नाम होता है. वहीं, दूसरा पैरामीटर गतिविधि का पूरा क्लास नाम होता है.
मांग पर डाउनलोड किए गए किसी फ़ीचर मॉड्यूल में गतिविधि होने पर, आपको गतिविधि में SplitCompat चालू करना होगा.
किसी सुविधा मॉड्यूल में तय की गई सेवा शुरू करना
SplitCompat चालू करने के बाद, फ़ीचर मॉड्यूल में तय की गई सेवाओं को लॉन्च करने के लिए, startService()
का इस्तेमाल किया जा सकता है.
Kotlin
startService(Intent() .setClassName("com.package", "com.package.module.MyService") .setFlags(...))
Java
startService(new Intent() .setClassName("com.package", "com.package.module.MyService") .setFlags(...));
किसी सुविधा वाले मॉड्यूल में तय किए गए कॉम्पोनेंट को एक्सपोर्ट करना
आपको एक्सपोर्ट किए गए Android कॉम्पोनेंट को वैकल्पिक मॉड्यूल में शामिल नहीं करना चाहिए.
बिल्ड सिस्टम, सभी मॉड्यूल के लिए मेनिफ़ेस्ट एंट्री को बेस मॉड्यूल में मर्ज करता है; अगर किसी वैकल्पिक मॉड्यूल में एक्सपोर्ट किया गया कॉम्पोनेंट शामिल है, तो उसे मॉड्यूल इंस्टॉल होने से पहले भी ऐक्सेस किया जा सकता है. साथ ही, किसी दूसरे ऐप्लिकेशन से शुरू किए जाने पर, कोड मौजूद न होने की वजह से क्रैश हो सकता है.
इंटरनल कॉम्पोनेंट के लिए यह समस्या नहीं है. इन्हें सिर्फ़ ऐप्लिकेशन से ऐक्सेस किया जाता है. इसलिए, ऐप्लिकेशन कॉम्पोनेंट को ऐक्सेस करने से पहले, यह देख सकता है कि मॉड्यूल इंस्टॉल है या नहीं.
अगर आपको एक्सपोर्ट किए गए किसी कॉम्पोनेंट की ज़रूरत है और आपको उसका कॉन्टेंट किसी वैकल्पिक मॉड्यूल में रखना है, तो प्रॉक्सी पैटर्न लागू करें.
इसके लिए, बेस में एक्सपोर्ट किया गया प्रॉक्सी कॉम्पोनेंट जोड़ें. जब इसे ऐक्सेस किया जाता है, तो प्रॉक्सी कॉम्पोनेंट उस मॉड्यूल की मौजूदगी की जांच कर सकता है जिसमें कॉन्टेंट मौजूद है. अगर मॉड्यूल मौजूद है, तो प्रॉक्सी कॉम्पोनेंट, मॉड्यूल से इंटरनल कॉम्पोनेंट को Intent
के ज़रिए शुरू कर सकता है. साथ ही, कॉल करने वाले ऐप्लिकेशन से मिले इंटेंट को रिले कर सकता है. अगर मॉड्यूल मौजूद नहीं है, तो कॉम्पोनेंट, मॉड्यूल को डाउनलोड कर सकता है या कॉल करने वाले ऐप्लिकेशन को गड़बड़ी का सही मैसेज भेज सकता है.
इंस्टॉल किए गए मॉड्यूल से कोड और संसाधन ऐक्सेस करना
अगर आपने अपने बेस ऐप्लिकेशन कॉन्टेक्स्ट और फ़ीचर मॉड्यूल में मौजूद गतिविधियों के लिए SplitCompat को चालू किया है, तो आपके पास किसी फ़ीचर मॉड्यूल के कोड और संसाधनों का इस्तेमाल करने का विकल्प होता है. ऐसा तब किया जा सकता है, जब वैकल्पिक मॉड्यूल इंस्टॉल हो चुका हो. इन कोड और संसाधनों का इस्तेमाल, बेस APK के हिस्से के तौर पर किया जा सकता है.
किसी दूसरे मॉड्यूल से ऐक्सेस कोड
किसी मॉड्यूल से बेस कोड ऐक्सेस करना
आपके बेस मॉड्यूल में मौजूद कोड को अन्य मॉड्यूल सीधे तौर पर इस्तेमाल कर सकते हैं. आपको कुछ भी खास करने की ज़रूरत नहीं है. बस उन क्लास को इंपोर्ट करें और उनका इस्तेमाल करें जिनकी आपको ज़रूरत है.
किसी दूसरे मॉड्यूल से मॉड्यूल कोड ऐक्सेस करना
किसी मॉड्यूल के अंदर मौजूद ऑब्जेक्ट या क्लास को सीधे तौर पर किसी दूसरे मॉड्यूल से स्टैटिक तौर पर ऐक्सेस नहीं किया जा सकता. हालांकि, इसे रिफ़्लेक्शन का इस्तेमाल करके, किसी और तरीके से ऐक्सेस किया जा सकता है.
आपको इस बात का ध्यान रखना चाहिए कि ऐसा कितनी बार होता है, क्योंकि रिफ़्लेक्शन की वजह से परफ़ॉर्मेंस पर असर पड़ता है. जटिल इस्तेमाल के उदाहरणों के लिए, Dagger 2 जैसे डिपेंडेंसी इंजेक्शन फ़्रेमवर्क का इस्तेमाल करें. इससे यह पक्का किया जा सकेगा कि ऐप्लिकेशन के पूरे लाइफ़टाइम में, सिर्फ़ एक रिफ़्लेक्शन कॉल किया गया हो.
इंस्टैंटिएशन के बाद ऑब्जेक्ट के साथ इंटरैक्शन को आसान बनाने के लिए, यह सुझाव दिया जाता है कि बेस मॉड्यूल में इंटरफ़ेस और फ़ीचर मॉड्यूल में उसका इस्तेमाल तय किया जाए. उदाहरण के लिए:
Kotlin
// In the base module interface MyInterface { fun hello(): String } // In the feature module object MyInterfaceImpl : MyInterface { override fun hello() = "Hello" } // In the base module, where we want to access the feature module code val stringFromModule = (Class.forName("com.package.module.MyInterfaceImpl") .kotlin.objectInstance as MyInterface).hello();
Java
// In the base module public interface MyInterface { String hello(); } // In the feature module public class MyInterfaceImpl implements MyInterface { @Override public String hello() { return "Hello"; } } // In the base module, where we want to access the feature module code String stringFromModule = ((MyInterface) Class.forName("com.package.module.MyInterfaceImpl").getConstructor().newInstance()).hello();
किसी दूसरे मॉड्यूल से संसाधन और ऐसेट ऐक्सेस करना
किसी मॉड्यूल को इंस्टॉल करने के बाद, मॉड्यूल में मौजूद संसाधनों और ऐसेट को सामान्य तरीके से ऐक्सेस किया जा सकता है. हालांकि, इसके लिए दो बातों का ध्यान रखना होगा:
- अगर किसी संसाधन को किसी दूसरे मॉड्यूल से ऐक्सेस किया जा रहा है, तो मॉड्यूल के पास संसाधन आइडेंटिफ़ायर का ऐक्सेस नहीं होगा. हालांकि, संसाधन को अब भी नाम से ऐक्सेस किया जा सकता है. ध्यान दें कि रिसॉर्स को रेफ़रंस करने के लिए इस्तेमाल किया जाने वाला पैकेज, उस मॉड्यूल का पैकेज होता है जहां रिसॉर्स को तय किया गया है.
- अगर आपको अपने ऐप्लिकेशन के किसी दूसरे इंस्टॉल किए गए मॉड्यूल से, नए इंस्टॉल किए गए मॉड्यूल में मौजूद ऐसेट या संसाधनों को ऐक्सेस करना है, तो आपको ऐसा ऐप्लिकेशन कॉन्टेक्स्ट का इस्तेमाल करके करना होगा. संसाधनों को ऐक्सेस करने वाले कॉम्पोनेंट का कॉन्टेक्स्ट, अभी अपडेट नहीं किया जाएगा. इसके अलावा, सुविधा मॉड्यूल इंस्टॉल होने के बाद, उस कॉम्पोनेंट को फिर से बनाया जा सकता है. उदाहरण के लिए, Activity.recreate() को कॉल करना या उस पर SplitCompat को फिर से इंस्टॉल करना.
मांग पर डिलीवरी की सुविधा का इस्तेमाल करके, किसी ऐप्लिकेशन में नेटिव कोड लोड करना
हमारा सुझाव है कि फ़ीचर मॉड्यूल की ऑन-डिमांड डिलीवरी का इस्तेमाल करते समय, अपनी सभी नेटिव लाइब्रेरी लोड करने के लिए ReLinker का इस्तेमाल करें. ReLinker, फ़ीचर मॉड्यूल इंस्टॉल करने के बाद नेटिव लाइब्रेरी लोड करने से जुड़ी समस्या को ठीक करता है. Android JNI के बारे में सलाह में जाकर, ReLinker के बारे में ज़्यादा जानें.
किसी वैकल्पिक मॉड्यूल से नेटिव कोड लोड करना
स्प्लिट इंस्टॉल हो जाने के बाद, हमारा सुझाव है कि आप ReLinker के ज़रिए, उसके नेटिव कोड को लोड करें. इंस्टेंट ऐप्लिकेशन के लिए, आपको इस खास तरीके का इस्तेमाल करना चाहिए.
अगर नेटिव कोड लोड करने के लिए System.loadLibrary()
का इस्तेमाल किया जा रहा है और आपकी नेटिव लाइब्रेरी, मॉड्यूल में मौजूद किसी दूसरी लाइब्रेरी पर निर्भर है, तो आपको उस दूसरी लाइब्रेरी को मैन्युअल तरीके से लोड करना होगा.
अगर ReLinker का इस्तेमाल किया जा रहा है, तो इसके लिए Relinker.recursively().loadLibrary()
का इस्तेमाल करें.
अगर किसी वैकल्पिक मॉड्यूल में तय की गई लाइब्रेरी को लोड करने के लिए, नेटिव कोड में dlopen()
का इस्तेमाल किया जा रहा है, तो यह लाइब्रेरी के रिलेटिव पाथ के साथ काम नहीं करेगा.
सबसे अच्छा तरीका यह है कि Java कोड से लाइब्रेरी का पूरा पाथ ClassLoader.findLibrary()
के ज़रिए वापस पाएं. इसके बाद, इसे अपने dlopen()
कॉल में इस्तेमाल करें.
नेटिव कोड डालने से पहले ऐसा करें या अपने नेटिव कोड से Java में JNI कॉल का इस्तेमाल करें.
इंस्टॉल किए गए Android Instant Apps को ऐक्सेस करना
जब कोई Android झटपट ऐप्लिकेशन मॉड्यूल INSTALLED
के तौर पर रिपोर्ट करता है, तब रीफ़्रेश किए गए ऐप्लिकेशन कॉन्टेक्स्ट का इस्तेमाल करके, उसके कोड और संसाधनों को ऐक्सेस किया जा सकता है. आपका ऐप्लिकेशन, मॉड्यूल इंस्टॉल करने से पहले एक कॉन्टेक्स्ट बनाता है. उदाहरण के लिए, ऐसा कॉन्टेक्स्ट जो पहले से किसी वैरिएबल में सेव है. इसमें नए मॉड्यूल का कॉन्टेंट शामिल नहीं होता. हालांकि, नए कॉन्टेक्स्ट से ऐसा किया जा सकता है. उदाहरण के लिए, createPackageContext
का इस्तेमाल करके, इसे हासिल किया जा सकता है.
Kotlin
// Generate a new context as soon as a request for a new module // reports as INSTALLED. override fun onStateUpdate(state: SplitInstallSessionState ) { if (state.sessionId() == mySessionId) { when (state.status()) { ... SplitInstallSessionStatus.INSTALLED -> { val newContext = context.createPackageContext(context.packageName, 0) // If you use AssetManager to access your app’s raw asset files, you’ll need // to generate a new AssetManager instance from the updated context. val am = newContext.assets } } } }
Java
// Generate a new context as soon as a request for a new module // reports as INSTALLED. @Override public void onStateUpdate(SplitInstallSessionState state) { if (state.sessionId() == mySessionId) { switch (state.status()) { ... case SplitInstallSessionStatus.INSTALLED: Context newContext = context.createPackageContext(context.getPackageName(), 0); // If you use AssetManager to access your app’s raw asset files, you’ll need // to generate a new AssetManager instance from the updated context. AssetManager am = newContext.getAssets(); } } }
Android 8.0 और इसके बाद के वर्शन पर Android Instant Apps
Android 8.0 (एपीआई लेवल 26) और उसके बाद के वर्शन पर, Android Instant App के लिए ऑन डिमांड मॉड्यूल का अनुरोध करते समय, इंस्टॉल करने का अनुरोध INSTALLED
के तौर पर रिपोर्ट होने के बाद, आपको SplitInstallHelper.updateAppInfo(Context context)
को कॉल करके, नए मॉड्यूल के कॉन्टेक्स्ट के साथ ऐप्लिकेशन को अपडेट करना होगा.
ऐसा न करने पर, ऐप्लिकेशन को मॉड्यूल के कोड और संसाधनों के बारे में जानकारी नहीं मिलेगी. ऐप्लिकेशन का मेटाडेटा अपडेट करने के बाद, आपको अगले मुख्य थ्रेड इवेंट के दौरान मॉड्यूल का कॉन्टेंट लोड करना चाहिए. इसके लिए, यहां दिखाए गए तरीके से नया Handler
लागू करें:
Kotlin
override fun onStateUpdate(state: SplitInstallSessionState ) { if (state.sessionId() == mySessionId) { when (state.status()) { ... SplitInstallSessionStatus.INSTALLED -> { // You need to perform the following only for Android Instant Apps // running on Android 8.0 (API level 26) and higher. if (BuildCompat.isAtLeastO()) { // Updates the app’s context with the code and resources of the // installed module. SplitInstallHelper.updateAppInfo(context) Handler().post { // Loads contents from the module using AssetManager val am = context.assets ... } } } } } }
Java
@Override public void onStateUpdate(SplitInstallSessionState state) { if (state.sessionId() == mySessionId) { switch (state.status()) { ... case SplitInstallSessionStatus.INSTALLED: // You need to perform the following only for Android Instant Apps // running on Android 8.0 (API level 26) and higher. if (BuildCompat.isAtLeastO()) { // Updates the app’s context with the code and resources of the // installed module. SplitInstallHelper.updateAppInfo(context); new Handler().post(new Runnable() { @Override public void run() { // Loads contents from the module using AssetManager AssetManager am = context.getAssets(); ... } }); } } } }
C/C++ लाइब्रेरी लोड करना
अगर आपको किसी ऐसे मॉड्यूल से C/C++ लाइब्रेरी लोड करनी हैं जिसे डिवाइस ने इंस्टेंट ऐप्लिकेशन में पहले ही डाउनलोड कर लिया है, तो नीचे दिए गए तरीके से SplitInstallHelper.loadLibrary(Context context, String libName)
का इस्तेमाल करें:
Kotlin
override fun onStateUpdate(state: SplitInstallSessionState) { if (state.sessionId() == mySessionId) { when (state.status()) { SplitInstallSessionStatus.INSTALLED -> { // Updates the app’s context as soon as a module is installed. val newContext = context.createPackageContext(context.packageName, 0) // To load C/C++ libraries from an installed module, use the following API // instead of System.load(). SplitInstallHelper.loadLibrary(newContext, “my-cpp-lib”) ... } } } }
Java
public void onStateUpdate(SplitInstallSessionState state) { if (state.sessionId() == mySessionId) { switch (state.status()) { case SplitInstallSessionStatus.INSTALLED: // Updates the app’s context as soon as a module is installed. Context newContext = context.createPackageContext(context.getPackageName(), 0); // To load C/C++ libraries from an installed module, use the following API // instead of System.load(). SplitInstallHelper.loadLibrary(newContext, “my-cpp-lib”); ... } } }
सीमाएं
- Android WebView का इस्तेमाल ऐसी गतिविधि में नहीं किया जा सकता जो किसी वैकल्पिक मॉड्यूल से संसाधन या ऐसेट ऐक्सेस करती है. ऐसा Android API लेवल 28 और इससे पहले के वर्शन पर, WebView और SplitCompat के बीच काम न करने की वजह से होता है.
- अपने ऐप्लिकेशन में, Android
ApplicationInfo
ऑब्जेक्ट, उनके कॉन्टेंट या उन्हें शामिल करने वाले ऑब्जेक्ट को कैश मेमोरी में सेव नहीं किया जा सकता. आपको इन ऑब्जेक्ट को हमेशा ऐप्लिकेशन के संदर्भ से ज़रूरत के हिसाब से फ़ेच करना चाहिए. ऐसे ऑब्जेक्ट को कैश मेमोरी में सेव करने से, फ़ीचर मॉड्यूल इंस्टॉल करते समय ऐप्लिकेशन क्रैश हो सकता है.
इंस्टॉल किए गए मॉड्यूल मैनेज करना
डिवाइस पर फ़िलहाल कौनसे फ़ीचर मॉड्यूल इंस्टॉल हैं, यह देखने के लिए
SplitInstallManager.getInstalledModules()
को कॉल किया जा सकता है. इससे इंस्टॉल किए गए मॉड्यूल के नामों का Set<String>
मिलता है. यह जानकारी नीचे दिखाई गई है.
Kotlin
val installedModules: Set<String> = splitInstallManager.installedModules
Java
Set<String> installedModules = splitInstallManager.getInstalledModules();
मॉड्यूल अनइंस्टॉल करना
डिवाइस से मॉड्यूल अनइंस्टॉल करने का अनुरोध करने के लिए, SplitInstallManager.deferredUninstall(List<String> moduleNames)
को शुरू करें. इसके लिए, यहां दिया गया तरीका अपनाएं.
Kotlin
// Specifies two feature modules for deferred uninstall. splitInstallManager.deferredUninstall(listOf("pictureMessages", "promotionalFilters"))
Java
// Specifies two feature modules for deferred uninstall. splitInstallManager.deferredUninstall(Arrays.asList("pictureMessages", "promotionalFilters"));
मॉड्यूल को तुरंत अनइंस्टॉल नहीं किया जाता. इसका मतलब है कि डिवाइस, स्टोरेज की जगह बचाने के लिए, ज़रूरत के हिसाब से उन्हें बैकग्राउंड में अनइंस्टॉल कर देता है.
पिछले सेक्शन में बताए गए तरीके के मुताबिक, SplitInstallManager.getInstalledModules()
को चालू करके और नतीजे की जांच करके, यह पुष्टि की जा सकती है कि डिवाइस ने मॉड्यूल मिटा दिया है.
अन्य भाषाओं के संसाधन डाउनलोड करना
ऐप्लिकेशन बंडल की मदद से, डिवाइस सिर्फ़ उस कोड और रिसॉर्स को डाउनलोड करते हैं जिनकी ज़रूरत उन्हें आपका ऐप्लिकेशन चलाने के लिए होती है. इसलिए, भाषा के संसाधनों के लिए, किसी व्यक्ति का डिवाइस सिर्फ़ आपके ऐप्लिकेशन के उन भाषा संसाधनों को डाउनलोड करता है जो डिवाइस की सेटिंग में चुनी गई एक या उससे ज़्यादा भाषाओं से मेल खाते हैं.
अगर आपको अपने ऐप्लिकेशन में दूसरी भाषाओं के संसाधन ऐक्सेस करने हैं, तो Play Feature Delivery Library का इस्तेमाल करें. उदाहरण के लिए, ऐप्लिकेशन में भाषा चुनने की सुविधा लागू करने के लिए, इस लाइब्रेरी का इस्तेमाल करके ज़रूरत के हिसाब से संसाधन डाउनलोड किए जा सकते हैं. यह प्रोसेस, फ़ीचर मॉड्यूल डाउनलोड करने की प्रोसेस जैसी ही होती है. इसे यहां दिखाया गया है.
Kotlin
// Captures the user’s preferred language and persists it // through the app’s SharedPreferences. sharedPrefs.edit().putString(LANGUAGE_SELECTION, "fr").apply() ... // Creates a request to download and install additional language resources. val request = SplitInstallRequest.newBuilder() // Uses the addLanguage() method to include French language resources in the request. // Note that country codes are ignored. That is, if your app // includes resources for “fr-FR” and “fr-CA”, resources for both // country codes are downloaded when requesting resources for "fr". .addLanguage(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))) .build() // Submits the request to install the additional language resources. splitInstallManager.startInstall(request)
Java
// Captures the user’s preferred language and persists it // through the app’s SharedPreferences. sharedPrefs.edit().putString(LANGUAGE_SELECTION, "fr").apply(); ... // Creates a request to download and install additional language resources. SplitInstallRequest request = SplitInstallRequest.newBuilder() // Uses the addLanguage() method to include French language resources in the request. // Note that country codes are ignored. That is, if your app // includes resources for “fr-FR” and “fr-CA”, resources for both // country codes are downloaded when requesting resources for "fr". .addLanguage(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))) .build(); // Submits the request to install the additional language resources. splitInstallManager.startInstall(request);
अनुरोध को इस तरह से हैंडल किया जाता है जैसे कि यह किसी सुविधा वाले मॉड्यूल का अनुरोध हो. इसका मतलब है कि, अनुरोध की स्थिति को मॉनिटर किया जा सकता है.
अगर आपके ऐप्लिकेशन को तुरंत अतिरिक्त भाषा संसाधनों की ज़रूरत नहीं है, तो ऐप्लिकेशन के बैकग्राउंड में होने पर, इंस्टॉलेशन को टाला जा सकता है. इसके बारे में यहां बताया गया है.
Kotlin
splitInstallManager.deferredLanguageInstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)))
Java
splitInstallManager.deferredLanguageInstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)));
डाउनलोड किए गए भाषा संसाधनों को ऐक्सेस करना
डाउनलोड किए गए भाषा संसाधनों को ऐक्सेस करने के लिए, आपके ऐप्लिकेशन को हर उस गतिविधि के attachBaseContext()
तरीके में SplitCompat.installActivity()
तरीके को चलाना होगा जिसे उन संसाधनों को ऐक्सेस करने की ज़रूरत है. इसे यहां दिखाया गया है.
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) SplitCompat.installActivity(this) }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); SplitCompat.installActivity(this); }
ऐसी हर गतिविधि के लिए भाषा के संसाधनों का इस्तेमाल करें जिन्हें आपके ऐप्लिकेशन ने डाउनलोड किया है. इसके लिए, बेस कॉन्टेक्स्ट को अपडेट करें और इसके Configuration
के ज़रिए नया स्थान-भाषा सेट करें:
Kotlin
override fun attachBaseContext(base: Context) { val configuration = Configuration() configuration.setLocale(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))) val context = base.createConfigurationContext(configuration) super.attachBaseContext(context) SplitCompat.install(this) }
Java
@Override protected void attachBaseContext(Context base) { Configuration configuration = new Configuration(); configuration.setLocale(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))); Context context = base.createConfigurationContext(configuration); super.attachBaseContext(context); SplitCompat.install(this); }
इन बदलावों को लागू करने के लिए, आपको नई भाषा इंस्टॉल होने के बाद अपनी गतिविधि फिर से बनानी होगी. Activity#recreate()
तरीके का इस्तेमाल किया जा सकता है.
Kotlin
when (state.status()) { SplitInstallSessionStatus.INSTALLED -> { // Recreates the activity to load resources for the new language // preference. activity.recreate() } ... }
Java
switch (state.status()) { case SplitInstallSessionStatus.INSTALLED: // Recreates the activity to load resources for the new language // preference. activity.recreate(); ... }
अतिरिक्त भाषा के संसाधन अनइंस्टॉल करना
फ़ीचर मॉड्यूल की तरह, अतिरिक्त संसाधनों को कभी भी अनइंस्टॉल किया जा सकता है. अनइंस्टॉल करने का अनुरोध करने से पहले, यह पता लगाया जा सकता है कि फ़िलहाल कौनसी भाषाएं इंस्टॉल हैं. इसके लिए, यह तरीका अपनाएं.
Kotlin
val installedLanguages: Set<String> = splitInstallManager.installedLanguages
Java
Set<String> installedLanguages = splitInstallManager.getInstalledLanguages();
इसके बाद, deferredLanguageUninstall()
तरीके का इस्तेमाल करके, यह तय किया जा सकता है कि किन भाषाओं को अनइंस्टॉल करना है. इसके बारे में यहां बताया गया है.
Kotlin
splitInstallManager.deferredLanguageUninstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)))
Java
splitInstallManager.deferredLanguageUninstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)));
मॉड्यूल इंस्टॉल करने की सुविधा को स्थानीय तौर पर टेस्ट करना
Play Feature Delivery Library की मदद से, Play Store से कनेक्ट किए बिना ही, अपने ऐप्लिकेशन की इन सुविधाओं को स्थानीय तौर पर टेस्ट किया जा सकता है:
- मॉड्यूल इंस्टॉल करने का अनुरोध करें और उन्हें मॉनिटर करें.
- ऐप्लिकेशन इंस्टॉल करने में आने वाली गड़बड़ियों को ठीक करना.
- मॉड्यूल ऐक्सेस करने के लिए,
SplitCompat
का इस्तेमाल करें.
इस पेज पर, आपके टेस्ट डिवाइस पर ऐप्लिकेशन के स्प्लिट APK डिप्लॉय करने का तरीका बताया गया है. इससे Play Feature Delivery, Play Store से मॉड्यूल का अनुरोध करने, उन्हें डाउनलोड करने, और इंस्टॉल करने के लिए, उन APK का अपने-आप इस्तेमाल कर सकेगा.
हालांकि, आपको अपने ऐप्लिकेशन के लॉजिक में कोई बदलाव करने की ज़रूरत नहीं है, लेकिन आपको ये ज़रूरी शर्तें पूरी करनी होंगी:
bundletool
का नया वर्शन डाउनलोड और इंस्टॉल करें. आपको अपने ऐप्लिकेशन के बंडल से इंस्टॉल किए जा सकने वाले APK का नया सेट बनाने के लिए,bundletool
की ज़रूरत होगी.
APK का सेट बनाना
अगर आपने अब तक ऐसा नहीं किया है, तो अपने ऐप्लिकेशन के स्प्लिट एपीके बनाएं. इसके लिए, यह तरीका अपनाएं:
- इनमें से किसी एक तरीके का इस्तेमाल करके, अपने ऐप्लिकेशन के लिए ऐप्लिकेशन बंडल बनाएं:
- Android Studio और Gradle के लिए Android प्लग इन का इस्तेमाल करके, Android ऐप्लिकेशन बंडल बनाएं और उस पर हस्ताक्षर करें.
- कमांड लाइन से अपना ऐप्लिकेशन बंडल बनाएं.
bundletool
का इस्तेमाल करके, सभी डिवाइस कॉन्फ़िगरेशन के लिए एपीके का सेट जनरेट करें. इसके लिए, यह कमांड इस्तेमाल करें:bundletool build-apks --local-testing --bundle my_app.aab --output my_app.apks
--local-testing
फ़्लैग, आपके APK के मेनिफ़ेस्ट में मेटा-डेटा शामिल करता है. इससे Play Feature Delivery Library को यह पता चलता है कि Play Store से कनेक्ट किए बिना, फ़ीचर मॉड्यूल इंस्टॉल करने की जांच करने के लिए, लोकल स्प्लिट APK का इस्तेमाल करना है.
अपने ऐप्लिकेशन को डिवाइस पर डिप्लॉय करना
--local-testing
फ़्लैग का इस्तेमाल करके, APK का सेट बनाने के बाद, अपने ऐप्लिकेशन का बेस वर्शन इंस्टॉल करने के लिए bundletool
का इस्तेमाल करें. साथ ही, अतिरिक्त APK को अपने डिवाइस के लोकल स्टोरेज में ट्रांसफ़र करें. इन दोनों कार्रवाइयों को इस कमांड की मदद से किया जा सकता है:
bundletool install-apks --apks my_app.apks
अब जब ऐप्लिकेशन शुरू किया जाता है और सुविधा वाले मॉड्यूल को डाउनलोड और इंस्टॉल करने के लिए उपयोगकर्ता फ़्लो पूरा किया जाता है, तो Play Feature Delivery Library उन APK का इस्तेमाल करती है जिन्हें bundletool
ने डिवाइस के लोकल स्टोरेज में ट्रांसफ़र किया था.
नेटवर्क की गड़बड़ी का सिम्युलेट करना
Play Store से मॉड्यूल इंस्टॉल करने की प्रोसेस को सिम्युलेट करने के लिए, Play Feature Delivery Library, SplitInstallManager
के बजाय FakeSplitInstallManager
का इस्तेमाल करती है. इससे मॉड्यूल का अनुरोध किया जाता है. --local-testing
फ़्लैग के साथ bundletool
का इस्तेमाल करके, APK का सेट बनाया जाता है और उन्हें अपने टेस्ट डिवाइस पर डिप्लॉय किया जाता है. इसमें ऐसा मेटाडेटा शामिल होता है जो Play Feature Delivery Library को यह निर्देश देता है कि वह आपके ऐप्लिकेशन के एपीआई कॉल को अपने-आप SplitInstallManager
के बजाय FakeSplitInstallManager
पर स्विच कर दे.
FakeSplitInstallManager
में एक बूलियन फ़्लैग शामिल होता है. इसे चालू करके, अगली बार जब आपका ऐप्लिकेशन किसी मॉड्यूल को इंस्टॉल करने का अनुरोध करेगा, तब नेटवर्क की गड़बड़ी का सिम्युलेट किया जा सकता है. अपने टेस्ट में FakeSplitInstallManager
को ऐक्सेस करने के लिए, FakeSplitInstallManagerFactory
का इस्तेमाल करके इसका इंस्टेंस पाया जा सकता है. इसके बारे में यहां बताया गया है:
Kotlin
// Creates an instance of FakeSplitInstallManager with the app's context. val fakeSplitInstallManager = FakeSplitInstallManagerFactory.create(context) // Tells Play Feature Delivery Library to force the next module request to // result in a network error. fakeSplitInstallManager.setShouldNetworkError(true)
Java
// Creates an instance of FakeSplitInstallManager with the app's context. FakeSplitInstallManager fakeSplitInstallManager = FakeSplitInstallManagerFactory.create(context); // Tells Play Feature Delivery Library to force the next module request to // result in a network error. fakeSplitInstallManager.setShouldNetworkError(true);