Android 9 (एपीआई लेवल 28) में, Android सिस्टम में कई बदलाव किए गए हैं.
नीचे दिए गए बदलाव, सिर्फ़ उन ऐप्लिकेशन पर लागू होते हैं जो एपीआई लेवल 28 या इसके बाद के वर्शन को टारगेट कर रहे हैं. जिन ऐप्लिकेशन ने targetSdkVersion को एपीआई लेवल 28 या इससे ज़्यादा पर सेट किया है उन्हें अपने ऐप्लिकेशन में बदलाव करना होगा, ताकि ये व्यवहार ठीक से काम कर सकें. हालांकि, यह बदलाव सिर्फ़ उन ऐप्लिकेशन के लिए ज़रूरी है जिन पर ये व्यवहार लागू होते हैं.
Android 9 पर चलने वाले सभी ऐप्लिकेशन पर असर डालने वाले बदलावों के बारे में जानने के लिए, काम करने के तरीके में बदलाव: सभी ऐप्लिकेशन लेख पढ़ें. इन बदलावों से कोई फ़र्क़ नहीं पड़ता कि ऐप्लिकेशन किस एपीआई लेवल को टारगेट करते हैं.
फ़ोरग्राउंड सेवाएं
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 या उसके बाद के वर्शन को टारगेट करता हो.
नेटवर्क टीएलएस डिफ़ॉल्ट रूप से चालू होता है
अगर आपका ऐप्लिकेशन, Android 9 या इसके बाद के वर्शन को टारगेट करता है, तो isCleartextTrafficPermitted() तरीका डिफ़ॉल्ट रूप से false दिखाता है. अगर आपके ऐप्लिकेशन को कुछ डोमेन के लिए cleartext ट्रैफ़िक की अनुमति देनी है, तो आपको अपने ऐप्लिकेशन के नेटवर्क सुरक्षा कॉन्फ़िगरेशन में, उन डोमेन के लिए cleartextTrafficPermitted को true पर सेट करना होगा.
प्रोसेस के हिसाब से अलग की गई, वेब पर आधारित डेटा डायरेक्ट्री
Android 9 में ऐप्लिकेशन की स्थिरता और डेटा की अखंडता को बेहतर बनाने के लिए, ऐप्लिकेशन कई प्रोसेस के बीच एक ही WebView डेटा डायरेक्ट्री शेयर नहीं कर सकते. आम तौर पर, इस तरह की डेटा डायरेक्ट्री में कुकी, एचटीटीपी कैश मेमोरी, और वेब ब्राउज़िंग से जुड़े अन्य स्थायी और अस्थायी स्टोरेज को सेव किया जाता है.
ज़्यादातर मामलों में, आपके ऐप्लिकेशन को सिर्फ़ एक प्रोसेस में android.webkit पैकेज से क्लास का इस्तेमाल करना चाहिए. जैसे, WebView और CookieManager. उदाहरण के लिए, आपको WebView का इस्तेमाल करने वाले सभी Activity ऑब्जेक्ट को एक ही प्रोसेस में ले जाना चाहिए. अपने ऐप्लिकेशन की अन्य प्रोसेस में 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 client को बंद किया जा रहा है
Android 6.0 में, हमने Apache HTTP क्लाइंट के लिए सहायता बंद कर दी है. 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 जैसे टूल का इस्तेमाल करें. इससे, रनटाइम में उपलब्ध कराई गई क्लास के साथ क्लास के काम न करने से जुड़ी समस्याएं नहीं होंगी.
यूज़र इंटरफ़ेस (यूआई) में बदलाव
फ़ोकस वाला व्यू
जिन व्यू की चौड़ाई या ऊंचाई 0 होती है उन पर अब फ़ोकस नहीं किया जा सकता.
इसके अलावा, अब टच मोड में गतिविधियों के लिए शुरुआती फ़ोकस अपने-आप असाइन नहीं होता. इसके बजाय, अगर आपको ऐसा करना है, तो आपको साफ़ तौर पर शुरुआती फ़ोकस का अनुरोध करना होगा.
सीएसएस आरजीबीए हेक्स वैल्यू को मैनेज करना
Android 9 या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को, 4 और 8 हेक्स डिजिट वाले सीएसएस रंगों को मैनेज करने के लिए, ड्राफ़्ट सीएसएस कलर मॉड्यूल लेवल 4 के व्यवहार को चालू करना होगा.
Chrome के 52वें वर्शन से ही CSS Color Module Level 4 का इस्तेमाल किया जा रहा है. हालांकि, WebView में इस सुविधा को फ़िलहाल बंद कर दिया गया है. ऐसा इसलिए, क्योंकि मौजूदा Android ऐप्लिकेशन में Android के क्रम (ARGB) में 32 बिट हेक्स कलर पाए गए हैं. इससे रेंडरिंग से जुड़ी गड़बड़ियां हो सकती हैं.
उदाहरण के लिए, एपीआई लेवल 27 या इससे पहले के लेवल को टारगेट करने वाले ऐप्लिकेशन के लिए, #80ff8080 रंग को फ़िलहाल WebView में हल्के लाल (#ff8080) रंग के तौर पर रेंडर किया जाता है. फ़िलहाल, पहले कॉम्पोनेंट को अनदेखा किया जाता है. Android इसे ऐल्फ़ा कॉम्पोनेंट के तौर पर समझता है. अगर कोई ऐप्लिकेशन, एपीआई लेवल 28 या इससे ऊपर के लेवल को टारगेट करता है, तो #80ff8080 को 50% पारदर्शी हल्के हरे रंग (#80ff80) के तौर पर माना जाता है.
फ़ाइल के लिए MIME टाइप स्निफ़िंग: यूआरआई
Android 9 से पहले के Android वर्शन, फ़ाइल के कॉन्टेंट से MIME टाइप का पता लगा सकते थे. Android 9 (एपीआई लेवल 28) से, ऐप्लिकेशन को WebView में file: यूआरआई लोड करते समय, सही फ़ाइल एक्सटेंशन का इस्तेमाल करना होगा.
फ़ाइल के कॉन्टेंट का इस्तेमाल करके MIME टाइप का अनुमान लगाने से सुरक्षा से जुड़ी गड़बड़ियां हो सकती हैं. आम तौर पर, मॉडर्न ब्राउज़र इसकी अनुमति नहीं देते.
अगर किसी फ़ाइल का एक्सटेंशन, .html,
.txt, .js या .css जैसा है, तो MIME टाइप का पता एक्सटेंशन से चलेगा.
अगर किसी फ़ाइल का कोई एक्सटेंशन नहीं है या वह पहचाना नहीं जा सकता, तो MIME टाइप सादा टेक्स्ट होगा.
उदाहरण के लिए, file:///sdcard/test.html जैसे यूआरआई को एचटीएमएल के तौर पर रेंडर किया जाएगा. हालांकि, file:///sdcard/test जैसे यूआरआई को सादे टेक्स्ट के तौर पर रेंडर किया जाएगा. भले ही, फ़ाइल में एचटीएमएल डेटा मौजूद हो.
दस्तावेज़ को स्क्रोल करने वाला एलिमेंट
Android 9 में, ऐसे दस्तावेज़ को सही तरीके से हैंडल किया जाता है जिसका रूट एलिमेंट, स्क्रोल करने वाला एलिमेंट होता है. पिछले वर्शन में, स्क्रोल करने की पोज़िशन को बॉडी एलिमेंट पर सेट किया गया था. साथ ही, रूट एलिमेंट में स्क्रोल की वैल्यू शून्य थी. Android 9 में, स्टैंडर्ड के मुताबिक काम करने की सुविधा चालू होती है. इसमें स्क्रोल करने वाला एलिमेंट, रूट एलिमेंट होता है.
इसके अलावा, सीधे तौर पर document.body.scrollTop, document.body.scrollLeft,
document.documentElement.scrollTop या document.documentElement.scrollLeft को ऐक्सेस करने का तरीका, टारगेट किए जा रहे एसडीके के हिसाब से अलग-अलग होगा. व्यू पोर्ट स्क्रोल की वैल्यू ऐक्सेस करने के लिए, document.scrollingElement का इस्तेमाल करें.
निलंबित किए गए ऐप्लिकेशन से मिलने वाली सूचनाएँ
Android 9 से पहले, निलंबित किए गए ऐप्लिकेशन से मिलने वाली सूचनाएं रद्द कर दी जाती थीं. Android 9 से, निलंबित किए गए ऐप्लिकेशन की सूचनाएं तब तक छिपी रहती हैं, जब तक ऐप्लिकेशन को फिर से शुरू नहीं किया जाता.