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

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

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

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

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

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

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

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

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

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

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

मेनिफ़ेस्ट में 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 बस 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);
}

सुविधा वाले मॉड्यूल में तय किए गए कॉम्पोनेंट को ऐक्सेस करें

किसी सुविधा मॉड्यूल में तय की गई कोई गतिविधि शुरू करना

सुविधा वाले मॉड्यूल में तय की गई गतिविधियां लॉन्च करने के लिए, इनका इस्तेमाल किया जा सकता है 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 चालू करें.

किसी फ़ीचर मॉड्यूल में तय की गई सेवा शुरू करना

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

किसी दूसरे मॉड्यूल से कोड ऐक्सेस करें

किसी मॉड्यूल से बेस कोड ऐक्सेस करना

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

किसी दूसरे मॉड्यूल से मॉड्यूल कोड ऐक्सेस करें

किसी मॉड्यूल के अंदर मौजूद किसी ऑब्जेक्ट या क्लास को स्टैटिक रूप से किसी दूसरे ऑब्जेक्ट से ऐक्सेस नहीं किया जा सकता मॉड्यूल को सीधे तौर पर ऐक्सेस नहीं किया जा सकता. हालांकि, इसे रिफ़्लेक्शन का इस्तेमाल करके, सीधे तौर पर ऐक्सेस नहीं किया जा सकता.

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

अगर आप अपने नेटिव कोड और अपने नेटिव कोड को लोड करने के लिए System.loadLibrary() का इस्तेमाल कर रहे हैं लाइब्रेरी, मॉड्यूल में किसी दूसरी लाइब्रेरी पर निर्भर है, तो आपको मैन्युअल रूप से पहले उस दूसरी लाइब्रेरी को लोड करें. अगर ReLinker का इस्तेमाल किया जा रहा है, तो Relinker.recursively().loadLibrary().

अगर आपdlopen() वैकल्पिक मॉड्यूल नहीं है, तो यह रिलेटिव लाइब्रेरी पाथ के साथ काम नहीं करेगा. इसका सबसे अच्छा हल यह है कि Java कोड से, लाइब्रेरी के ऐब्सलूट पाथ को वापस लाया जाए ClassLoader.findLibrary() से अपग्रेड करें और फिर dlopen() के कॉल में इसका इस्तेमाल करें. स्थानीय कोड डालने से पहले ऐसा करें या अपने नेटिव कोड को Java में जोड़ना.

इंस्टॉल किए गए 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() नतीजे की जांच करें, जैसा कि पिछले सेक्शन में बताया गया है.

भाषा के अन्य संसाधनों को डाउनलोड करें

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

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

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 से मॉड्यूल इंस्टॉल करें.

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

  • 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 लाइब्रेरी को यह पता चलता है कि वे टेस्ट करने के लिए, लोकल स्प्लिट APKs का इस्तेमाल कर सकते हैं Play Store से कनेक्ट किए बिना, सुविधा वाले मॉड्यूल इंस्टॉल करना.

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

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

bundletool install-apks --apks my_app.apks

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

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

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

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