APK विस्‍तार फ़ाइलें

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

Google Play आपके ऐप्लिकेशन के लिए एक्सपैंशन फ़ाइलें होस्ट करता है और उन्हें डिवाइस पर इस पते पर उपलब्ध कराता है: आपको कोई शुल्क नहीं चुकाना होगा. एक्सपैंशन फ़ाइलें, डिवाइस के शेयर किए गए स्टोरेज की जगह पर सेव होती हैं ( एसडी कार्ड या यूएसबी का माउंट किया जा सकने वाला हिस्सा; इसे "बाहरी" जिसमें आपका ऐप्लिकेशन ऐक्सेस कर सके उन्हें. ज़्यादातर डिवाइसों पर, Google Play एक्सपैंशन फ़ाइलों को एक साथ डाउनलोड करता है APK को डाउनलोड करता है, ताकि आपके ऐप्लिकेशन में वह सब कुछ हो जिसकी उसे ज़रूरत है. ऐसा तब होगा, जब उपयोगकर्ता इसे पहली बार. हालांकि, कुछ मामलों में आपके ऐप्लिकेशन को Google Play से फ़ाइलें डाउनलोड करनी होंगी शुरू होता है.

अगर आपको एक्सपैंशन फ़ाइलों का इस्तेमाल नहीं करना है और आपके ऐप्लिकेशन का कंप्रेस किया गया डाउनलोड साइज़ बड़ा है, तो 100 एमबी से ज़्यादा हो, तो आपको इसके बजाय Android ऐप्लिकेशन बंडल जो 200 एमबी तक कंप्रेस किए गए डाउनलोड साइज़ की अनुमति देते हैं. इसके अतिरिक्त, क्योंकि ऐप्लिकेशन बंडल, APK जनरेट करने और Google Play में साइन इन करने में रुकावट डालते हैं. उपयोगकर्ता, ऑप्टिमाइज़ किए गए APKs डाउनलोड करने के लिए, सिर्फ़ उनके लिए ज़रूरी कोड और संसाधन शामिल हैं, जिनकी ज़रूरत उन्हें आपका ऐप्लिकेशन चलाने के लिए होती है. आपको अपनी वेबसाइट बनाने, उस पर हस्ताक्षर करने, और इससे कई APK या एक्सपैंशन फ़ाइलें मैनेज की जा सकती हैं. साथ ही, उपयोगकर्ताओं का साइज़ छोटा और ऑप्टिमाइज़ किया गया डाउनलोड करने में मदद मिलती है.

खास जानकारी

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

  • मुख्य एक्सपैंशन फ़ाइल प्राइमरी एक्सपैंशन फ़ाइल अपलोड करें.
  • पैच एक्सपैंशन फ़ाइल का इस्तेमाल करना ज़रूरी नहीं है. यह फ़ाइल, मुख्य एक्सपैंशन फ़ाइल है.

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

हालांकि, भले ही आपके ऐप्लिकेशन के अपडेट के लिए सिर्फ़ एक नई पैच एक्सपैंशन फ़ाइल की ज़रूरत हो, फिर भी आपको मेनिफ़ेस्ट में अपडेट किए गए versionCode के साथ नया APK अपलोड करें. ( Play Console आपको किसी मौजूदा APK में एक्सपैंशन फ़ाइल अपलोड करने की अनुमति नहीं देता है.)

ध्यान दें: पैच एक्सपैंशन फ़ाइल का मतलब, मुख्य एक्सपैंशन फ़ाइल—किसी भी फ़ाइल को अपने हिसाब से इस्तेमाल किया जा सकता है.

फ़ाइल के नाम का फ़ॉर्मैट

अपलोड की जाने वाली हर एक्सपैंशन फ़ाइल, आपका चुना हुआ कोई भी फ़ॉर्मैट हो सकता है. जैसे, ZIP, PDF, MP4 वगैरह. आप यह भी कर सकते हैं किसी सेट को एनकैप्सुलेट और एन्क्रिप्ट (सुरक्षित) करने के लिए, JOBB टूल का इस्तेमाल करें और उस सेट के लिए बाद वाले पैच भी दिखेंगे. फ़ाइल प्रकार चाहे जो भी हो, Google Play उन्हें ओपेक बाइनरी ब्लॉब के तौर पर देखता है और इस स्कीम का इस्तेमाल करके फ़ाइलों का नाम बदल देता है:

[main|patch].<expansion-version>.<package-name>.obb

इस स्कीम के तीन कॉम्पोनेंट होते हैं:

main या patch
बताता है कि फ़ाइल मुख्य है या पैच एक्सपैंशन फ़ाइल है. यहां ये काम किए जा सकते हैं: हर APK के लिए सिर्फ़ एक मुख्य फ़ाइल और एक पैच फ़ाइल.
<expansion-version>
यह एक पूर्णांक है जो APK के उस वर्शन कोड से मेल खाता है जिससे एक्सपैंशन होता है पहला संबद्ध है (यह ऐप्लिकेशन के android:versionCode से मेल खाता है वैल्यू).

"पहला" को प्राथमिकता दी जाती है, क्योंकि Play Console आपको ये काम करने की अनुमति देता है अपलोड की गई एक्सपैंशन फ़ाइल को नए APK के साथ फिर से इस्तेमाल करने पर, एक्सपैंशन फ़ाइल का नाम नहीं बदलता—यह जब आप पहली बार फ़ाइल अपलोड करते हैं, तो उस पर लागू किए गए वर्शन को बनाए रखता है.

<package-name>
आपके ऐप्लिकेशन के Java-स्टाइल पैकेज का नाम.

उदाहरण के लिए, मान लें कि आपका APK वर्शन 314159 है और आपके पैकेज का नाम com.example.app है. अगर आपको मुख्य एक्सपैंशन फ़ाइल अपलोड करने के बाद, फ़ाइल का नाम बदलकर यह कर दिया जाता है:

main.314159.com.example.app.obb

सेव करने की जगह

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

getObbDir() तरीका किसी खास जगह की जानकारी दिखाता है अपनी एक्सपैंशन फ़ाइलों के लिए, नीचे दिए गए फ़ॉर्म का इस्तेमाल करें:

<shared-storage>/Android/obb/<package-name>/
  • <shared-storage> शेयर किए गए स्टोरेज का पाथ है. यह यहां से उपलब्ध होता है getExternalStorageDirectory().
  • <package-name> आपके ऐप्लिकेशन का Java-स्टाइल पैकेज नाम है, उपलब्ध है getPackageName() से.

हर ऐप्लिकेशन के लिए, इस डायरेक्ट्री में कभी भी दो एक्सपैंशन फ़ाइलें नहीं होती हैं. एक मुख्य एक्सपैंशन फ़ाइल है और दूसरी, पैच एक्सपैंशन फ़ाइल (अगर ज़रूरी हो). पीछे जाओ जब ऐप्लिकेशन को नई एक्सपैंशन फ़ाइलों से अपडेट किया जाता है, तो वर्शन ओवरराइट हो जाते हैं. Android के बाद से 4.4 (एपीआई लेवल 19), ऐप्लिकेशन बाहरी स्टोरेज के बिना OBB एक्सपैंशन फ़ाइलों को पढ़ सकते हैं अनुमति. हालांकि, Android 6.0 (एपीआई लेवल 23) और उसके बाद के वर्शन को लागू करने के कुछ तरीकों की अब भी ज़रूरत होती है अनुमति दी है, तो आपको ऐप्लिकेशन मेनिफ़ेस्ट में READ_EXTERNAL_STORAGE अनुमति देखें और इस पर अनुमति मांगें रनटाइम इस तरह सेट करें:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

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

Kotlin

val obb = File(obb_filename)
var open_failed = false

try {
    BufferedReader(FileReader(obb)).also { br ->
        ReadObbFile(br)
    }
} catch (e: IOException) {
    open_failed = true
}

if (open_failed) {
    // request READ_EXTERNAL_STORAGE permission before reading OBB file
    ReadObbFileWithPermission()
}

Java

File obb = new File(obb_filename);
 boolean open_failed = false;

 try {
     BufferedReader br = new BufferedReader(new FileReader(obb));
     open_failed = false;
     ReadObbFile(br);
 } catch (IOException e) {
     open_failed = true;
 }

 if (open_failed) {
     // request READ_EXTERNAL_STORAGE permission before reading OBB file
     ReadObbFileWithPermission();
 }

अगर आपको अपनी एक्सपैंशन फ़ाइलों का कॉन्टेंट अनपैक करना है, तो मिटाएं इसके बाद, OBB एक्सपैंशन फ़ाइलें इस्तेमाल करें और पैक नहीं किया गया डेटा सेव करें एक ही डायरेक्ट्री में. आपको पैक नहीं की गई अपनी फ़ाइलों को डायरेक्ट्री में सेव करना चाहिए getExternalFilesDir() ने तय किया. हालांकि, अगर हो सके, तो किसी एक्सपैंशन फ़ाइल फ़ॉर्मैट का इस्तेमाल करना सबसे सही रहेगा. इससे आपको सीधे फ़ाइल को कॉपी करने की ज़रूरत नहीं है. उदाहरण के लिए, हमने एक लाइब्रेरी APK एक्सपैंशन ज़िप लाइब्रेरी नाम का प्रोजेक्ट, जो आपके डेटा को सीधे तौर पर पढ़ता है ZIP फ़ाइल से लिया गया हो.

चेतावनी: APK फ़ाइलों के उलट, सेव की गई कोई भी फ़ाइल शेयर किए गए स्टोरेज को उपयोगकर्ता और अन्य ऐप्लिकेशन पढ़ सकते हैं.

सलाह: अगर मीडिया फ़ाइलों को ZIP में पैक किया जा रहा है, तो मीडिया का इस्तेमाल किया जा सकता है ऑफ़सेट और लंबाई नियंत्रण (जैसे कि MediaPlayer.setDataSource() और SoundPool.load()) के बिना को खोलने की ज़रूरत है. यह काम करे इसके लिए, आपको कंप्यूटर पर अतिरिक्त कंप्रेशन नहीं करना चाहिए ZIP पैकेज बनाते समय मीडिया फ़ाइलों को सुरक्षित रखें. उदाहरण के लिए, zip टूल का इस्तेमाल करते समय, आपको फ़ाइल के सफ़िक्स की जानकारी देने के लिए -n विकल्प का इस्तेमाल करना चाहिए कंप्रेस की गई:
zip -n .mp4;.ogg main_expansion media_files

डाउनलोड की प्रोसेस

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

हाई लेवल से डाउनलोड करने की प्रोसेस इस तरह दिखती है:

  1. उपयोगकर्ता ने Google Play से आपका ऐप्लिकेशन इंस्टॉल करने का विकल्प चुना है.
  2. अगर Google Play एक्सपैंशन फ़ाइलों को डाउनलोड कर पा रहा है, तो डिवाइसों के लिए डाउनलोड कर देता है, तो यह उन्हें APK के साथ डाउनलोड भी कर लेता है.

    अगर Google Play एक्सपैंशन फ़ाइलें डाउनलोड नहीं कर पाता, तो वह सिर्फ़ APK.

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

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

डेवलपमेंट चेकलिस्ट

यहाँ उन कार्यों का सारांश दिया गया है जो आपको अपने ऐप्लिकेशन:

  1. सबसे पहले, यह तय करें कि आपके ऐप्लिकेशन के कंप्रेस किए गए डाउनलोड का साइज़ 100 एमबी से ज़्यादा होना चाहिए या नहीं. जगह कीमती होती है और आपको अपने कुल डाउनलोड आकार को जितना हो सके कम रखना चाहिए. अगर आपका ऐप्लिकेशन एक से ज़्यादा स्क्रीन के लिए आपकी ग्राफ़िक एसेट के एक से ज़्यादा वर्शन उपलब्ध कराने के लिए 100 एमबी से ज़्यादा का इस्तेमाल करता है डेंसिटी का इस्तेमाल कर रहे हों, तो इसके बजाय ऐसे कई APK पब्लिश करने पर विचार करें जिनमें हर APK इसमें सिर्फ़ उन स्क्रीन के लिए ज़रूरी ऐसेट मौजूद होती हैं जिन्हें वह टारगेट करता है. सबसे अच्छे नतीजे पाने के लिए जब पब्लिश करके, ऐसा Android ऐप्लिकेशन बंडल अपलोड करें जिसे इसमें आपके ऐप्लिकेशन के इकट्ठा किए गए सभी कोड और संसाधन शामिल हैं. हालांकि, यह APK जनरेट करने और Google पर साइन इन करने में रुकावट डालता है ऐप्लिकेशन चलाएं.
  2. यह निर्धारित करें कि किन ऐप्लिकेशन संसाधनों को आपके APK से अलग करना है और उन्हें मुख्य एक्सपैंशन फ़ाइल के तौर पर इस्तेमाल करने के लिए फ़ाइल.

    आम तौर पर, मुख्य एक्सपैंशन फ़ाइल होती है. हालांकि, यदि आपके संसाधन एक्सपैंशन फ़ाइल है, तो बाकी ऐसेट के लिए पैच फ़ाइल का इस्तेमाल किया जा सकता है.

  3. अपने ऐप्लिकेशन को इस तरह डेवलप करें कि वह डिवाइस के शेयर किए गए स्टोरेज की जगह की जानकारी पर टैप करें.

    याद रखें कि आपको एक्सपैंशन फ़ाइलों को मिटाना, उनकी जगह बदलना या उनका नाम बदलना नहीं चाहिए.

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

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

    कोड की संख्या को काफ़ी कम करने के लिए, आपको कोड लिखना होगा और एक अच्छा उपयोगकर्ता अनुभव पक्का करना होगा डाउनलोड करने के दौरान, हमारा सुझाव है कि आप Downloader लाइब्रेरी का इस्तेमाल करें.

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

ऐप्लिकेशन डेवलपमेंट पूरा होने के बाद, टेस्टिंग एक्सपैंशन फ़ाइलें.

नियम और सीमाएं

APK एक्सपैंशन फ़ाइलें जोड़ने की सुविधा तब उपलब्ध होती है, जब आप इसका इस्तेमाल करके अपना ऐप्लिकेशन अपलोड करते हैं Play Console पर जाएं. पहली बार अपना ऐप्लिकेशन अपलोड करते समय या कोई एक्सटेंशन न हो, तो आपको इन नियमों और सीमाओं की जानकारी होनी चाहिए:

  1. हर एक्सपैंशन फ़ाइल 2 जीबी से ज़्यादा की नहीं हो सकती.
  2. Google Play से अपनी एक्सपैंशन फ़ाइलें डाउनलोड करने के लिए, उपयोगकर्ता के पास ज़रूरी है कि Google Play से आपका ऐप्लिकेशन हासिल किया है. Google Play ये काम नहीं करेगा अगर ऐप्लिकेशन किसी दूसरे तरीके से इंस्टॉल किया गया था, तो अपनी एक्सपैंशन फ़ाइलों के यूआरएल भी उपलब्ध कराएं.
  3. अपने ऐप्लिकेशन के अंदर से डाउनलोड करते समय, Google Play पर हर फ़ाइल के लिए, अलग-अलग वैल्यू उपलब्ध होती हैं. हर फ़ाइल की समयसीमा, दिए जाने के कुछ समय बाद खत्म हो जाती है आपके ऐप्लिकेशन को मिलता है.
  4. अगर आप नए APK से अपने ऐप्लिकेशन को अपडेट करते हैं या उसके लिए एक से ज़्यादा APK अपलोड करते हैं ऐप्लिकेशन है, तो आप वे विस्तार फ़ाइलें चुन सकते हैं जिन्हें आपने पिछले APK के लिए अपलोड किया है. यह एक्सपैंशन फ़ाइल का नाम नहीं बदलता है—यह APK को मिले वर्शन को जिससे फ़ाइल मूल रूप से असोसिएट की गई थी.
  5. अगर आप Google मैप में बदलाव करने के लिए एक से ज़्यादा APK के साथ एक्सपैंशन फ़ाइलों का इस्तेमाल करते हैं अलग-अलग डिवाइस के लिए अलग-अलग एक्सपैंशन फ़ाइलें उपलब्ध कराते हैं, तब भी आपको अलग-अलग APK अपलोड करने होंगे हर डिवाइस के लिए एक खास versionCode उपलब्ध कराएं और इसके लिए अलग-अलग फ़िल्टर की जानकारी दें हर APK के लिए उपलब्ध है.
  6. एक्सपैंशन फ़ाइलों को बदलकर, अपने ऐप्लिकेशन के लिए अपडेट जारी नहीं किया जा सकता अकेले—अपने ऐप्लिकेशन को अपडेट करने के लिए, आपको नया APK अपलोड करना होगा. अगर सिर्फ़ बदलाव किए जाते हैं, तो अगर आपकी एक्सपैंशन फ़ाइलों में मौजूद ऐसेट से जुड़ी कोई समस्या है, तो versionCode को बदलकर अपना APK अपडेट करें (और यह भी हो सकता है versionName).

  7. अपने obb/ में अन्य डेटा सेव न करें डायरेक्ट्री शामिल है. अगर आपको कुछ डेटा अनपैक करना है, तो उसे getExternalFilesDir() में बताई गई जगह पर सेव करें.
  8. .obb की एक्सपैंशन फ़ाइल न मिटाएं या उसका नाम न बदलें. हालांकि, ऐसा तब ही करें, जब अपडेट कर रहा है). ऐसा करने से Google Play या आपका ऐप्लिकेशन बार-बार एक्सपैंशन फ़ाइल डाउनलोड करें.
  9. एक्सपैंशन फ़ाइल को मैन्युअल तरीके से अपडेट करते समय, आपको पिछली एक्सपैंशन फ़ाइल मिटानी होगी.

