Android 16 प्लैटफ़ॉर्म में, ऐप्लिकेशन के काम करने के तरीके में कुछ बदलाव किए गए हैं. इन बदलावों का असर आपके ऐप्लिकेशन पर पड़ सकता है. ऐप्लिकेशन के काम करने के तरीके में ये बदलाव, Android 16 पर चलने वाले सभी ऐप्लिकेशन पर लागू होते हैं. इससे कोई फ़र्क़ नहीं पड़ता कि targetSdkVersion
क्या है. आपको अपने ऐप्लिकेशन की जांच करनी चाहिए. इसके बाद, ज़रूरत पड़ने पर इन बदलावों के साथ काम करने के लिए, उसमें बदलाव करना चाहिए.
मुख्य फ़ंक्शन
Android 16 में ये बदलाव किए गए हैं. इनसे Android सिस्टम की मुख्य सुविधाओं में बदलाव होता है या उन्हें बेहतर बनाया जाता है.
JobScheduler कोटा ऑप्टिमाइज़ेशन
Android 16 से, हम सामान्य और तेज़ी से होने वाली प्रोसेस के लिए, टास्क को पूरा करने में लगने वाले समय के कोटे में बदलाव कर रहे हैं. यह बदलाव इन बातों के आधार पर किया जा रहा है:
- ऐप्लिकेशन किस ऐप्लिकेशन स्टैंडबाय बकेट में है: Android 16 में, ऐक्टिव स्टैंडबाय बकेट को ज़्यादा रनटाइम कोटा के हिसाब से लागू किया जाएगा.
- अगर ऐप्लिकेशन टॉप स्टेटस में होने पर जॉब शुरू होता है: Android 16 में, ऐप्लिकेशन के दिखने के दौरान शुरू होने वाले और ऐप्लिकेशन के न दिखने के बाद भी जारी रहने वाले जॉब, जॉब के रनटाइम कोटे के मुताबिक चलेंगे.
- अगर कोई जॉब, फ़ोरग्राउंड सेवा के साथ चल रहा है: Android 16 में, फ़ोरग्राउंड सेवा के साथ चल रहे जॉब, जॉब के रनटाइम कोटे का पालन करेंगे. अगर उपयोगकर्ता की ओर से किए जाने वाले डेटा ट्रांसफ़र के लिए, टास्क का इस्तेमाल किया जा रहा है, तो इसके बजाय उपयोगकर्ता की ओर से किए जाने वाले डेटा ट्रांसफ़र के टास्क का इस्तेमाल करें.
इस बदलाव का असर, WorkManager, JobScheduler, और
DownloadManager का इस्तेमाल करके शेड्यूल किए गए टास्क पर पड़ेगा. किसी जॉब के रुकने की वजह जानने के लिए, हमारा सुझाव है कि आप WorkInfo.getStopReason()
को कॉल करके, यह लॉग करें कि आपकी जॉब क्यों रुकी. JobScheduler जॉब के लिए, JobParameters.getStopReason()
को कॉल करें.
बैटरी को ऑप्टिमाइज़ करने के सबसे सही तरीकों के बारे में ज़्यादा जानने के लिए, टास्क शेड्यूलिंग एपीआई के लिए बैटरी के इस्तेमाल को ऑप्टिमाइज़ करने के बारे में दिए गए दिशा-निर्देश देखें.
हमारा सुझाव है कि किसी जॉब के लागू न होने की वजह जानने के लिए, Android 16 में जोड़े गए नए JobScheduler#getPendingJobReasonsHistory
एपीआई का इस्तेमाल करें.
टेस्ट करना
अपने ऐप्लिकेशन के व्यवहार की जांच करने के लिए, कुछ जॉब कोटा ऑप्टिमाइज़ेशन को बदलने की सुविधा चालू की जा सकती है. हालांकि, ऐसा तब तक ही किया जा सकता है, जब तक ऐप्लिकेशन Android 16 डिवाइस पर चल रहा हो.
"टॉप स्टेटस, जॉब के रनटाइम कोटा का पालन करेगा" को लागू करने की सुविधा बंद करने के लिए, यह adb
निर्देश चलाएं:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
"फ़ोरग्राउंड सेवा के साथ-साथ चल रही जॉब, जॉब के रनटाइम कोटे का पालन करेंगी" को लागू करने की सुविधा बंद करने के लिए, यह adb
कमांड चलाएं:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
ऐप्लिकेशन की स्टैंडबाय बकेट के कुछ व्यवहार की जांच करने के लिए, यहां दिए गए adb
कमांड का इस्तेमाल करके, अपने ऐप्लिकेशन की स्टैंडबाय बकेट सेट की जा सकती है:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
आपका ऐप्लिकेशन, ऐप्लिकेशन स्टैंडबाय बकेट में किस कैटगरी में आता है, यह जानने के लिए, adb
कमांड का इस्तेमाल करके अपने ऐप्लिकेशन की ऐप्लिकेशन स्टैंडबाय बकेट देखी जा सकती है:
adb shell am get-standby-bucket APP_PACKAGE_NAME
JobInfo#setImportantWhileForeground को पूरी तरह बंद करना
JobInfo.Builder#setImportantWhileForeground(boolean)
तरीका, शेड्यूलिंग ऐप्लिकेशन के फ़ोरग्राउंड में होने या बैकग्राउंड में काम करने से जुड़ी पाबंदियों से कुछ समय के लिए छूट मिलने पर, किसी टास्क की अहमियत दिखाता है.
Android 12 (एपीआई लेवल 31) के बाद, यह तरीका काम नहीं करता. Android 16 से, यह तरीका ठीक से काम नहीं करता. साथ ही, इस तरीके को कॉल करने पर, उसे अनदेखा कर दिया जाएगा.
यह सुविधा हटाने का फ़ैसला, JobInfo#isImportantWhileForeground()
पर भी लागू होता है. Android
16 में, अगर इस तरीके को कॉल किया जाता है, तो यह false
दिखाता है.
क्रम से चलने वाले ब्रॉडकास्ट की प्राथमिकता का दायरा अब ग्लोबल नहीं है
Android ऐप्लिकेशन, ब्रॉडकास्ट रिसीवर पर प्राथमिकताएं तय कर सकते हैं. इससे, यह कंट्रोल किया जा सकता है कि रिसीवर, ब्रॉडकास्ट को किस क्रम में पाएं और प्रोसेस करें. मेनिफ़ेस्ट में बताए गए रिसीवर के लिए, ऐप्लिकेशन प्राथमिकता तय करने के लिए android:priority
एट्रिब्यूट का इस्तेमाल कर सकते हैं. वहीं, कॉन्टेक्स्ट के हिसाब से रजिस्टर किए गए रिसीवर के लिए, ऐप्लिकेशन प्राथमिकता तय करने के लिए IntentFilter#setPriority()
एपीआई का इस्तेमाल कर सकते हैं. जब कोई ब्रॉडकास्ट भेजा जाता है, तो सिस्टम उसे पाने वालों को उनकी प्राथमिकता के हिसाब से डिलीवर करता है. इसमें, सबसे ज़्यादा प्राथमिकता वाले व्यक्ति से लेकर सबसे कम प्राथमिकता वाले व्यक्ति तक का क्रम होता है.
Android 16 में, अलग-अलग प्रोसेस में android:priority
एट्रिब्यूट या IntentFilter#setPriority()
का इस्तेमाल करके, ब्रॉडकास्ट डिलीवरी के क्रम की गारंटी नहीं दी जाएगी. ब्रॉडकास्ट की प्राथमिकताएं, सभी प्रोसेस के बजाय सिर्फ़ एक ही आवेदन की प्रोसेस में लागू होंगी.
साथ ही, ब्रॉडकास्ट की प्राथमिकताएं अपने-आप इस सीमा में सीमित हो जाएंगी (SYSTEM_LOW_PRIORITY
+ 1,
SYSTEM_HIGH_PRIORITY
- 1). सिर्फ़ सिस्टम कॉम्पोनेंट को SYSTEM_LOW_PRIORITY
, SYSTEM_HIGH_PRIORITY
को ब्रॉडकास्ट प्राथमिकता के तौर पर सेट करने की अनुमति होगी.
अगर आपका ऐप्लिकेशन इनमें से कोई एक काम करता है, तो उस पर असर पड़ सकता है:
- आपके ऐप्लिकेशन ने एक ही ब्रॉडकास्ट इंटेंट के साथ कई प्रोसेस का एलान किया है. साथ ही, प्राथमिकता के आधार पर उन इंटेंट को किसी खास क्रम में पाने की उम्मीद की है.
- आपके ऐप्लिकेशन की प्रोसेस, अन्य प्रोसेस के साथ इंटरैक्ट करती है. साथ ही, यह किसी खास क्रम में ब्रॉडकास्ट इंटेंट पाने की उम्मीद करती है.
अगर प्रोसेस को एक-दूसरे के साथ काम करना है, तो उन्हें अन्य चैनलों का इस्तेमाल करके कम्यूनिकेट करना चाहिए.
एआरटी में हुए बदलाव
Android 16 में, Android Runtime (ART) के नए अपडेट शामिल हैं. इनसे Android Runtime (ART) की परफ़ॉर्मेंस बेहतर होती है और Java की अन्य सुविधाओं के साथ काम करने में मदद मिलती है. Google Play के सिस्टम अपडेट की मदद से, ये सुधार Android 12 (एपीआई लेवल 31) और उसके बाद के वर्शन वाले एक अरब से ज़्यादा डिवाइसों के लिए भी उपलब्ध हैं.
ये बदलाव रिलीज़ होने के बाद, हो सकता है कि ART के इंटरनल स्ट्रक्चर पर निर्भर रहने वाली लाइब्रेरी और ऐप्लिकेशन कोड, Android 16 वाले डिवाइसों पर सही से काम न करें. साथ ही, ऐसा उन Android वर्शन पर भी हो सकता है जो Google Play के सिस्टम अपडेट के ज़रिए ART मॉड्यूल को अपडेट करते हैं.
डिवाइस के अंदर मौजूद स्ट्रक्चर (जैसे, नॉन-SDK इंटरफ़ेस) पर भरोसा करने से, काम करने से जुड़ी समस्याएं हमेशा हो सकती हैं. हालांकि, यह ज़रूरी है कि आप ऐसे कोड (या कोड वाली लाइब्रेरी) पर भरोसा न करें जो डिवाइस के अंदर मौजूद ART स्ट्रक्चर का इस्तेमाल करता हो. ऐसा इसलिए, क्योंकि ART में होने वाले बदलाव, डिवाइस पर चल रहे प्लैटफ़ॉर्म के वर्शन से जुड़े नहीं होते. साथ ही, ये बदलाव Google Play के सिस्टम अपडेट के ज़रिए एक अरब से ज़्यादा डिवाइसों पर लागू होते हैं.
सभी डेवलपर को यह देखना चाहिए कि Android 16 पर अपने ऐप्लिकेशन की पूरी तरह से जांच करने पर, उन पर असर पड़ा है या नहीं. इसके अलावा, जानी-पहचानी समस्याओं की सूची देखें. इससे आपको पता चलेगा कि आपका ऐप्लिकेशन, उन लाइब्रेरी पर निर्भर है या नहीं जिनकी पहचान हमने की है और जो इंटरनल ART स्ट्रक्चर पर निर्भर हैं. अगर आपके ऐप्लिकेशन कोड या लाइब्रेरी डिपेंडेंसी पर असर पड़ा है, तो जब भी हो सके सार्वजनिक एपीआई के विकल्प खोजें. साथ ही, नए इस्तेमाल के उदाहरणों के लिए सार्वजनिक एपीआई का अनुरोध करें. इसके लिए, हमारे समस्या ट्रैकर में सुविधा का अनुरोध करें.
उपयोगकर्ता अनुभव और सिस्टम यूज़र इंटरफ़ेस (यूआई)
Android 16 में ये बदलाव किए गए हैं, ताकि उपयोगकर्ता को एक जैसा और बेहतर अनुभव मिल सके.
सुलभता से जुड़ी परेशान करने वाली सूचनाओं को बंद करना
Android 16 में, सुलभता से जुड़ी सूचनाओं का इस्तेमाल नहीं किया जा सकता. इन सूचनाओं के लिए, announceForAccessibility
का इस्तेमाल किया जाता है या TYPE_ANNOUNCEMENT
सुलभता इवेंट भेजे जाते हैं. इनकी वजह से, TalkBack और Android के स्क्रीन रीडर का इस्तेमाल करने वाले लोगों को अलग-अलग अनुभव मिल सकते हैं. साथ ही, Android की सहायक तकनीकों की मदद से, लोगों की ज़्यादा से ज़्यादा ज़रूरतों को पूरा करने के लिए, इन विकल्पों का इस्तेमाल किया जा सकता है.
विकल्पों के उदाहरण:
- विंडो में बदलाव जैसे यूज़र इंटरफ़ेस (यूआई) में होने वाले अहम बदलावों के लिए,
Activity.setTitle(CharSequence)
औरsetAccessibilityPaneTitle(java.lang.CharSequence)
का इस्तेमाल करें. लिखने के लिए इस्तेमाल होने वाले टूल में,Modifier.semantics { paneTitle = "paneTitle" }
का इस्तेमाल करें - ज़रूरी यूज़र इंटरफ़ेस (यूआई) में हुए बदलावों के बारे में उपयोगकर्ता को बताने के लिए,
setAccessibilityLiveRegion(int)
का इस्तेमाल करें. लिखें में,Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
का इस्तेमाल करें . इनका इस्तेमाल कम से कम करना चाहिए, क्योंकि हर बार व्यू अपडेट होने पर ये सूचनाएं जनरेट कर सकते हैं. - उपयोगकर्ताओं को गड़बड़ियों के बारे में सूचना देने के लिए, टाइप के
AccessibilityEvent
को भेजेंAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
औरAccessibilityNodeInfo#setError(CharSequence)
सेट करें याTextView#setError(CharSequence)
का इस्तेमाल करें.
बंद किए गए announceForAccessibility
एपीआई के रेफ़रंस दस्तावेज़ में, सुझाए गए विकल्पों के बारे में ज़्यादा जानकारी शामिल है.
तीन बटन वाले नेविगेशन के लिए सहायता
Android 16 में, तीन बटन वाले नेविगेशन के लिए, ऐप्लिकेशन के पिछले पेज पर जाने की सुविधा जोड़ी गई है. हालांकि, यह सुविधा सिर्फ़ उन ऐप्लिकेशन के लिए उपलब्ध है जिन्हें पिछले पेज पर जाने की सुविधा के लिए सही तरीके से माइग्रेट किया गया हो. 'वापस जाएं' बटन को दबाकर रखने पर, प्रिडिक्टिव बैक ऐनिमेशन शुरू होता है. इससे आपको यह झलक मिलती है कि 'वापस जाएं' स्वाइप करने पर, आपको कहां ले जाया जाएगा.
यह सुविधा, सिस्टम के उन सभी हिस्सों पर लागू होती है जिनमें प्रिडिक्टिव बैक ऐनिमेशन काम करते हैं. इनमें सिस्टम ऐनिमेशन (होम स्क्रीन पर वापस जाने, एक टास्क से दूसरे टास्क पर जाने, और एक गतिविधि से दूसरी गतिविधि पर जाने) भी शामिल हैं.