व्यवहार में बदलाव: सभी ऐप्लिकेशन

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

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

निजता

Android 11 में उपयोगकर्ता की निजता को बेहतर बनाने के लिए, कुछ बदलाव और पाबंदियां जोड़ी गई हैं. इनमें ये शामिल हैं:

  • एक बार के लिए अनुमतियां: इससे उपयोगकर्ताओं को, जगह की जानकारी, माइक्रोफ़ोन, और कैमरे की अनुमतियों को कुछ समय के लिए ऐक्सेस करने का विकल्प मिलता है.
  • अनुमति वाला डायलॉग दिखना: किसी अनुमति को बार-बार अस्वीकार करने का मतलब है कि "फिर से न पूछें."
  • डेटा ऐक्सेस की ऑडिटिंग: आपका ऐप्लिकेशन, निजी डेटा को कहां से ऐक्सेस करता है, इस बारे में अहम जानकारी पाएं. यह जानकारी, आपके ऐप्लिकेशन के कोड और डिपेंडेंट लाइब्रेरी के कोड, दोनों में मिलेगी.
  • सिस्टम सूचना विंडो की अनुमतियां: कुछ खास कैटगरी के ऐप्लिकेशन को अनुरोध करने पर, SYSTEM_ALERT_WINDOW अनुमति अपने-आप मिल जाती है. साथ ही, जिन इंटेंट में ACTION_MANAGE_OVERLAY_PERMISSION इंटेंट ऐक्शन शामिल होता है वे उपयोगकर्ताओं को हमेशा सिस्टम सेटिंग की स्क्रीन पर ले जाते हैं.
  • हमेशा के लिए सिम आइडेंटिफ़ायर: Android 11 और इसके बाद वाले वर्शन पर, getIccId() वाले तरीके से ऐसे आईसीसीआईडी को ऐक्सेस करने पर पाबंदी है जिन्हें रीसेट नहीं किया जा सकता. यह तरीका ऐसी स्ट्रिंग दिखाता है जो खाली नहीं होती और जो शून्य नहीं होती. डिवाइस में इंस्टॉल किए गए सिम की खास पहचान करने के लिए, getSubscriptionId() के बजाय किसी दूसरे तरीके का इस्तेमाल करें. सदस्यता आईडी, इंस्टॉल किए गए सिम की खास पहचान करने के लिए इंडेक्स वैल्यू (1 से शुरू) देता है. इसमें फ़िज़िकल और इलेक्ट्रॉनिक, दोनों तरह के सिम शामिल हैं. जब तक डिवाइस को फ़ैक्ट्री सेटिंग पर रीसेट नहीं किया जाता, तब तक किसी सिम के लिए इस आइडेंटिफ़ायर की वैल्यू में कोई बदलाव नहीं होता.

ज़्यादा जानने के लिए, निजता पेज देखें.

एक्सपोज़र नोटिफ़िकेशन

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

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

सुरक्षा

SSL सॉकेट, डिफ़ॉल्ट रूप से Conscrypt SSL इंजन का उपयोग करती हैं

Android में डिफ़ॉल्ट रूप से SSLSocket लागू करने की सुविधा, Conscrypt पर आधारित है. Android 11 के बाद, यह सुविधा अंदरूनी तौर पर, Conscrypt के SSLEngine के ऊपर बनाई गई है.

Scudo Hardened Allocator

Android 11 में, हीप ऐलोकेशन को सेवा देने के लिए Scudo हार्डened Allocator का अंदरूनी तौर पर इस्तेमाल किया जा रहा है. Scudo की मदद से, मेमोरी की सुरक्षा से जुड़े कुछ तरह के उल्लंघनों का पता लगाया जा सकता है और उन्हें कम किया जा सकता है. अगर आपको क्रैश की नेटिव रिपोर्ट में, Scudo से जुड़े क्रैश (उदाहरण के लिए, Scudo ERROR:) दिख रहे हैं, तो Scudo से जुड़ी समस्या हल करने के लिए दस्तावेज़ देखें.

ऐप्लिकेशन के इस्तेमाल के आंकड़े

उपयोगकर्ताओं को बेहतर सुरक्षा देने के लिए, Android 11 हर उपयोगकर्ता के ऐप्लिकेशन के इस्तेमाल के आंकड़ों को क्रेडेंशियल एन्क्रिप्ट किए गए स्टोरेज में सेव करता है. इसलिए, न तो सिस्टम और न ही कोई ऐप्लिकेशन उस डेटा को ऐक्सेस कर सकता है, जब तक कि isUserUnlocked() true न दिखाए. ऐसा इनमें से किसी एक स्थिति के बाद होता है:

  • सिस्टम के स्टार्टअप होने के बाद, उपयोगकर्ता अपने डिवाइस को पहली बार अनलॉक करता है.
  • उपयोगकर्ता, डिवाइस पर अपने खाते पर स्विच करता है.

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

एम्युलेटर के लिए 5G सहायता