एक्सपैंशन फ़ाइलें डाउनलोड करना

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

अपनी एक्सपैंशन फ़ाइलों को डाउनलोड करने के लिए ज़रूरी बुनियादी तर्क यह है:

  1. जब आपका ऐप्लिकेशन शुरू होता है, तो शेयर किए गए स्टोरेज की जगह ( Android/obb/<package-name>/ डायरेक्ट्री).
    1. अगर एक्सपैंशन फ़ाइलें वहां मौजूद हैं, तो आपने सेट अप कर लिया है और अपने ऐप्लिकेशन का इस्तेमाल जारी रखा जा सकता है.
    2. अगर एक्सपैंशन फ़ाइलें वहां नहीं हैं:
      1. Google Play की ऐप्लिकेशन लाइसेंसिंग का इस्तेमाल करके अनुरोध करें की एक्सपैंशन फ़ाइल के नाम, साइज़, और यूआरएल शामिल हैं.
      2. एक्सपैंशन फ़ाइलें डाउनलोड करने और सेव करने के लिए, Google Play के यूआरएल का इस्तेमाल करें एक्सपैंशन फ़ाइलें. आपको फ़ाइलों को शेयर किए गए स्टोरेज की जगह पर सेव करना ज़रूरी है (Android/obb/<package-name>/) और दिए गए सटीक फ़ाइल नाम का इस्तेमाल करें Google Play से मिले जवाब के हिसाब से.

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

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

