व्यवहार में बदलाव: एपीआई 29+ को टारगेट करने वाले ऐप्लिकेशन

Android 10 में, सिस्टम के व्यवहार में अपडेट किए गए बदलाव शामिल हैं. ये बदलाव आपके ऐप्लिकेशन पर असर डाल सकते हैं. इस पेज पर दिए गए बदलाव, खास तौर पर टारगेट किए जा रहे ऐप्लिकेशन पर लागू होते हैं एपीआई 29 या उसके बाद का वर्शन. अगर आपका ऐप्लिकेशन, targetSdkVersion को "29" पर सेट करता है या ज़्यादा है, तो आपको इन व्यवहार के हिसाब से काम करने के लिए अपने ऐप्लिकेशन में बदलाव करना चाहिए. जहां लागू हो.

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

ध्यान दें: इस पेज पर बताए गए बदलावों के अलावा, Android 10 पर निजता के आधार पर कई बदलाव और पाबंदियां लागू की गई हैं, जिनमें ये शामिल हैं निम्न:

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

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

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

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

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

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

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

शेयर की गई यादें

Ashmem ने /proc/<pid>/maps में dalvik maps का फ़ॉर्मैट बदल दिया है. इससे उन ऐप्लिकेशन पर असर पड़ता है जो सीधे maps फ़ाइल को पार्स करते हैं. ऐप्लिकेशन डेवलपर को यह करना चाहिए चलने वाले डिवाइसों पर /proc/<pid>/maps फ़ॉर्मैट की जांच करें Android 10 या उसके बाद वाला वर्शन होना चाहिए और अगर ऐप्लिकेशन Dalvik मैप फ़ॉर्मैट में होना चाहिए.

Android 10 को टारगेट करने वाले ऐप्लिकेशन, सीधे तौर पर असहमम का इस्तेमाल नहीं कर सकते (/dev/ashmem) को ऐक्सेस करना होगा. इसके बजाय, शेयर की गई 'यादें' को एनडीके से ऐक्सेस करना होगा ASharedMemory क्लास. इसके अलावा, ऐप्लिकेशन मौजूदा AShmem फ़ाइल डिस्क्रिप्टर के लिए सीधे IOCTLs नहीं बना सकते हैं और इसके बजाय NDK की ASharedMemory क्लास या Android Java का इस्तेमाल करना चाहिए शेयर की गई मेमोरी वाले इलाके बनाने के लिए एपीआई. इस बदलाव से सुरक्षा और शेयर की गई मेमोरी के साथ काम करते समय मज़बूत बनाना, परफ़ॉर्मेंस और सुरक्षा को बेहतर बनाना Android को सुरक्षित रखते हैं.

ऐप्लिकेशन की होम डायरेक्ट्री को एक्ज़ीक्यूट करने की अनुमति हटाई गई

लिखने योग्य ऐप्लिकेशन की होम डायरेक्ट्री से फ़ाइलों का निष्पादन एक W^X उल्लंघन. ऐप्लिकेशन को सिर्फ़ वह बाइनरी कोड लोड करना चाहिए जिसे किसी ऐप्लिकेशन की APK फ़ाइल में एम्बेड किया गया है.

Android 10 को टारगेट करने वाले गैर-भरोसेमंद ऐप्लिकेशन execve() शुरू नहीं कर सकते ऐप्लिकेशन की होम डायरेक्ट्री में मौजूद फ़ाइलों पर लागू किया जा सकता है.

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

Android रनटाइम पर सिर्फ़ सिस्टम से जनरेट की गई ओएटी फ़ाइलें इस्तेमाल की जा सकती हैं

Android रनटाइम (ART), अब ऐप्लिकेशन से dex2oat को शुरू नहीं करता है प्रोसेस. इस बदलाव का मतलब है कि ART केवल उन OAT फ़ाइलों को स्वीकार करेगा, जिन्हें सिस्टम ने जनरेट किया है.

ART में एओटी के सटीक होने को लागू करना