Android 11 में 5G एपीआई जोड़े गए हैं, ताकि आपके ऐप्लिकेशन में बेहतर सुविधाएं जोड़ी जा सकें. सुविधाओं को जोड़ते समय उनकी जांच करने के लिए, Android SDK टूल के एमुलेटर की नई सुविधाओं का इस्तेमाल किया जा सकता है. यह नई सुविधा, इम्यूलेटर के वर्शन 30.0.22 में जोड़ी गई थी. 5G नेटवर्क सेटिंग चुनने पर, TelephonyDisplayInfo को OVERRIDE_NETWORK_TYPE_NR_NSA पर सेट कर दिया जाता है. साथ ही, अनुमानित बैंडविड्थ में बदलाव होता है. साथ ही, आपको यह पुष्टि करने के लिए मेज़रमेंट सेट करने की अनुमति मिलती है कि आपका ऐप्लिकेशन NET_CAPABILITY_TEMPORARILY_NOT_METERED के स्टेटस में होने वाले बदलावों के हिसाब से सही तरीके से काम कर रहा है या नहीं.

परफ़ॉर्मेंस और डीबग करना

JobScheduler API कॉल की सीमाओं को डीबग करना

Android 11 में, ऐप्लिकेशन के लिए डीबग करने की सुविधा उपलब्ध है. इससे, JobScheduler एपीआई के ऐसे अनुरोधों की पहचान की जा सकती है जो तय दर से ज़्यादा हैं. डेवलपर इस सुविधा का इस्तेमाल परफ़ॉर्मेंस से जुड़ी संभावित समस्याओं की पहचान करने के लिए कर सकते हैं. जिन ऐप्लिकेशन के debuggable मेनिफ़ेस्ट एट्रिब्यूट को 'सही है' पर सेट किया गया है उनके लिए, JobScheduler एपीआई का अनुरोध करने पर, अनुरोधों की संख्या तय सीमा से ज़्यादा होने पर, RESULT_FAILURE दिखेगा. सीमाएं इस तरह से सेट की जाती हैं कि इस्तेमाल के सही उदाहरणों पर कोई असर न पड़े.

फ़ाइल डिस्क्रिप्टर सैनिटाइज़र (fdsan)

Android 10 में fdsan (फ़ाइल डिस्क्रिप्टर सैनिटाइज़र) की सुविधा जोड़ी गई है. fdsan, फ़ाइल डिस्क्रिप्टर के मालिकाना हक को गलत तरीके से इस्तेमाल करने का पता लगाता है. जैसे, बंद करने के बाद इस्तेमाल करना और दो बार बंद करना. Android 11 में, fdsan के लिए डिफ़ॉल्ट मोड बदल रहा है. fdsan अब गड़बड़ी का पता चलने पर प्रोसेस को बंद कर देता है. पहले, चेतावनी को लॉग करके प्रोसेस जारी रखी जाती थी. अगर आपको अपने ऐप्लिकेशन में fdsan की वजह से होने वाले क्रैश मिल रहे हैं, तो fdsan documentation देखें.

SDK टूल में उपलब्ध नहीं होने वाले इंटरफ़ेस से जुड़ी पाबंदियां

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

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

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

Android के इस वर्शन में हुए बदलावों के बारे में ज़्यादा जानने के लिए, Android 11 में, SDK टूल के अलावा अन्य इंटरफ़ेस से जुड़ी पाबंदियों में हुए अपडेट देखें. आम तौर पर, SDK टूल के बाहर के इंटरफ़ेस के बारे में ज़्यादा जानने के लिए, SDK टूल के बाहर के इंटरफ़ेस पर लगी पाबंदियां देखें.

Maps v1 की शेयर की गई लाइब्रेरी हटा दी गई

Maps की शेयर की गई लाइब्रेरी के वर्शन 1 को Android 11 से पूरी तरह हटा दिया गया है. इस लाइब्रेरी का इस्तेमाल पहले बंद कर दिया गया था. साथ ही, Android 10 में ऐप्लिकेशन के लिए, इसका इस्तेमाल करना बंद कर दिया गया था. जिन ऐप्लिकेशन ने पहले Android 9 (एपीआई लेवल 28) या इससे पहले के वर्शन वाले डिवाइसों के लिए, इस शेयर की गई लाइब्रेरी का इस्तेमाल किया था उन्हें अब Android के लिए Maps SDK टूल का इस्तेमाल करना चाहिए.

अन्य ऐप्लिकेशन के साथ इंटरैक्शन

कॉन्टेंट यूआरआई शेयर करना

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

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

लाइब्रेरी लोड हो रही है

पूर्ण पाथ के साथ ICU की सामान्य लाइब्रेरी लोड करना

एपीआई लेवल 28 और इससे पहले के वर्शन को टारगेट करने वाले ऐप्लिकेशन, "/system/lib/libicuuc.so" के पूर्ण पाथ के साथ libicuuc को लोड करने के लिए, dlopen(3) का इस्तेमाल नहीं कर सकते. उन ऐप्लिकेशन के लिए, dlopen("/system/lib/libicuuc.so", ...) कोई हैंडल नहीं दिखाएगा.

इसके बजाय, लाइब्रेरी को लोड करने के लिए, कृपया फ़ाइल के नाम के तौर पर लाइब्रेरी का नाम इस्तेमाल करें. उदाहरण के लिए, dlopen("libicuuc.so", ...).