ध्यान दें: Google Play चाहे आपका ऐप्लिकेशन मुफ़्त हो या नहीं एक्सपैंशन फ़ाइल के यूआरएल सिर्फ़ तब दिखाता है, जब उपयोगकर्ता ने Google Play से आपका ऐप्लिकेशन हासिल किया हो.

LVL के अलावा, आपको कोड के एक ऐसे सेट की ज़रूरत होगी जो एक्सपैंशन फ़ाइलें डाउनलोड कर सके एक एचटीटीपी कनेक्शन से कनेक्ट करता है और उन्हें डिवाइस के शेयर किए गए स्टोरेज में सही जगह पर सेव करता है. अपने ऐप्लिकेशन में यह प्रोसेस बनाते समय, आपको कई समस्याओं का सामना करना होगा विचार:

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

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

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

डाउनलोडर लाइब्रेरी के बारे में जानकारी

अपने ऐप्लिकेशन के साथ APK एक्सपैंशन फ़ाइलों का इस्तेमाल करने और इनके साथ सबसे अच्छा उपयोगकर्ता अनुभव देने के लिए करने का सुझाव देते हैं, तो हमारा सुझाव है कि आप ऐसी डाउनलोडर लाइब्रेरी का उपयोग करें जिसे Android Google Play APK एक्सपैंशन लाइब्रेरी पैकेज. यह लाइब्रेरी आपकी एक्सपैंशन फ़ाइलों को बैकग्राउंड में चलने वाली सेवा, डाउनलोड की स्थिति के साथ उपयोगकर्ता को मिलने वाली सूचना दिखाती है, नेटवर्क मैनेज करती है कनेक्टिविटी बंद हो जाए, संभव होने पर डाउनलोड को फिर से शुरू किया जाए, और बहुत कुछ किया जा सके.

डाउनलोडर लाइब्रेरी का इस्तेमाल करके एक्सपैंशन फ़ाइल डाउनलोड करने के लिए, आपको बस यह करना होगा:

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

नीचे दिए गए सेक्शन में, डाउनलोडर लाइब्रेरी का इस्तेमाल करके, अपने ऐप्लिकेशन को सेट अप करने का तरीका बताया गया है.

डाउनलोडर लाइब्रेरी का उपयोग करने की तैयारी करना

डाउनलोडर लाइब्रेरी का इस्तेमाल करने के लिए, आपको ये काम करने होंगे SDK Manager से दो पैकेज डाउनलोड करें और अपने प्लैटफ़ॉर्म पर सही लाइब्रेरी जोड़ें है.

सबसे पहले, Android SDK Manager खोलें (टूल > SDK मैनेजर) और दिखने का तरीका और व्यवहार > सिस्टम सेटिंग > Android SDK टूल, चुनें चुनने और डाउनलोड करने के लिए, SDK टूल टैब:

  • Google Play की लाइसेंस देने वाली लाइब्रेरी का पैकेज
  • Google Play APK एक्सपैंशन लाइब्रेरी पैकेज

लाइसेंस की पुष्टि करने वाली लाइब्रेरी और डाउनलोडर के लिए, एक नया लाइब्रेरी मॉड्यूल बनाएं लाइब्रेरी. हर लाइब्रेरी के लिए:

  1. फ़ाइल > चुनें नया > नया मॉड्यूल.
  2. नया मॉड्यूल बनाएं विंडो में, Android लाइब्रेरी को चुनें. इसके बाद, आगे बढ़ें को चुनें.
  3. ऐप्लिकेशन/लाइब्रेरी का नाम बताएं, जैसे कि "Google Play लाइसेंस लाइब्रेरी" और "Google Play डाउनलोडर लाइब्रेरी" में, SDK टूल का कम से कम लेवल चुनें. इसके बाद, पूरा करें.
  4. फ़ाइल > चुनें प्रोजेक्ट का स्ट्रक्चर.
  5. प्रॉपर्टी टैब और लाइब्रेरी को चुनें डेटा स्टोर करने की जगह, <sdk>/extras/google/ डायरेक्ट्री से लाइब्रेरी का नाम डालें (लाइसेंस की पुष्टि करने वाली लाइब्रेरी के लिए play_licensing/ या डाउनलोडर लाइब्रेरी के लिए play_apk_expansion/downloader_library/).
  6. नया मॉड्यूल बनाने के लिए, ठीक है को चुनें.

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

इसके अलावा, कमांड लाइन से अपने प्रोजेक्ट को अपडेट करके, लाइब्रेरी शामिल करें:

  1. डायरेक्ट्री को <sdk>/tools/ डायरेक्ट्री में बदलें.
  2. दोनों को जोड़ने के लिए, --library विकल्प के साथ android update project लागू करें LVL और डाउनलोडर लाइब्रेरी का भी इस्तेमाल करें. उदाहरण के लिए:
    android update project --path ~/Android/MyApp \
    --library ~/android_sdk/extras/google/market_licensing \
    --library ~/android_sdk/extras/google/market_apk_expansion/downloader_library
    

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

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

