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

Android 9 (एपीआई लेवल 28) में, Android सिस्टम में कई बदलाव किए गए हैं. नीचे दिए गए व्यवहार में बदलाव खास तौर से टारगेट किए जा रहे ऐप्लिकेशन पर लागू होते हैं एपीआई लेवल 28 या उसके बाद का वर्शन. ऐसे ऐप्लिकेशन जो targetSdkVersion को एपीआई लेवल 28 पर सेट करते हैं या उच्च को संशोधित करना होगा जहां भी लागू हो, वे इस तरह की गतिविधियों को ठीक से पूरा करने में मदद करें.

Android 9 पर चलने वाले सभी ऐप्लिकेशन पर असर डालने वाले बदलावों के बारे में जानने के लिए, ऐप्लिकेशन के काम करने के तरीके में बदलाव: सभी ऐप्लिकेशन देखें. भले ही, वे किसी भी API लेवल को टारगेट करते हों.

फ़ोरग्राउंड सेवाएं

Android 9 या इसके बाद के वर्शन को टारगेट करने वाले और फ़ोरग्राउंड सेवाओं का इस्तेमाल करने वाले ऐप्लिकेशन को FOREGROUND_SERVICE अनुमति. यह सामान्य अनुमति है. इसलिए, सिस्टम अनुरोध करने वाले ऐप्लिकेशन को यह अनुमति अपने-आप देता है.

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

निजता से जुड़े बदलाव

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

सीरियल नंबर का इस्तेमाल बंद करना

Android 9 में, उपयोगकर्ताओं की निजता की सुरक्षा के लिए, Build.SERIAL हमेशा "UNKNOWN" पर सेट होता है.

अगर आपके ऐप्लिकेशन को किसी डिवाइस के हार्डवेयर का सीरियल नंबर ऐक्सेस करना है, तो इसके बजाय, अनुरोध करें READ_PHONE_STATE अनुमति, फिर कॉल करें getSerial().

डीएनएस की निजता

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

फ़्रेमवर्क की सुरक्षा से जुड़े बदलाव

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

नेटवर्क TLS डिफ़ॉल्ट रूप से चालू है

अगर आपका ऐप्लिकेशन Android 9 या इसके बाद वाले वर्शन को टारगेट करता है, तो isCleartextTrafficPermitted() तरीका, डिफ़ॉल्ट रूप से false दिखाता है. अगर आपके ऐप्लिकेशन को इसके लिए cleartext को सक्षम करने की आवश्यकता है आपको साफ़ तौर पर cleartextTrafficPermitted को true पर सेट करना होगा आपके ऐप्लिकेशन के नेटवर्क सुरक्षा' में मौजूद डोमेन के लिए कॉन्फ़िगरेशन.

प्रोसेस से अलग की गई वेब पर आधारित डेटा डायरेक्ट्री

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

ज़्यादातर मामलों में, आपके ऐप्लिकेशन को सिर्फ़ एक प्रोसेस में, android.webkit पैकेज की क्लास का इस्तेमाल करना चाहिए. जैसे, WebView और CookieManager. उदाहरण के लिए, आपको सभी Activity ऐसे ऑब्जेक्ट जो WebView का इस्तेमाल करते हैं एक ही प्रक्रिया में करते हैं. "सिर्फ़ एक प्रोसेस" को सख्ती से लागू किया जा सकता है नियम कॉल करके disableWebView() इंच आपके ऐप्लिकेशन की अन्य प्रोसेस पर ध्यान देती हैं. इस कॉल से, WebView को गलती से उन अन्य प्रोसेस में शुरू होने से रोका जाता है. भले ही, इसे किसी डिपेंडेंट लाइब्रेरी से कॉल किया जा रहा हो.

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

हर ऐप्लिकेशन के हिसाब से SELinux डोमेन

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

अन्य ऐप्लिकेशन के साथ फ़ाइलें शेयर करने के लिए, कॉन्टेंट उपलब्ध कराने वाली कंपनी की सेवा का इस्तेमाल करें.

कनेक्टिविटी में हुए बदलाव

कनेक्टिविटी डेटा की गिनती और मल्टीपाथ

Android 9 या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन में, यह सिस्टम गिनती करता है नेटवर्क पर नेटवर्क ट्रैफ़िक जो मौजूदा डिफ़ॉल्ट सेटिंग नहीं हैं, जैसे कि डिवाइस के चालू रहने पर सेल से मिलने वाला ट्रैफ़िक वाई-फ़ाई—और यह सेवा NetworkStatsManager क्लास का इस्तेमाल करें.

खास तौर पर, getMultipathPreference() अब ऊपर बताए गए नेटवर्क ट्रैफ़िक के आधार पर वैल्यू दिखाता है. Android 9 से, यह तरीका सेल डेटा के लिए true दिखाता है. हालांकि, जब एक दिन में तय सीमा से ज़्यादा ट्रैफ़िक इकट्ठा होता है, तो यह false दिखाना शुरू कर देता है. Android 9 पर काम करने वाले ऐप्लिकेशन को इस तरीके को कॉल करना होगा और इस संकेत का पालन करना होगा.

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

