मांग पर डिलीवरी कॉन्फ़िगर करना

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

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

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

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

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

मांग पर डिलीवरी के लिए एक नया मॉड्यूल कॉन्फ़िगर करें

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

Android Studio का इस्तेमाल करके, अपने ऐप्लिकेशन प्रोजेक्ट में सुविधा मॉड्यूल जोड़ने के लिए, यह तरीका अपनाएं:

  1. अगर आपने अब तक ऐसा नहीं किया है, तो IDE में अपना ऐप्लिकेशन प्रोजेक्ट खोलें.
  2. मेन्यू बार में जाकर, फ़ाइल > नया > नया मॉड्यूल चुनें.
  3. नया मॉड्यूल बनाएं डायलॉग में, डाइनैमिक फ़ीचर मॉड्यूल और आगे बढ़ें पर क्लिक करें.
  4. अपना नया मॉड्यूल कॉन्फ़िगर करें सेक्शन में, ये काम करें:
    1. ड्रॉपडाउन मेन्यू से, अपने ऐप्लिकेशन प्रोजेक्ट के लिए बेस ऐप्लिकेशन मॉड्यूल चुनें.
    2. किसी मॉड्यूल का नाम तय करें. आईडीई इस नाम का इस्तेमाल, मॉड्यूल का Gradle सबप्रोजेक्ट Gredle की सेटिंग फ़ाइल. ऐप्लिकेशन बंडल बनाने पर, Gradle सुविधा वाले मॉड्यूल के मेनिफ़ेस्ट में <manifest split> एट्रिब्यूट को इंजेक्ट करने के लिए, सब-प्रोजेक्ट के नाम के आखिरी एलिमेंट का इस्तेमाल करता है.
    3. मॉड्यूल का पैकेज का नाम बताएं. डिफ़ॉल्ट रूप से, Android Studio एक ऐसे पैकेज नाम का सुझाव देता है, जो बेस मॉड्यूल और पिछले चरण में तय किए गए मॉड्यूल के नाम की जानकारी दें.
    4. वह कम से कम एपीआई लेवल चुनें जिस पर आपको मॉड्यूल का इस्तेमाल करना है. यह वैल्यू, बेस मॉड्यूल की वैल्यू से मेल खानी चाहिए.
  5. आगे बढ़ें पर क्लिक करें.
  6. मॉड्यूल डाउनलोड करने के विकल्प सेक्शन में, ये काम करें:

    1. मॉड्यूल का टाइटल तय करने के लिए, ज़्यादा से ज़्यादा 50 वर्ण इस्तेमाल करें. प्लैटफ़ॉर्म इस शीर्षक का इस्तेमाल करके उपयोगकर्ताओं को मॉड्यूल की पहचान करता है. उदाहरण के लिए, यह पुष्टि करता है कि उपयोगकर्ता मॉड्यूल डाउनलोड करना चाहता है या नहीं. इसके लिए की वजह है, तो आपके ऐप्लिकेशन के बेस मॉड्यूल में, मॉड्यूल के टाइटल को string रिसॉर्स में देखा जा सकता है, जिसे अनुवाद कर सकते हैं. Android Studio का इस्तेमाल करके मॉड्यूल बनाते समय, IDE आपके लिए बेस मॉड्यूल में स्ट्रिंग रिसॉर्स जोड़ता है. साथ ही, सुविधा मॉड्यूल के मेनिफ़ेस्ट में यह एंट्री इंजेक्ट करता है:

      <dist:module
          ...
          dist:title="@string/feature_title">
      </dist:module>
      
    2. इंस्टॉल के समय शामिल करना में मौजूद ड्रॉपडाउन मेन्यू में, इंस्टॉल के समय मॉड्यूल शामिल न करें चुनें. आपकी पसंद को दिखाने के लिए, Android Studio मॉड्यूल के मेनिफ़ेस्ट में ये चीज़ें इंजेक्ट करता है:

      <dist:module ... >
        <dist:delivery>
            <dist:on-demand/>
        </dist:delivery>
      </dist:module>
      
    3. अगर आपको यह मॉड्यूल उपलब्ध कराना है, तो Fused के बगल में मौजूद बॉक्स को चुनें Android 4.4 (एपीआई लेवल 20) और इससे पहले के वर्शन वाले डिवाइसों के लिए, जिनमें यह शामिल है मल्टी-APK. इसका मतलब है कि इस मॉड्यूल के लिए, मांग पर व्यवहार की सुविधा को चालू किया जा सकता है और नए डिवाइस पर काम न करने वाले डिवाइस से हटाने के लिए, फ़्यूज़िंग को बंद करें विभाजित APK डाउनलोड और इंस्टॉल करना. आपकी पसंद को दिखाने के लिए, Android Studio मॉड्यूल के मेनिफ़ेस्ट में ये चीज़ें इंजेक्ट करता है:

      <dist:module ...>
          <dist:fusing dist:include="true | false" />
      </dist:module>
      
  7. पूरा करें पर क्लिक करें.