उपयोगकर्ता को अनुमतियों का एलान करना

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

<manifest ...>
    <!-- Required to access Google Play Licensing -->
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />

    <!-- Required to download files from Google Play -->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- Required to keep CPU alive while downloading files
        (NOT to keep screen awake) -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Required to poll the state of the network connection
        and respond to changes -->
    <uses-permission
        android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- Required to check whether Wi-Fi is enabled -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <!-- Required to read and write the expansion files on shared storage -->
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

ध्यान दें: डिफ़ॉल्ट रूप से, डाउनलोडर लाइब्रेरी के लिए एपीआई की ज़रूरत होती है लेवल 4 है, लेकिन APK की एक्सपैंशन ZIP लाइब्रेरी के लिए, एपीआई लेवल 5 की ज़रूरत है.

डाउनलोडर सेवा को लागू करना

बैकग्राउंड में डाउनलोड करने के लिए, डाउनलोडर लाइब्रेरी DownloaderService नाम की खुद की Service सब-क्लास है, जिसे आपको बढ़ाना चाहिए. तय सीमा में आपके लिए एक्सपैंशन फ़ाइलें डाउनलोड करने के अलावा, DownloaderService भी:

  • BroadcastReceiver को रजिस्टर करता है, जो डिवाइस की नेटवर्क कनेक्टिविटी (CONNECTIVITY_ACTION ताकि ज़रूरत पड़ने पर डाउनलोड को रोका जा सके (जैसे कि कनेक्टिविटी टूट जाने की वजह से) और जब संभव हो (कनेक्टिविटी आ जाती है), तो डाउनलोड को फिर से शुरू कर दें.
  • फिर से डाउनलोड करने की कोशिश करने के लिए, RTC_WAKEUP अलार्म को शेड्यूल किया जाता है ऐसे मामले जिनमें सेवा बंद हो जाती है.
  • यह पसंद के मुताबिक Notification बनाता है, जो डाउनलोड की प्रोग्रेस की जानकारी दिखाता है और कोई गड़बड़ी या स्थिति में बदलाव.
  • इससे आपके ऐप्लिकेशन को मैन्युअल तरीके से डाउनलोड रोकने और फिर से शुरू करने की अनुमति मिलती है.
  • यह पुष्टि करता है कि शेयर किया गया स्टोरेज माउंट किया गया है और उपलब्ध है, और फ़ाइलें पहले से मौजूद नहीं हैं, और यह कि एक्सपैंशन फ़ाइलें डाउनलोड करने से पहले काफ़ी जगह मिल जाती है. इसके बाद, उपयोगकर्ता को इसकी सूचना दी जाती है अगर इनमें से कोई भी बात सही नहीं है.

आपको अपने ऐप्लिकेशन में सिर्फ़ ऐसी क्लास बनानी होगी जो DownloaderService क्लास को बढ़ाती हो और ऐप्लिकेशन की खास जानकारी देने के लिए तीन तरीकों को ओवरराइड करती हो:

getPublicKey()
इससे एक ऐसी स्ट्रिंग आनी चाहिए जो आपके पब्लिशर के लिए, Base64 कोड में बदली गई आरएसए सार्वजनिक कुंजी हो खाता, Play Console के प्रोफ़ाइल पेज पर उपलब्ध होता है. (लाइसेंस देने के लिए सेट अप करना देखें).
getSALT()
इससे रैंडम बाइट का वह कलेक्शन दिखना चाहिए जिसका इस्तेमाल Policy लाइसेंसिंग करता है कोई Obfuscator बनाएं. नमक से आपका उलझा हुआ SharedPreferences जिस फ़ाइल में आपका लाइसेंस डेटा सेव किया जाएगा वह यूनीक होगी और उसे खोजा नहीं जा सकेगा.
getAlarmReceiverClassName()
इसे इसमें BroadcastReceiver की श्रेणी का नाम देना होगा जिस पर यह अलार्म बजेगा कि डाउनलोड रीस्टार्ट हुआ (यह तब हो सकता है, जब डाउनलोडर सेवा अचानक बंद हो जाती है).

उदाहरण के लिए, यहां DownloaderService को पूरी तरह से लागू करने की जानकारी दी गई है:

Kotlin

// You must use the public key belonging to your publisher account
const val BASE64_PUBLIC_KEY = "YourLVLKey"
// You should also modify this salt
val SALT = byteArrayOf(
        1, 42, -12, -1, 54, 98, -100, -12, 43, 2,
        -8, -4, 9, 5, -106, -107, -33, 45, -1, 84
)

class SampleDownloaderService : DownloaderService() {

    override fun getPublicKey(): String = BASE64_PUBLIC_KEY

    override fun getSALT(): ByteArray = SALT

    override fun getAlarmReceiverClassName(): String = SampleAlarmReceiver::class.java.name
}

Java

public class SampleDownloaderService extends DownloaderService {
    // You must use the public key belonging to your publisher account
    public static final String BASE64_PUBLIC_KEY = "YourLVLKey";
    // You should also modify this salt
    public static final byte[] SALT = new byte[] { 1, 42, -12, -1, 54, 98,
            -100, -12, 43, 2, -8, -4, 9, 5, -106, -107, -33, 45, -1, 84
    };

    @Override
    public String getPublicKey() {
        return BASE64_PUBLIC_KEY;
    }

    @Override
    public byte[] getSALT() {
        return SALT;
    }

    @Override
    public String getAlarmReceiverClassName() {
        return SampleAlarmReceiver.class.getName();
    }
}

सूचना: आपको BASE64_PUBLIC_KEY वैल्यू अपडेट करनी होगी आपके पब्लिशर खाते की सार्वजनिक कुंजी होनी चाहिए. कुंजी आपको डेवलपर पेज पर मिलेगी कंसोल पर जाएं. टेस्टिंग के दौरान भी ऐसा करना ज़रूरी है आपके डाउनलोड.

अपनी मेनिफ़ेस्ट फ़ाइल में सेवा के बारे में जानकारी देना न भूलें:

<app ...>
    <service android:name=".SampleDownloaderService" />
    ...
</app>

अलार्म रिसीवर को लागू करना

फ़ाइल के डाउनलोड होने की प्रोग्रेस पर नज़र रखने और ज़रूरत पड़ने पर डाउनलोड को फिर से शुरू करने के लिए, DownloaderService, RTC_WAKEUP का वह अलार्म शेड्यूल करता है जो आपके डिवाइस में BroadcastReceiver को Intent डिलीवर करता है है. एपीआई को कॉल करने के लिए, आपको BroadcastReceiver तय करना होगा डाउनलोडर लाइब्रेरी से डाउनलोड करें जो डाउनलोड की स्थिति की जांच करता है और फिर से शुरू होता है किया जा सकता है.

DownloaderClientMarshaller.startDownloadServiceIfRequired() को कॉल करने के लिए, आपको बस onReceive() तरीके को बदलना होगा.

उदाहरण के लिए:

Kotlin

class SampleAlarmReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        try {
            DownloaderClientMarshaller.startDownloadServiceIfRequired(
                    context,
                    intent,
                    SampleDownloaderService::class.java
            )
        } catch (e: PackageManager.NameNotFoundException) {
            e.printStackTrace()
        }
    }
}

Java

public class SampleAlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            DownloaderClientMarshaller.startDownloadServiceIfRequired(context,
                intent, SampleDownloaderService.class);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}

ध्यान दें कि यही वह क्लास है जिसके लिए आपको नाम देना होगा आपकी सेवा के getAlarmReceiverClassName() तरीके में (पिछला सेक्शन देखें).

अपनी मेनिफ़ेस्ट फ़ाइल में, फ़ाइल पाने वाले व्यक्ति का नाम देना न भूलें:

<app ...>
    <receiver android:name=".SampleAlarmReceiver" />
    ...
</app>

डाउनलोड शुरू हो रहा है

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

