अलग-अलग स्क्रीन साइज़ के हिसाब से कई APK बनाएं

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

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

पुष्टि करें कि आपको एक से ज़्यादा APKs की ज़रूरत है

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

अगर आपके पास अपने ऐप्लिकेशन को एक ही APK में सीमित करने का विकल्प है, तो आपको कई फ़ायदे मिल सकते हैं. इनमें ये भी शामिल हैं:

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

इस लेसन के बाकी हिस्से में यह माना गया है कि आपने इस विषय पर रिसर्च की है, लिंक किए गए रिसॉर्स में मौजूद कॉन्टेंट को ध्यान से पढ़ा है, और यह तय किया है कि आपके ऐप्लिकेशन के लिए एक से ज़्यादा APK सही हैं.

अपनी ज़रूरतों को चार्ट में दिखाना

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

छोटा सामान्य बड़ा xlarge

अब चार्ट में रंग भरें, ताकि हर रंग किसी APK को दिखाता हो. यहां एक उदाहरण दिया गया है, जिसमें बताया गया है कि हर APK को स्क्रीन साइज़ की किसी खास रेंज पर कैसे लागू किया जा सकता है.

छोटा सामान्य बड़ा xlarge

अपनी ज़रूरतों के हिसाब से, आपके पास दो APK भी हो सकते हैं, "छोटा और बाकी सभी" या "बड़ा और बाकी सभी". चार्ट में रंग भरने से, टीम के बीच बातचीत करना भी आसान हो जाता है. अब हर APK को "नीला", "हरा" या "लाल" के तौर पर आसानी से रेफ़र किया जा सकता है. भले ही, वह कितनी भी अलग-अलग स्क्रीन टाइप को कवर करता हो.

लाइब्रेरी प्रोजेक्ट में सभी सामान्य कोड और संसाधन डालना

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

ध्यान दें: लाइब्रेरी प्रोजेक्ट बनाने और उन्हें शामिल करने का तरीका, इस लेसन में नहीं बताया गया है. हालांकि, Android लाइब्रेरी बनाना लेख पढ़कर, इस बारे में ज़्यादा जानकारी पाई जा सकती है.

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

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

नए APK प्रोजेक्ट बनाना

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

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

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

मेनिफ़ेस्ट में बदलाव करना

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

  • मेनिफ़ेस्ट में यह दिखना चाहिए कि वह APK ज़रूरी शर्तें पूरी करता है
  • ज़रूरी शर्तें पूरी करने वाले APK में से, सबसे ज़्यादा वर्शन नंबर वाला APK चुन लिया जाता है

उदाहरण के लिए, पहले बताए गए कई APKs के सेट को लेते हैं और मान लें कि हर APK को अपने "टारगेट" स्क्रीन साइज़ से बड़े सभी स्क्रीन साइज़ के साथ काम करने के लिए सेट किया गया है. अलग-अलग APK के लिए, साइज़ की संभावित सीमा इस तरह दिखेगी:

छोटा सामान्य बड़ा xlarge
छोटा सामान्य बड़ा xlarge
छोटा सामान्य बड़ा xlarge

हालांकि, "सबसे ज़्यादा वर्शन नंबर वाला ऐप्लिकेशन जीतता है" नियम का इस्तेमाल करके, अगर हम हर APK में वर्शन कोड एट्रिब्यूट को इस तरह सेट करते हैं कि लाल ≥ हरा ≥ नीला हो, तो चार्ट इस तरह दिखेगा:

छोटा सामान्य बड़ा xlarge

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

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

अपने सभी APK को अलग-अलग "ट्रैक" पर रखने के लिए, वर्शन कोड के लिए एक अच्छा स्कीम होना ज़रूरी है. सुझाया गया कोड, हमारी डेवलपर गाइड के वर्शन कोड सेक्शन में देखा जा सकता है. APK के उदाहरण के सेट में, सिर्फ़ तीन संभावित डाइमेंशन में से एक का इस्तेमाल किया गया है. इसलिए, हर APK को 1,000 से अलग करके, उससे आगे बढ़ना काफ़ी होगा. यह इस तरह दिख सकता है:

ब्लू: 1001, 1002, 1003, 1004...
हरा: 2001, 2002, 2003, 2004...
लाल:3001, 3002, 3003, 3004...

इन सभी को एक साथ जोड़ने पर, आपके Android मेनिफ़ेस्ट कुछ इस तरह दिख सकते हैं:

नीला:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

हरा:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

लाल:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