Android Studio आपका मॉड्यूल बनाने के बाद, इसके कॉन्टेंट की जांच करें खुद को प्रोजेक्ट पैनल से हटाएं (व्यू > टूल Windows > प्रोजेक्ट चुनें डालें). डिफ़ॉल्ट कोड, रिसॉर्स, और संगठन, स्टैंडर्ड ऐप्लिकेशन मॉड्यूल के जैसे होने चाहिए.

इसके बाद, आपको Play Feature Delivery लाइब्रेरी का इस्तेमाल करके, मांग पर इंस्टॉल करने की सुविधा लागू करनी होगी.

अपने प्रोजेक्ट में Play Feature Delivery लाइब्रेरी शामिल करना

शुरू करने से पहले, आपको अपने प्रोजेक्ट में सबसे पहले Play की सुविधा डिलीवरी लाइब्रेरी जोड़नी होगी.

मांग पर उपलब्ध मॉड्यूल का अनुरोध करना

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

उदाहरण के लिए, किसी ऐसे ऐप्लिकेशन पर विचार करें जिसमें डिवाइस के कैमरे का इस्तेमाल करके फ़ोटो मैसेज कैप्चर करने और भेजने के लिए, ऑन डिमांड मॉड्यूल हो. साथ ही, यह ऑन डिमांड मॉड्यूल अपने मेनिफ़ेस्ट में split="pictureMessages" की जानकारी देता हो. यहां दिए गए सैंपल में, pictureMessages मॉड्यूल का अनुरोध करने के लिए SplitInstallManager का इस्तेमाल किया गया है. साथ ही, कुछ प्रमोशनल फ़िल्टर के लिए एक अतिरिक्त मॉड्यूल भी इस्तेमाल किया गया है:

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

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

मॉड्यूल के कोड और संसाधनों का ऐक्सेस पाने के लिए, आपके ऐप्लिकेशन को SplitCompat चालू करें. ध्यान दें कि SplitCompat के तौर पर Android Instant Apps के लिए ज़रूरी है.

मांग पर उपलब्ध मॉड्यूल के इंस्टॉलेशन को रोकें

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

किसी मॉड्यूल को बाद में डाउनलोड करने के लिए, 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 अनुरोध अस्वीकार कर दिया गया है, क्योंकि पहले से कम से कम एक अनुरोध पहले से मौजूद है अनुरोध है जो अभी डाउनलोड हो रहा है. देखें कि क्या कोई अनुरोध अब भी डाउनलोड हो रहा है, जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है.
मोड उपलब्ध नहीं है Google Play, ऐप्लिकेशन, डिवाइस, और उपयोगकर्ता के Google Play खाते के मौजूदा वर्शन के आधार पर, अनुरोध किया गया मॉड्यूल नहीं ढूंढ पा रहा है. अगर उपयोगकर्ता के पास मॉड्यूल का ऐक्सेस नहीं है, तो उसे इसकी सूचना दें.
अमान्य_अनुरोध Google Play को अनुरोध मिला, लेकिन अनुरोध मान्य नहीं है. पुष्टि करें कि अनुरोध में दी गई जानकारी पूरी और सटीक हो.
SESSION_NOT_FOUND किसी सेशन आईडी के लिए सेशन नहीं मिला. अगर आपको किसी अनुरोध की स्थिति पर नज़र रखना है अपने सेशन आईडी के मुताबिक, पक्का करें कि सेशन आईडी सही है.
API_NOT_AVAILABLE आपके मौजूदा डिवाइस पर, Play की सुविधा डिलीवरी लाइब्रेरी काम नहीं करती. इसका मतलब है कि डिवाइस, मांग पर सुविधाओं को डाउनलोड और इंस्टॉल नहीं कर पा रहा है. Android 4.4 (एपीआई लेवल 20) या इससे पहले के वर्शन वाले डिवाइसों के लिए, आपको dist:fusing मेनिफ़ेस्ट प्रॉपर्टी का इस्तेमाल करके, इंस्टॉल के समय सुविधा वाले मॉड्यूल शामिल करने चाहिए. ज़्यादा जानने के लिए, सुविधा मॉड्यूल मेनिफ़ेस्ट के बारे में पढ़ें.
नेटवर्क गड़बड़ी नेटवर्क की गड़बड़ी की वजह से अनुरोध पूरा नहीं किया जा सका. उपयोगकर्ता को इंटरनेट से कनेक्ट करने का निर्देश दें या किसी दूसरे नेटवर्क से कनेक्ट करने की कोशिश करें.
ACCESS_DENIED ज़रूरी अनुमतियां न होने की वजह से, ऐप्लिकेशन अनुरोध को रजिस्टर नहीं कर पा रहा है. ऐसा आम तौर पर तब होता है, जब ऐप्लिकेशन बैकग्राउंड में चल रहा हो. ऐप्लिकेशन के फ़ोरग्राउंड में वापस आने पर, अनुरोध करें.
INCOMPATIBLE_WITH_EXISTING_SESSION अनुरोध में एक या उससे ज़्यादा ऐसे मॉड्यूल हैं जो पहले ही अनुरोध किया गया है, लेकिन अभी तक इंस्टॉल नहीं किया गया है. नया अनुरोध बनाएं. इसमें वे मॉड्यूल शामिल न करें जिनका अनुरोध आपके ऐप्लिकेशन ने पहले ही किया है. इसके अलावा, अनुरोध फिर से करने से पहले, उन सभी मॉड्यूल के इंस्टॉल होने का इंतज़ार करें जिनका अनुरोध किया गया है.

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