डाउनलोडर लाइब्रेरी का इस्तेमाल करके डाउनलोड शुरू करने के लिए, इन चीज़ों की ज़रूरत होती है प्रक्रियाएं:

  1. देखें कि फ़ाइलें डाउनलोड की गई हैं या नहीं.

    डाउनलोडर लाइब्रेरी में Helper क्लास के कुछ एपीआई शामिल होते हैं इस प्रक्रिया में सहायता के लिए:

    • getExpansionAPKFileName(Context, c, boolean mainFile, int versionCode)
    • doesFileExist(Context c, String fileName, long fileSize)

    उदाहरण के लिए, Apk एक्सपैंशन पैकेज में दिया गया सैंपल ऐप्लिकेशन, गतिविधि के onCreate() तरीके में, जांच करने का तरीका क्या डिवाइस पर एक्सपैंशन फ़ाइलें पहले से मौजूद हैं:

    Kotlin

    fun expansionFilesDelivered(): Boolean {
        xAPKS.forEach { xf ->
            Helpers.getExpansionAPKFileName(this, xf.isBase, xf.fileVersion).also { fileName ->
                if (!Helpers.doesFileExist(this, fileName, xf.fileSize, false))
                    return false
            }
        }
        return true
    }
    

    Java

    boolean expansionFilesDelivered() {
        for (XAPKFile xf : xAPKS) {
            String fileName = Helpers.getExpansionAPKFileName(this, xf.isBase,
                xf.fileVersion);
            if (!Helpers.doesFileExist(this, fileName, xf.fileSize, false))
                return false;
        }
        return true;
    }
    

    इस मामले में, हर XAPKFile ऑब्जेक्ट में, एक्सपैंशन फ़ाइल और बूलियन का इस्तेमाल करें, ताकि यह पता चल सके कि यह मुख्य एक्सपैंशन फ़ाइल है या नहीं. (सैंपल देखें ज़्यादा जानकारी के लिए, ऐप्लिकेशन की SampleDownloaderActivity क्लास.)

    अगर इस तरीके से नतीजा गलत मिलता है, तो ऐप्लिकेशन को डाउनलोड शुरू करना होगा.

  2. स्टैटिक तरीके DownloaderClientMarshaller.startDownloadServiceIfRequired(Context c, PendingIntent notificationClient, Class<?> serviceClass) को कॉल करके डाउनलोड शुरू करें.

    इस तरीके में ये पैरामीटर इस्तेमाल होते हैं:

    • context: आपके ऐप्लिकेशन का Context.
    • notificationClient: मुख्य स्क्रीन पर शुरू करने के लिए PendingIntent गतिविधि. इसका इस्तेमाल Notification में किया जाता है, जिसे DownloaderService डाउनलोड की प्रोग्रेस दिखाने के लिए बनाता है. जब उपयोगकर्ता सूचना को चुनता है, तो सिस्टम यह आपके दिए गए PendingIntent को शुरू करता है. साथ ही, इससे गतिविधि को खोला जाना चाहिए जो डाउनलोड की प्रोग्रेस दिखाता है. आम तौर पर, वही गतिविधि दिखती है जिससे डाउनलोड शुरू हुआ था.
    • serviceClass: लागू करने के लिए Class ऑब्जेक्ट DownloaderService, सेवा शुरू करने और ज़रूरत होने पर डाउनलोड शुरू करने के लिए ज़रूरी है.

    यह तरीका, ऐसा पूर्णांक लौटाता है जो दिखाता है डाउनलोड करने की ज़रूरत है या नहीं. आपको ये वैल्यू दिख सकती हैं:

    • NO_DOWNLOAD_REQUIRED: फ़ाइलें पहले से मौजूद होने पर वापस भेजा जाता है मौजूद है या कोई डाउनलोड पहले से प्रगति पर है.
    • LVL_CHECK_REQUIRED: लाइसेंस की पुष्टि होने पर वापस किया जाता है एक्सपैंशन फ़ाइल के यूआरएल पाने के लिए ज़रूरी है.
    • DOWNLOAD_REQUIRED: लौटाया जाता है अगर एक्सपैंशन फ़ाइल के यूआरएल पहले से मौजूद हैं, लेकिन डाउनलोड नहीं किए गए हैं.

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

    उदाहरण के लिए:

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        // Check if expansion files are available before going any further
        if (!expansionFilesDelivered()) {
            val pendingIntent =
                    // Build an Intent to start this activity from the Notification
                    Intent(this, MainActivity::class.java).apply {
                        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
                    }.let { notifierIntent ->
                        PendingIntent.getActivity(
                                this,
                                0,
                                notifierIntent,
                                PendingIntent.FLAG_UPDATE_CURRENT
                        )
                    }
    
    
            // Start the download service (if required)
            val startResult: Int = DownloaderClientMarshaller.startDownloadServiceIfRequired(
                    this,
                    pendingIntent,
                    SampleDownloaderService::class.java
            )
            // If download has started, initialize this activity to show
            // download progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // This is where you do set up to display the download
                // progress (next step)
                ...
                return
            } // If the download wasn't necessary, fall through to start the app
        }
        startApp() // Expansion files are available, start the app
    }
    

    Java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // Check if expansion files are available before going any further
        if (!expansionFilesDelivered()) {
            // Build an Intent to start this activity from the Notification
            Intent notifierIntent = new Intent(this, MainActivity.getClass());
            notifierIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                                    Intent.FLAG_ACTIVITY_CLEAR_TOP);
            ...
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notifierIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
            // Start the download service (if required)
            int startResult =
                DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
                            pendingIntent, SampleDownloaderService.class);
            // If download has started, initialize this activity to show
            // download progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // This is where you do set up to display the download
                // progress (next step)
                ...
                return;
            } // If the download wasn't necessary, fall through to start the app
        }
        startApp(); // Expansion files are available, start the app
    }
    
  3. जब startDownloadServiceIfRequired() तरीका कुछ अन्य जानकारी देता है NO_DOWNLOAD_REQUIRED से, इसके अनुसार IStub का एक इंस्टेंस बनाएं DownloaderClientMarshaller.CreateStub(IDownloaderClient client, Class<?> downloaderService) को कॉल किया जा रहा है. IStub, डाउनलोडर और आपकी गतिविधि को एक-दूसरे से लिंक करता है सेवा का इस्तेमाल करता है, ताकि डाउनलोड की प्रोग्रेस के बारे में आपकी गतिविधि के लिए कॉलबैक मिलें.

    CreateStub() पर कॉल करके IStub को इंस्टैंशिएट करने के लिए, आपको इसे पास करना होगा IDownloaderClient इंटरफ़ेस और आपके DownloaderService को लागू करना लागू करना. डाउनलोड की प्रोग्रेस पाने से जुड़े अगले सेक्शन में, इसके बारे में चर्चा की गई है IDownloaderClient इंटरफ़ेस, जिसे आम तौर पर अपनी Activity क्लास में लागू करना चाहिए, ताकि डाउनलोड की स्थिति बदलने पर गतिविधि यूज़र इंटरफ़ेस (यूआई) को अपडेट किया जा सके.

    हमारा सुझाव है कि आप अपनी गतिविधि के onCreate() तरीके के दौरान, startDownloadServiceIfRequired() के बाद IStub को इंस्टैंशिएट करने के लिए CreateStub() को कॉल करें डाउनलोड शुरू करता है.

    उदाहरण के लिए, onCreate() के लिए पिछले कोड सैंपल में, startDownloadServiceIfRequired() के नतीजे का जवाब इस तरह दिया जा सकता है:

    Kotlin

            // Start the download service (if required)
            val startResult = DownloaderClientMarshaller.startDownloadServiceIfRequired(
                    this@MainActivity,
                    pendingIntent,
                    SampleDownloaderService::class.java
            )
            // If download has started, initialize activity to show progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // Instantiate a member instance of IStub
                downloaderClientStub =
                        DownloaderClientMarshaller.CreateStub(this, SampleDownloaderService::class.java)
                // Inflate layout that shows download progress
                setContentView(R.layout.downloader_ui)
                return
            }
    

    Java

            // Start the download service (if required)
            int startResult =
                DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
                            pendingIntent, SampleDownloaderService.class);
            // If download has started, initialize activity to show progress
            if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
                // Instantiate a member instance of IStub
                downloaderClientStub = DownloaderClientMarshaller.CreateStub(this,
                        SampleDownloaderService.class);
                // Inflate layout that shows download progress
                setContentView(R.layout.downloader_ui);
                return;
            }
    

    onCreate() तरीके के वापस आने के बाद, आपकी गतिविधि onResume() पर एक कॉल आएगा, जहां आपको connect() को IStub पर कॉल करें और अपने ऐप्लिकेशन के Context को पास करें. इसके उलट, आपको कॉल आपकी गतिविधि के onStop() कॉलबैक में disconnect().

    Kotlin

    override fun onResume() {
        downloaderClientStub?.connect(this)
        super.onResume()
    }
    
    override fun onStop() {
        downloaderClientStub?.disconnect(this)
        super.onStop()
    }
    

    Java

    @Override
    protected void onResume() {
        if (null != downloaderClientStub) {
            downloaderClientStub.connect(this);
        }
        super.onResume();
    }
    
    @Override
    protected void onStop() {
        if (null != downloaderClientStub) {
            downloaderClientStub.disconnect(this);
        }
        super.onStop();
    }
    

    IStub पर connect() को कॉल करने से, आपकी गतिविधि DownloaderService से इस तरह जुड़ी होती है कि आपकी गतिविधि को डाउनलोड में हुए बदलावों के बारे में कॉलबैक मिलते हैं IDownloaderClient इंटरफ़ेस के ज़रिए सबमिट किया जा सकता है.