ध्यान दें कि तकनीकी तौर पर, एक से ज़्यादा APK, supports-screens टैग या compatible-screens टैग में से किसी एक के साथ काम करेंगे. आम तौर पर, Supports-screens को प्राथमिकता दी जाती है. साथ ही, एक ही मेनिफ़ेस्ट में दोनों टैग का इस्तेमाल करना आम तौर पर बहुत खराब विचार है. इससे चीज़ें ज़रूरत से ज़्यादा मुश्किल हो जाती हैं और गड़बड़ियों की संभावना बढ़ जाती है. यह भी ध्यान दें कि डिफ़ॉल्ट वैल्यू का फ़ायदा लेने के बजाय (छोटा और सामान्य हमेशा डिफ़ॉल्ट रूप से सही होते हैं), मेनिफ़ेस्ट हर स्क्रीन साइज़ के लिए वैल्यू को साफ़ तौर पर सेट करते हैं. इससे आपको आने वाले समय में परेशानियों से बचने में मदद मिल सकती है. उदाहरण के लिए, अगर किसी मेनिफ़ेस्ट में टारगेट SDK टूल का वर्शन 9 से कम है, तो xlarge अपने-आप 'गलत है' पर सेट हो जाएगा. ऐसा इसलिए, क्योंकि यह साइज़ तब मौजूद नहीं था. इसलिए, साफ़ तौर पर बताएं!

प्री-लॉन्च चेकलिस्ट की समीक्षा करना

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

  • सभी APK का पैकेज नाम एक ही होना चाहिए
  • सभी APK पर एक ही सर्टिफ़िकेट से हस्ताक्षर किया जाना चाहिए
  • जिस स्क्रीन साइज़ के लिए आपको अपने APK को काम करना है उसके लिए, मेनिफ़ेस्ट में 'सही है' पर सेट करें. हर स्क्रीन साइज़ के लिए, 'गलत है' पर सेट करें
  • मेनिफ़ेस्ट फ़िल्टर में दी गई जानकारी में कोई अंतर न हो, इसकी दोबारा जांच करें. ऐसा APK जिसे सिर्फ़ XLARGE स्क्रीन पर, Cupcake वर्शन के साथ इस्तेमाल किया जा सकता है उसे कोई नहीं देख पाएगा
  • हर APK का मेनिफ़ेस्ट, काम करने वाली स्क्रीन, ओपनजीएल टेक्सचर या प्लैटफ़ॉर्म वर्शन में से कम से कम एक के लिए यूनीक होना चाहिए
  • हर APK को कम से कम एक डिवाइस पर टेस्ट करें. इसके अलावा, आपके पास अपनी डेवलपमेंट मशीन पर, कारोबार में सबसे ज़्यादा पसंद किए जाने वाले डिवाइस एमुलेटर में से एक है. आनंद लें!

मार्केट में पॉइंट करने से पहले, कंपाइल किए गए APK की जांच करना भी ज़रूरी है. इससे यह पक्का किया जा सकता है कि कोई भी ऐसा आश्चर्यजनक बदलाव न हो जिसकी वजह से Google Play पर आपका ऐप्लिकेशन न दिखे. "aapt" टूल का इस्तेमाल करके, ऐसा करना बहुत आसान है. Aapt (Android ऐसेट पैकेजिंग टूल), आपके Android ऐप्लिकेशन बनाने और पैकेज करने की प्रोसेस का हिस्सा है. साथ ही, यह ऐप्लिकेशन की जांच करने के लिए भी एक बहुत ही आसान टूल है.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

aapt आउटपुट की जांच करते समय, पक्का करें कि आपके पास supports-screens और compatible-screens के लिए, एक-दूसरे से मेल न खाने वाली वैल्यू न हों. साथ ही, आपके पास ऐसी "uses-feature" वैल्यू भी न हों जो आपने मैनिफ़ेस्ट में सेट की गई अनुमतियों की वजह से जोड़ी गई हों. ऊपर दिए गए उदाहरण में, APK सभी डिवाइसों पर नहीं दिखेगा. हालांकि, ज़्यादातर डिवाइसों पर दिखेगा.

क्यों? SEND_SMS की ज़रूरी अनुमति जोड़ने पर, android.hardware.telephony की सुविधा की ज़रूरी शर्त अपने-आप जुड़ गई. ज़्यादातर (अगर सभी नहीं) बड़े डिवाइस टैबलेट होते हैं. इनमें टेलीफ़ोन हार्डवेयर नहीं होता. ऐसे में, Google Play इन मामलों में इस APK को फ़िल्टर कर देगा. ऐसा तब तक होगा, जब तक आने वाले समय में ऐसे डिवाइस नहीं आ जाते जो बड़े स्क्रीन साइज़ के तौर पर रिपोर्ट किए जा सकें और जिनमें टेलीफ़ोन हार्डवेयर हो.

हालांकि, इसे आसानी से ठीक किया जा सकता है. इसके लिए, अपने मेनिफ़ेस्ट में ये चीज़ें जोड़ें:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

android.hardware.touchscreen की ज़रूरी शर्त भी अपने-आप जुड़ जाती है. अगर आपको अपने APK को टचस्क्रीन वाले डिवाइसों के अलावा, अन्य टीवी पर भी दिखाना है, तो आपको अपने मेनिफ़ेस्ट में ये चीज़ें जोड़नी होंगी:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

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

Google Play पर एक से ज़्यादा APK पब्लिश करने के बारे में ज़्यादा जानने के लिए, एक से ज़्यादा APK के लिए सहायता लेख पढ़ें.