Apache HTTP क्लाइंट का इस्तेमाल बंद होना

Android 6.0 के साथ, हमने Apache एचटीटीपी क्लाइंट के लिए सहायता हटा दी है. Android 9 और इसके बाद के वर्शन में, वह लाइब्रेरी बूटक्लासपाथ का इस्तेमाल करता है. यह डिफ़ॉल्ट रूप से ऐप्लिकेशन के लिए उपलब्ध नहीं होता.

Apache HTTP क्लाइंट का इस्तेमाल जारी रखने के लिए, Android 9 और उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन, अपने AndroidManifest.xml में ये चीज़ें जोड़ सकते हैं:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

रनटाइम Apache लाइब्रेरी का इस्तेमाल करने के विकल्प के तौर पर, ऐप्लिकेशन अपने APK में org.apache.http लाइब्रेरी का अपना वर्शन बंडल कर सकते हैं. अगर आपने ऐसा किया, तो आपको लाइब्रेरी को इस तरह रीपैकेज करना होगा कि (जैसे, Jar Jar), ताकि क्लास के साथ काम करने से जुड़ी समस्याओं से बचा जा सके रनटाइम में दी गई क्लास के साथ कनेक्ट करता है.

यूज़र इंटरफ़ेस (यूआई) में बदलाव

फ़ोकस देखना

ऐसे व्यू पर फ़ोकस नहीं किया जा सकता जिनकी इमेज की चौड़ाई या ऊंचाई शून्य हो.

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

सीएसएस आरजीबीए हेक्स वैल्यू को मैनेज करना

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

सीएसएस कलर मॉड्यूल लेवल 4 Chrome पर रिलीज़ 52 से काम कर रहा है, लेकिन वेबव्यू फ़िलहाल इस सुविधा को बंद करता है क्योंकि मौजूदा Android ऐप्लिकेशन में 32 बिट हेक्स रंग शामिल थे होने से रोका जा सकता है. इससे रेंडरिंग में गड़बड़ियां हो सकती हैं.

उदाहरण के लिए, फ़िलहाल, रंग #80ff8080 को इसमें रेंडर किया गया है ओपेक के रूप में वेबव्यू एपीआई लेवल 27 या उससे पहले के लेवल को टारगेट करने वाले ऐप्लिकेशन के लिए, हल्का लाल (#ff8080) रंग. लीडिंग कॉम्पोनेंट (जिसे Android ऐल्फ़ा कॉम्पोनेंट समझेगा) अभी अनदेखा किया गया है. अगर कोई ऐप्लिकेशन, एपीआई लेवल 28 या उसके बाद के लेवल को टारगेट करता है, तो #80ff8080 इसे 50% पारदर्शी हल्के हरे (#80ff80) के तौर पर दिखाया गया है.

फ़ाइल के लिए MIME टाइप की जांच करना: यूआरआई

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

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

अगर किसी फ़ाइल का कोई मान्य फ़ाइल एक्सटेंशन मौजूद है, जैसे कि .html, .txt, .js या .css MIME टाइप को एक्सटेंशन तय करेगा. अगर किसी फ़ाइल का कोई एक्सटेंशन नहीं है या वह एक्सटेंशन पहचाना नहीं जा सका है, तो एमआईएम टाइप, प्लैन टेक्स्ट होगा.

उदाहरण के लिए, file:///sdcard/test.html जैसे यूआरआई को इस तरह रेंडर किया जाएगा एचटीएमएल है, लेकिन file:///sdcard/test जैसा यूआरआई, सामान्य टेक्स्ट के तौर पर रेंडर होगा, भले ही फ़ाइल में एचटीएमएल डेटा हो.

दस्तावेज़ स्क्रोल करने वाला एलिमेंट

Android 9, उस मामले को सही तरीके से मैनेज करता है जहां दस्तावेज़ का रूट एलिमेंट, स्क्रोलिंग एलिमेंट होता है. इससे पहले के वर्शन में, बॉडी एलिमेंट पर स्क्रोल करने की पोज़िशन सेट की गई थी और रूट एलिमेंट में स्क्रोल करने के लिए शून्य वैल्यू थीं. Android 9, मानकों का पालन करने वाला व्यवहार, जिसमें स्क्रोलिंग एलिमेंट रूट है एलिमेंट.

इसके अलावा, टारगेट किए जा रहे SDK टूल के हिसाब से, document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop या document.documentElement.scrollLeft को सीधे ऐक्सेस करने पर, अलग-अलग तरीके से काम करेगा. अगर उपलब्ध हो, तो व्यूपोर्ट स्क्रोल वैल्यू ऐक्सेस करने के लिए document.scrollingElement का इस्तेमाल करें.

निलंबित किए गए ऐप्लिकेशन से मिलने वाली सूचनाएं

Android 9 से पहले के वर्शन में, निलंबित ऐप्लिकेशन की सूचनाएं रद्द की जाती थीं. Android 9 और इसके बाद के वर्शन में, निलंबित ऐप्लिकेशन की सूचनाएं तब तक के लिए छिपी रहती हैं ऐप को फिर से शुरू कर दिया जाता है.