डाउनलोड की प्रोग्रेस मिल रही है

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

IDownloaderClient के लिए इंटरफ़ेस के ज़रूरी तरीके ये हैं:

onServiceConnected(Messenger m)
जब आप अपनी गतिविधि में IStub को इंस्टैंशिएट करेंगे, तो आपको इस नंबर पर एक कॉल आएगा तरीका, जो आपके इंस्टेंस से कनेक्ट किए गए Messenger ऑब्जेक्ट को पास करता है DownloaderService का. सेवा को अनुरोध भेजने के लिए, जैसे कि रोकने और फिर से शुरू करने के लिए डाउनलोड किया गया है, तो सेवा से कनेक्ट किया गया IDownloaderService इंटरफ़ेस पाने के लिए आपको DownloaderServiceMarshaller.CreateProxy() को कॉल करना होगा.

लागू करने का सुझाव कुछ ऐसा दिखता है:

Kotlin

private var remoteService: IDownloaderService? = null
...

override fun onServiceConnected(m: Messenger) {
    remoteService = DownloaderServiceMarshaller.CreateProxy(m).apply {
        downloaderClientStub?.messenger?.also { messenger ->
            onClientUpdated(messenger)
        }
    }
}

Java

private IDownloaderService remoteService;
...

@Override
public void onServiceConnected(Messenger m) {
    remoteService = DownloaderServiceMarshaller.CreateProxy(m);
    remoteService.onClientUpdated(downloaderClientStub.getMessenger());
}

IDownloaderService ऑब्जेक्ट के शुरू होने के बाद, डाउनलोड करने की सेवा, जैसे कि डाउनलोड को रोकना और फिर से शुरू करना (requestPauseDownload() और requestContinueDownload()).

onDownloadStateChanged(int newState)
डाउनलोड सेवा इसे तब कॉल करती है, जब डाउनलोड की स्थिति में कोई बदलाव होता है, जैसे कि डाउनलोड शुरू या पूरा होता है.

newState वैल्यू, यहां दी गई कई संभावित वैल्यू में से एक होगी IDownloaderClient क्लास के STATE_* कॉन्सटेंट में से किसी एक के हिसाब से.

अपने उपयोगकर्ताओं को काम का मैसेज देने के लिए, संबंधित स्ट्रिंग का अनुरोध किया जा सकता है Helpers.getDownloaderStringResourceIDFromState() पर कॉल करके हर राज्य के लिए कॉल किया जा सकता है. यह डाउनलोडर के साथ बंडल की गई किसी एक स्ट्रिंग का संसाधन आईडी लौटाता है लाइब्रेरी. उदाहरण के लिए, "आपके रोमिंग में होने की वजह से डाउनलोड रुक गया है" स्ट्रिंग STATE_PAUSED_ROAMING से मेल खाता है.

onDownloadProgress(DownloadProgressInfo progress)
डाउनलोड सेवा इसे एक DownloadProgressInfo ऑब्जेक्ट डिलीवर करने के लिए कॉल करती है, इस सेक्शन में, डाउनलोड की प्रोसेस के बारे में कई तरह की जानकारी मिलती है. इसमें, डाउनलोड होने में बचा अनुमानित समय, मौजूदा स्पीड, कुल प्रोग्रेस, और कुल मिलाकर डाउनलोड करने की प्रोग्रेस दिखाने वाला यूज़र इंटरफ़ेस (यूआई) अपडेट करें.

सलाह: डाउनलोड की प्रोसेस को अपडेट करने वाले इन कॉलबैक के उदाहरणों के लिए यूज़र इंटरफ़ेस (यूआई) में, यहां दिए गए सैंपल ऐप्लिकेशन में SampleDownloaderActivity देखें. Apk एक्सपैंशन पैकेज.

IDownloaderService इंटरफ़ेस के लिए, आपको ये तरीके काम के लग सकते हैं:

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

Kotlin

remoteService = DownloaderServiceMarshaller.CreateProxy(m).apply {
    ...
    setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR)
}

Java

remoteService
    .setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR);

APKExpansionPolicy का इस्तेमाल करना

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

ध्यान दें: अगर पिछले सेक्शन में बताए गए तरीके से, डाउनलोडर लाइब्रेरी का इस्तेमाल किया जाता है, तो लाइब्रेरी, APKExpansionPolicy के साथ सभी इंटरैक्शन करती है, ताकि आपको इसका इस्तेमाल न करना पड़े इस क्लास को सीधे तौर पर ऐक्सेस कर सकते हैं.

इस क्लास में ऐसे तरीके शामिल हैं जिनकी मदद से एक्सपैंशन फ़ाइलें:

  • getExpansionURLCount()
  • getExpansionURL(int index)
  • getExpansionFileName(int index)
  • getExpansionFileSize(int index)

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

एक्सपैंशन फ़ाइल पढ़ना

डिवाइस पर आपकी APK एक्सपैंशन फ़ाइलें सेव हो जाने के बाद, फ़ाइलें किस तरह पढ़ी जाती हैं आपके द्वारा उपयोग की गई फ़ाइल के प्रकार पर निर्भर करता है. जैसा कि खास जानकारी में बताया गया है, आपका एक्सपैंशन फ़ाइलें किसी भी तरह की चाहते हैं, लेकिन एक खास फ़ाइल नाम फ़ॉर्मैट का इस्तेमाल करके उनका नाम बदला जाता है. इसके बाद, उन्हें <shared-storage>/Android/obb/<package-name>/.

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

ध्यान दें: ऐप्लिकेशन चालू होने पर, आपको हमेशा यह जांच करनी चाहिए कि बाहरी मेमोरी उपलब्ध है और getExternalStorageState() पर कॉल करके पढ़ा जा सकता है. यह कई संभावित स्ट्रिंग में से एक दिखाता है जो बाहरी स्टोरेज की स्थिति के बारे में बताती हैं. ताकि आपके उपयोगकर्ता इसे पढ़ सकें ऐप्लिकेशन, रिटर्न वैल्यू MEDIA_MOUNTED होनी चाहिए.

फ़ाइल के नाम फ़ेच किए जा रहे हैं

खास जानकारी में बताए गए तरीके के मुताबिक, आपकी APK एक्सपैंशन फ़ाइलें सेव कर ली गई हैं फ़ाइल नाम के फ़ॉर्मैट का इस्तेमाल करें:

[main|patch].<expansion-version>.<package-name>.obb

अपनी एक्सपैंशन फ़ाइलों की जगह और नाम पाने के लिए, आपको आपकी फ़ाइलों का पाथ बनाने के लिए, getExternalStorageDirectory() और getPackageName() तरीके.