पहले, Android Runtime (ART) के ज़रिए, पहले से (AOT) कंपाइल करने की सुविधा की वजह से, रनटाइम क्रैश हो सकते थे. ऐसा तब होता था, जब कंपाइल करने के समय और रनटाइम के समय क्लासपथ एनवायरमेंट एक जैसा नहीं होता था. Android 10 और इसके बाद के वर्शन आस-पास के इन कॉन्टेक्स्ट को हमेशा एक जैसा रखने की ज़रूरत होती है. इससे व्यवहार में ये बदलाव होते हैं:

  • कस्टम क्लास लोडर—यानी, क्लास के उलट, ऐप्लिकेशन के ज़रिए लिखे गए क्लास लोडर dalvik.system पैकेज के लोडर—AOT-संकलित नहीं थे. ऐसा इसलिए है, क्योंकि रनटाइम के दौरान, एआरटी को कस्टमाइज़ की गई क्लास लुकअप लागू करने के बारे में पता नहीं चलता.
  • सेकंडरी dex फ़ाइलें—यानी कि वे dex फ़ाइलें जिन्हें मैन्युअल तरीके से लोड किया जाता है प्राथमिक APK—एओटी से बैकग्राउंड में कंपाइल किए जाते हैं. ऐसा इसलिए है, क्योंकि पहली बार इस्तेमाल कंपाइलेशन काफ़ी महंगा हो सकता है. इसकी वजह से, कॉन्टेंट को दिखने में देरी लागू करता है. ध्यान दें कि ऐप्लिकेशन के लिए स्प्लिट का इस्तेमाल करना और सेकंडरी सेटिंग को छोड़ना dex फ़ाइलों का सुझाव दिया जाता है.
  • Android में शेयर की गई लाइब्रेरी (एंट्री <library> और <uses-library> लागू करने के लिए, एक अलग क्लास लोड करने की उस हैरारकी का इस्तेमाल करें जिसे प्लैटफ़ॉर्म के पिछले वर्शन में इस्तेमाल किया गया था.

फ़ुलस्क्रीन इंटेंट के लिए, अनुमतियों में बदलाव

ऐसे ऐप्लिकेशन जो Android 10 या इसके बाद वाले वर्शन को टारगेट करते हैं और फ़ुल स्क्रीन इंटेंट को अनुरोध करना होगा यह USE_FULL_SCREEN_INTENT की अनुमति देनी होगी. यह एक सामान्य घटना है की अनुमति है, इसलिए सिस्टम अनुरोध करने वाले ऐप्लिकेशन को अपने-आप भेज देता है.

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

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

फ़ोल्डेबल डिवाइसों के लिए सहायता

Android 10 में ऐसे बदलाव किए गए हैं जो फ़ोल्ड किए जा सकने वाले डिवाइसों और बड़ी स्क्रीन वाले डिवाइसों पर भी काम करते हैं.

जब कोई ऐप्लिकेशन Android 10 पर चलता है, तो onResume() और onPause() तरीके काम करते हैं इसे अलग तरीके से. जब मल्टी-विंडो में एक साथ कई ऐप्लिकेशन दिखते हैं या मल्टी-डिसप्ले मोड, जिसमें दिख रहे स्टैक में फ़ोकस करने लायक सभी मुख्य गतिविधियां हैं फिर से शुरू की गई स्थिति में हैं, लेकिन इनमें से सिर्फ़ एक है, "सबसे पहले फिर से शुरू किया गया" गतिविधि, फ़ोकस होता है. Android 10 से पहले के वर्शन पर, सिस्टम में एक बार में सिर्फ़ एक गतिविधि को फिर से शुरू किया जा सकता है. साथ ही, दिख रही अन्य सभी गतिविधियां रोक दी जाती हैं.

"फ़ोकस" को भ्रम में न डालें "सबसे ऊपर फिर से शुरू किया गया" गतिविधि. सिस्टम, उन गतिविधियों की प्राथमिकता जो ज़ेड-ऑर्डर पर आधारित होती हैं, ताकि इन प्राथमिकताओं को प्राथमिकता दी जा सके उपयोगकर्ता ने पिछली बार किन गतिविधियों से इंटरैक्ट किया था. कोई गतिविधि ऊपर-फिर से शुरू किया गया, लेकिन फ़ोकस नहीं किया गया है (उदाहरण के लिए, अगर नोटिफ़िकेशन शेड बड़ा किया गया).

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

resizeableActivity मेनिफ़ेस्ट एट्रिब्यूट भी बदल गया है. अगर कोई ऐप्लिकेशन सेट किया जाता है, तो Android 10 (एपीआई लेवल 29) या उसके बाद के वर्शन में, resizeableActivity=false है, तो उसे कंपैटबिलिटी मोड में रखा जा सकता है जब उपलब्ध स्क्रीन का साइज़ बदलता है या ऐप्लिकेशन एक स्क्रीन से दूसरी स्क्रीन पर कोई दूसरा.

ऐप्लिकेशन, android:minAspectRatio एट्रिब्यूट, जिसकी शुरुआत Android 10 में की गई थी. इसका इस्तेमाल, स्क्रीन अनुपात जो आपके ऐप्लिकेशन पर काम करते हैं.

Android Studio का एम्युलेटर टूल, 3.5 और इसके बाद के वर्शन में उपलब्ध है 7.3" शामिल है और 8" बड़ी स्क्रीन के साथ अपने कोड की जांच करने के लिए, वर्चुअल डिवाइसों का इस्तेमाल करें.

ज़्यादा जानकारी के लिए, फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए अपने ऐप्लिकेशन डिज़ाइन करना लेख पढ़ें.