सेवा_दी गई अनुरोध को हैंडल करने वाली सेवा बंद हो गई है. फिर से अनुरोध करें.

आपके SplitInstallStateUpdatedListener को इस गड़बड़ी कोड के साथ SplitInstallSessionState, स्थिति FAILED और सेशन आईडी -1.

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

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

उपयोगकर्ता की पुष्टि पाएं

कुछ मामलों में, हो सकता है कि Google Play डाउनलोड करने का अनुरोध. उदाहरण के लिए, अगर Google ने आपके ऐप्लिकेशन को इंस्टॉल नहीं किया है चलाएं या मोबाइल डेटा का इस्तेमाल करके बहुत ज़्यादा वीडियो डाउनलोड करने की कोशिश करें. ऐसे मामलों में, अनुरोध की रिपोर्ट 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 नतीजे API देखें.

उपयोगकर्ता के जवाब के आधार पर अनुरोध की स्थिति अपडेट की जाती है:

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

उपयोगकर्ता के जवाब के साथ कॉलबैक पाने के लिए, ऐक्टिविटी डेटाकॉलबैक, जैसा कि नीचे दिखाया गया है.

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 को भी चालू किया जा सकता है. इसमें शामिल गतिविधियों को लॉन्च करने के लिए, SplitCompat को इस तरह चालू करना ज़रूरी है सुविधा वाले मॉड्यूल. ऐसा करने के लिए, नीचे बताए गए तरीके से attachBaseContext को बदलें.

अगर आपके पास कस्टम Application क्लास है, तो इसके बजाय इसे बढ़ाने के लिए कहो SplitCompatApplication अगर आपको अपने ऐप्लिकेशन के लिए SplitCompat चालू करना है, तो नीचे दिया गया तरीका अपनाएं:

Kotlin

class MyApplication : SplitCompatApplication() {
    ...
}

Java

public class MyApplication extends SplitCompatApplication {
    ...
}

SplitCompatApplication, SplitCompat.install(Context applicationContext) को शामिल करने के लिए ContextWrapper.attachBaseContext() को बदल देता है. अगर आपको अपनी 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() का इस्तेमाल किया जा रहा है, तो यह रिलेटिव लाइब्रेरी पाथ के साथ काम नहीं करेगा. सबसे अच्छा तरीका यह है कि ClassLoader.findLibrary() के ज़रिए, Java कोड से लाइब्रेरी का पूरा पाथ पाएं. इसके बाद, dlopen() कॉल में इसका इस्तेमाल करें. नेटिव कोड डालने से पहले ऐसा करें या अपने नेटिव कोड से Java में JNI कॉल का इस्तेमाल करें.

इंस्टॉल किए गए Android Instant Apps ऐक्सेस करना

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

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);
}

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

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

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

हालांकि, आपको अपने ऐप्लिकेशन के लॉजिक में कोई बदलाव करने की ज़रूरत नहीं है, लेकिन आपको ये ज़रूरी शर्तें पूरी करते हों:

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

APK का सेट बनाना

अगर आपने पहले से ऐसा नहीं किया है, तो यहां बताए गए तरीके से अपने ऐप्लिकेशन के लिए स्प्लिट APK बनाएं:

  1. इनमें से किसी एक तरीके का इस्तेमाल करके, अपने ऐप्लिकेशन के लिए ऐप्लिकेशन बंडल बनाएं:
  2. इसका सेट जनरेट करने के लिए bundletool का इस्तेमाल करें सभी डिवाइस के लिए APKs कॉन्फ़िगरेशन:

    bundletool build-apks --local-testing
      --bundle my_app.aab
      --output my_app.apks
    

--local-testing फ़्लैग में आपके APK के मेनिफ़ेस्ट में मौजूद मेटाडेटा शामिल होता है. इससे Play Feature Delivery लाइब्रेरी को पता चलता है कि Play Store से कनेक्ट किए बिना, सुविधा वाले मॉड्यूल इंस्टॉल करने के लिए, अलग-अलग हिस्सों में बंटे APK का इस्तेमाल कैसे करना है.

अपने ऐप्लिकेशन को डिवाइस पर डिप्लॉय करना

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

bundletool install-apks --apks my_app.apks

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

नेटवर्क की गड़बड़ी को सिम्युलेट करें

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