अपने ऐप्लिकेशन में, पूरे पाथ का कलेक्शन पाने के लिए यह तरीका अपनाएं को अपनी दोनों एक्सपैंशन फ़ाइलों में जोड़ दें:

Kotlin

fun getAPKExpansionFiles(ctx: Context, mainVersion: Int, patchVersion: Int): Array<String> {
    val packageName = ctx.packageName
    val ret = mutableListOf<String>()
    if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
        // Build the full path to the app's expansion files
        val root = Environment.getExternalStorageDirectory()
        val expPath = File(root.toString() + EXP_PATH + packageName)

        // Check that expansion file path exists
        if (expPath.exists()) {
            if (mainVersion > 0) {
                val strMainPath = "$expPath${File.separator}main.$mainVersion.$packageName.obb"
                val main = File(strMainPath)
                if (main.isFile) {
                    ret += strMainPath
                }
            }
            if (patchVersion > 0) {
                val strPatchPath = "$expPath${File.separator}patch.$mainVersion.$packageName.obb"
                val main = File(strPatchPath)
                if (main.isFile) {
                    ret += strPatchPath
                }
            }
        }
    }
    return ret.toTypedArray()
}

Java

// The shared path to all app expansion files
private final static String EXP_PATH = "/Android/obb/";

static String[] getAPKExpansionFiles(Context ctx, int mainVersion,
      int patchVersion) {
    String packageName = ctx.getPackageName();
    Vector<String> ret = new Vector<String>();
    if (Environment.getExternalStorageState()
          .equals(Environment.MEDIA_MOUNTED)) {
        // Build the full path to the app's expansion files
        File root = Environment.getExternalStorageDirectory();
        File expPath = new File(root.toString() + EXP_PATH + packageName);

        // Check that expansion file path exists
        if (expPath.exists()) {
            if ( mainVersion > 0 ) {
                String strMainPath = expPath + File.separator + "main." +
                        mainVersion + "." + packageName + ".obb";
                File main = new File(strMainPath);
                if ( main.isFile() ) {
                        ret.add(strMainPath);
                }
            }
            if ( patchVersion > 0 ) {
                String strPatchPath = expPath + File.separator + "patch." +
                        mainVersion + "." + packageName + ".obb";
                File main = new File(strPatchPath);
                if ( main.isFile() ) {
                        ret.add(strPatchPath);
                }
            }
        }
    }
    String[] retArray = new String[ret.size()];
    ret.toArray(retArray);
    return retArray;
}

इस तरीके को कॉल करने के लिए, अपने ऐप्लिकेशन Context का इस्तेमाल करें और जिसे एक्सपैंशन फ़ाइल का वर्शन चाहिए, उसे शामिल करें.

एक्सपैंशन फ़ाइल का वर्शन नंबर तय करने के कई तरीके हैं. एक आसान तरीका यह है कि डाउनलोड शुरू होने पर वर्शन को SharedPreferences फ़ाइल में सेव करें, ऐसा APKExpansionPolicy क्लास के getExpansionFileName(int index) तरीके से एक्सपैंशन फ़ाइल के नाम से क्वेरी करना. इसके बाद, एक्सपैंशन को ऐक्सेस करने के लिए, SharedPreferences फ़ाइल को पढ़कर वर्शन कोड पाया जा सकता है फ़ाइल से लिए जाते हैं.

शेयर किए गए स्टोरेज से पढ़ने के बारे में ज़्यादा जानकारी के लिए, डेटा स्टोरेज देखें दस्तावेज़.

APK एक्सपैंशन ज़िप लाइब्रेरी का इस्तेमाल करना

Google Market Apk एक्सपैंशन पैकेज में एक लाइब्रेरी शामिल होती है, जिसे APK कहते हैं विस्तार ज़िप लाइब्रेरी (<sdk>/extras/google/google_market_apk_expansion/zip_file/ में स्थित). यह एक वैकल्पिक लाइब्रेरी है, जो बड़ा करने की सुविधा की मदद से, फ़ाइलों को ZIP फ़ाइलों के तौर पर सेव करते समय. इस लाइब्रेरी का इस्तेमाल करके, लेखों को आसानी से पढ़ा जा सकता है अपनी ZIP एक्सपैंशन फ़ाइलों को वर्चुअल फ़ाइल सिस्टम के तौर पर सेव करने के लिए.

APK एक्सपैंशन ज़िप लाइब्रेरी में ये क्लास और एपीआई शामिल हैं:

APKExpansionSupport
यह एक्सपैंशन फ़ाइल नाम और ZIP फ़ाइलें ऐक्सेस करने के कुछ तरीके बताता है:
getAPKExpansionFiles()
वही तरीका जो ऊपर दिखाया गया है जो दोनों एक्सपैंशन के लिए पूरा फ़ाइल पाथ दिखाता है फ़ाइलें शामिल हैं.
getAPKExpansionZipFile(Context ctx, int mainVersion, int patchVersion)
एक ZipResourceFile देता है, जो मुख्य फ़ाइल और दोनों का योग दिखाता है पैच फ़ाइल. इसका मतलब है कि अगर आप mainVersion और patchVersion का इस्तेमाल करने पर, ऐसा ZipResourceFile दिखता है जिससे पढ़ने का ऐक्सेस मिलता है सारा डेटा इकट्ठा करना होगा, जिसमें पैच फ़ाइल का डेटा मुख्य फ़ाइल के ऊपर मर्ज किया गया है.
ZipResourceFile
शेयर किए गए स्टोरेज में एक ZIP फ़ाइल को दिखाता है और वर्चुअल स्टोरेज देने के लिए सभी काम करता है फ़ाइल सिस्टम पर आधारित होता है. आप APKExpansionSupport.getAPKExpansionZipFile() का इस्तेमाल करके या ZipResourceFile के साथ इसे पास करके एक इंस्टेंस पा सकते हैं आपकी एक्सपैंशन फ़ाइल का पाथ. इस क्लास में कई काम के तरीके शामिल हैं, लेकिन आम तौर पर उन्हें ज़्यादातर कॉन्टेंट ऐक्सेस करने की ज़रूरत नहीं होती. इनमें से कुछ ज़रूरी तरीके हैं:
getInputStream(String assetPath)
ZIP फ़ाइल में मौजूद किसी फ़ाइल को पढ़ने के लिए, InputStream देता है. कॉन्टेंट बनाने assetPath को मनचाही फ़ाइल का पाथ होना चाहिए, जो कि ZIP फ़ाइल कॉन्टेंट के रूट में मौजूद है.
getAssetFileDescriptor(String assetPath)
यह फ़ाइल के लिए AssetFileDescriptor देता है ZIP फ़ाइल में शामिल हो. assetPath को मनचाहे फ़ाइल का पाथ होना चाहिए, जो कि ZIP फ़ाइल कॉन्टेंट के रूट में मौजूद है. यह उन Android API के लिए काम का है जिनके लिए AssetFileDescriptor की ज़रूरत होती है, जैसे कि MediaPlayer के कुछ एपीआई.
APEZProvider
ज़्यादातर ऐप्लिकेशन को इस क्लास का इस्तेमाल करने की ज़रूरत नहीं है. यह क्लास एक ContentProvider के बारे में बताती है, जो किसी कॉन्टेंट के ज़रिए ZIP फ़ाइलों के डेटा को मार्शल करती है सेवा देने वाली कंपनी Uri, ताकि कुछ Android API को फ़ाइल का ऐक्सेस दिया जा सके मीडिया फ़ाइलों को Uri ऐक्सेस कर सकेगा. उदाहरण के लिए, अगर आपको VideoView.setVideoURI() का इस्तेमाल करके कोई वीडियो चलाएं.

मीडिया फ़ाइलों को ZIP फ़ॉर्मैट में कंप्रेस न करना

अगर मीडिया फ़ाइलों को सेव करने के लिए एक्सपैंशन फ़ाइलों का इस्तेमाल किया जा रहा है, तो भी ZIP फ़ाइल आपको ये काम करने की अनुमति देती है ऑफ़सेट और लंबाई के नियंत्रण देने वाले Android मीडिया प्लेबैक कॉल का इस्तेमाल करते हैं (जैसे कि MediaPlayer.setDataSource() और SoundPool.load()). ऑर्डर के लिए यह काम करता है, तो आपको ZIP बनाते समय मीडिया फ़ाइलों पर अतिरिक्त संपीड़न नहीं करना चाहिए पैकेज. उदाहरण के लिए, zip टूल का इस्तेमाल करते समय, आपको -n का इस्तेमाल करना चाहिए फ़ाइल के उन सफ़िक्स को तय करने का विकल्प जिन्हें कंप्रेस नहीं किया जाना चाहिए:

zip -n .mp4;.ogg main_expansion media_files

ZIP फ़ाइल से ली गई रीडिंग

APK एक्सपैंशन ज़िप लाइब्रेरी का इस्तेमाल करते समय, आम तौर पर अपनी ZIP फ़ाइल से किसी फ़ाइल को पढ़ने के लिए, फ़ॉलो किया जा रहा है:

Kotlin

// Get a ZipResourceFile representing a merger of both the main and patch files
val expansionFile =
        APKExpansionSupport.getAPKExpansionZipFile(appContext, mainVersion, patchVersion)

// Get an input stream for a known file inside the expansion file ZIPs
expansionFile.getInputStream(pathToFileInsideZip).use {
    ...
}

Java

// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile =
    APKExpansionSupport.getAPKExpansionZipFile(appContext,
        mainVersion, patchVersion);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

ऊपर दिया गया कोड ऐसी किसी भी फ़ाइल का ऐक्सेस देता है जो आपकी मुख्य एक्सपैंशन फ़ाइल या पैच एक्सपैंशन फ़ाइल अपलोड कर सकता है. आपको बस getAPKExpansionFile() वाला तरीका, आपका ऐप्लिकेशन android.content.Context है. साथ ही, मुख्य एक्सपैंशन फ़ाइल और पैच, दोनों के लिए वर्शन नंबर देना होगा एक्सपैंशन फ़ाइल.

अगर आपको किसी खास एक्सपैंशन फ़ाइल से पढ़ना है, तो ZipResourceFile कंस्ट्रक्टर का इस्तेमाल करके, अपनी पसंद की एक्सपैंशन फ़ाइल के पाथ का इस्तेमाल किया जा सकता है:

Kotlin

// Get a ZipResourceFile representing a specific expansion file
val expansionFile = ZipResourceFile(filePathToMyZip)

// Get an input stream for a known file inside the expansion file ZIPs
expansionFile.getInputStream(pathToFileInsideZip).use {
    ...
}

Java

// Get a ZipResourceFile representing a specific expansion file
ZipResourceFile expansionFile = new ZipResourceFile(filePathToMyZip);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

अपनी एक्सपैंशन फ़ाइलों के लिए, इस लाइब्रेरी का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, सैंपल ऐप्लिकेशन की SampleDownloaderActivity क्लास, जिसमें सीआरसी का इस्तेमाल करके डाउनलोड की गई फ़ाइलों की पुष्टि करें. ध्यान रहे कि यदि आप इस नमूने का उपयोग लागू किया जा सकता है, तो इसके लिए ज़रूरी है कि आप अपने एक्सपैंशन के बाइट साइज़ का एलान करें फ़ाइलें xAPKS कलेक्शन में मौजूद होती हैं.

अपनी एक्सपैंशन फ़ाइलों की जांच करना

अपने ऐप्लिकेशन को पब्लिश करने से पहले, आपको इन दो चीज़ों की जांच करनी चाहिए: एक्सपैंशन फ़ाइलें और फ़ाइलें डाउनलोड करना शामिल है.

जांच के लिए इस्तेमाल हुई फ़ाइल को पढ़ा गया

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

  1. अपने डिवाइस में, शेयर किए गए स्टोरेज में ज़रूरत के हिसाब से डायरेक्ट्री बनाएं जहां Google Play आपकी फ़ाइलें सेव कर लेगा.

    उदाहरण के लिए, अगर आपके पैकेज का नाम com.example.android है, तो आपको शेयर किए गए स्टोरेज में मौजूद Android/obb/com.example.android/ डायरेक्ट्री. (प्लग इन करें अपने टेस्ट डिवाइस को कंप्यूटर से कनेक्ट करें, ताकि शेयर किए गए स्टोरेज को माउंट किया जा सके और मैन्युअल तरीके से इसे बनाया जा सके डायरेक्ट्री देखें.)

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

    उदाहरण के लिए, com.example.android ऐप्लिकेशन की मुख्य एक्सपैंशन फ़ाइल main.0300110.com.example.android.obb होनी चाहिए, भले ही फ़ाइल टाइप कुछ भी हो. वर्शन कोड आपकी पसंद के मुताबिक हो सकता है. बस यह ध्यान रखें:

    • मुख्य एक्सपैंशन फ़ाइल हमेशा main से और पैच फ़ाइल इससे शुरू होती है patch.
    • पैकेज का नाम हमेशा उस APK से मेल खाता है जिस पर फ़ाइल अटैच की गई है Google Play से डाउनलोड करें.
  3. अब डिवाइस पर एक्सपैंशन फ़ाइलें मौजूद हैं, इसलिए आपके पास अपने ऐप्लिकेशन को इंस्टॉल करने और चलाने का विकल्प है अपनी एक्सपैंशन फ़ाइल(फ़ाइलों) की जांच करें.

एक्सपैंशन फ़ाइलों को मैनेज करने के बारे में यहां कुछ रिमाइंडर दिए गए हैं:

  • .obb एक्सपैंशन फ़ाइलों को न तो मिटाएं और न ही उनका नाम बदलें. भले ही, आपने इन्हें अनपैक किया हो डेटा को किसी दूसरी जगह पर भेजना). ऐसा करने से Google Play (या आपका ऐप्लिकेशन) एक्सपैंशन फ़ाइल को बार-बार डाउनलोड कर सकेंगे.
  • अपने obb/ में अन्य डेटा सेव न करें डायरेक्ट्री शामिल है. अगर आपको कुछ डेटा अनपैक करना है, तो उसे getExternalFilesDir() में बताई गई जगह पर सेव करें.

फ़ाइल डाउनलोड की जांच की जा रही है

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

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

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

आपका ऐप्लिकेशन अपडेट किया जा रहा है

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

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

अगर ZIP फ़ाइलों का इस्तेमाल अपनी एक्सपैंशन फ़ाइलों के तौर पर किया जाता है, तो APK एक्सपैंशन ज़िप लाइब्रेरी में, Apk एक्सपैंशन पैकेज को मर्ज करने की सुविधा होती है निजी मुख्य एक्सपैंशन फ़ाइल वाली पैच फ़ाइल.

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

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

एक्सपैंशन फ़ाइलों के अपडेट के बारे में ध्यान रखने वाली कुछ समस्याएं यहां दी गई हैं:

  • आपके ऐप्लिकेशन के लिए, एक समय में सिर्फ़ दो एक्सपैंशन फ़ाइलें हो सकती हैं. एक मुख्य जगह फ़ाइल और एक पैच एक्सपैंशन फ़ाइल है. फ़ाइल को अपडेट करने के दौरान, Google Play फ़ाइल को मिटा देता है पिछला वर्शन भी मौजूद है (यह ज़रूरी है कि मैन्युअल अपडेट करते समय आपके ऐप्लिकेशन का इस्तेमाल किया जाए).
  • पैच एक्सपैंशन फ़ाइल जोड़ते समय, Android सिस्टम, असल में ऐप्लिकेशन या मुख्य एक्सपैंशन फ़ाइल का इस्तेमाल करें. आपको अपना ऐप्लिकेशन इस तरह से डिज़ाइन करना चाहिए कि वह पैच डेटा के साथ काम कर सके. हालांकि, Apk एक्सपैंशन पैकेज में ZIP फ़ाइलों का इस्तेमाल करने के लिए एक लाइब्रेरी होती है ये फ़ाइलें, पैच फ़ाइल के डेटा को मुख्य एक्सपैंशन फ़ाइल में मर्ज कर देती हैं. आप पूरा एक्सपैंशन फ़ाइल डेटा आसानी से पढ़ सकते हैं.