Android 8.0 के व्यवहार में बदलाव

नई सुविधाओं और क्षमताओं के साथ-साथ, Android 8.0 (एपीआई लेवल 26) इसमें सिस्टम और एपीआई के काम करने के तरीके में कई तरह के बदलाव शामिल हैं. यह दस्तावेज़ यह कुछ अहम बदलावों को हाइलाइट करता है, जिन्हें आपको समझना और जिन पर ध्यान देना चाहिए आपके ऐप्लिकेशन में.

इनमें से ज़्यादातर बदलावों का असर, सभी ऐप्लिकेशन पर पड़ता है. इस बात से कोई फ़र्क़ नहीं पड़ता कि ऐप्लिकेशन का कौनसा वर्शन टारगेट किए गए Android डिवाइस. हालांकि, कई बदलावों से सिर्फ़ ऐप्लिकेशन टारगेटिंग पर असर पड़ता है Android 8.0. साफ़ तौर पर जानकारी देने के लिए, यह पेज को दो सेक्शन में बांटा गया है: सभी ऐप्लिकेशन में होने वाले बदलाव और ऐप्लिकेशन टारगेटिंग में होने वाले बदलाव Android 8.0.

सभी ऐप्लिकेशन के लिए बदलाव

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

ऐप्लिकेशन के बैकग्राउंड में चलने पर नियंत्रण

यह Android 8.0 (एपीआई लेवल 26) के वर्शन में किए गए बदलावों में से एक है बैटरी लाइफ़ बढ़ाने में मदद करता है, जब आपका ऐप्लिकेशन कैश मेमोरी में सेव किया गया स्थिति, कोई चालू नहीं है कॉम्पोनेंट, सिस्टम, ऐप्लिकेशन में मौजूद सभी वेकलॉक को हटा देता है.

इसके अलावा, डिवाइस की परफ़ॉर्मेंस को बेहतर बनाने के लिए, सिस्टम कुछ चीज़ों को सीमित करता है फ़ोरग्राउंड में नहीं चलने वाले ऐप्लिकेशन का व्यवहार. खास तौर से:

  • बैकग्राउंड में चल रहे ऐप्लिकेशन के लिए, अब एक सीमा तय की गई है कि वे कितने काम के हैं तो वे बैकग्राउंड में चलने वाली सेवाओं को ऐक्सेस कर सकते हैं.
  • ऐप्लिकेशन, ज़्यादातर इंप्लिसिट ब्रॉडकास्ट के लिए रजिस्टर करने के लिए, अपने मेनिफ़ेस्ट का इस्तेमाल नहीं कर सकते (इसका मतलब है कि ऐसे ब्रॉडकास्ट जिन्हें खास तौर पर ऐप्लिकेशन के लिए टारगेट नहीं किया गया है).

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

Android 8.0 (एपीआई लेवल 26) में खास तरीकों में किए गए ये बदलाव भी शामिल हैं:

  • startService() तरीके से अब अगर ऐप्लिकेशन है, तो IllegalStateException जब Android 8.0 को टारगेट करने के लिए, उस तरीके का इस्तेमाल करने की कोशिश की जाती है में बैकग्राउंड सेवाएं बनाने की अनुमति न हो.
  • Context.startForegroundService() वाला नया तरीका फ़ोरग्राउंड सेवा का इस्तेमाल करें. सिस्टम, ऐप्लिकेशन को अनुमति देता है Context.startForegroundService() को कॉल करने के लिए, भले ही ऐप्लिकेशन को बैकग्राउंड में चलाने की सुविधा मिलती है. हालांकि, ऐप्लिकेशन को उस सेवा के startForeground() तरीके को पांच के अंदर कॉल करना होगा कुछ सेकंड बाद शुरू हो जाएगा.

ज़्यादा जानकारी के लिए, यह देखें बैकग्राउंड में कोड चलाने की सीमाएं.

Android डिवाइस में, बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की सीमाएं

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

इन बदलावों का असर इन एपीआई पर पड़ता है:

  • कई तरह से जांची गई सही जगह की जानकारी देने वाली कंपनी (FLP)
  • जियोफ़ेंसिंग
  • GNSS मेज़रमेंट
  • लोकेशन मैनेजर
  • वाई-फ़ाई मैनेजर

यह पक्का करने के लिए कि आपका ऐप्लिकेशन उम्मीद के मुताबिक काम करे, इन चरणों को पूरा करें:

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

इन बदलावों के बारे में ज़्यादा जानकारी के लिए, देखें बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की सुविधा सीमाएं.

ऐप शॉर्टकट

Android 8.0 (एपीआई लेवल 26) में ऐप्लिकेशन शॉर्टकट के लिए किए गए ये बदलाव शामिल हैं:

  • com.android.launcher.action.INSTALL_SHORTCUT का ब्रॉडकास्ट नंबर का आपके ऐप्लिकेशन पर असर पड़ता है, क्योंकि अब यह ऐप्लिकेशन पूरी तरह से निजी है और ब्रॉडकास्ट. इसके बजाय, आपको शॉर्टकट का इस्तेमाल करके ऐप्लिकेशन शॉर्टकट बनाना चाहिए requestPinShortcut() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ShortcutManager क्लास से तरीका.
  • ACTION_CREATE_SHORTCUT इंटेंट, अब ऐसे ऐप्लिकेशन शॉर्टकट बना सकता है जिन्हें आप ShortcutManager क्लास. इस इंटेंट से, लेगसी लॉन्चर शॉर्टकट, जो इनसे इंटरैक्ट नहीं करते ShortcutManager. पहले, यह इंटेंट सिर्फ़ लेगसी लॉन्चर शॉर्टकट बनाएं.
  • इसका उपयोग करके शॉर्टकट बनाए गए requestPinShortcut() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है और शॉर्टकट को ऐसी गतिविधि में बनाया जाता है जो ACTION_CREATE_SHORTCUT इंटेंट अब पूरी तरह से ऐप शॉर्टकट हैं. इस वजह से, ऐप्लिकेशन अब इन्हें अपडेट कर सकते हैं ShortcutManager में दिए गए तरीकों का इस्तेमाल करके.
  • लेगसी शॉर्टकट, इसके पिछले वर्शन की सुविधाओं से जुड़े रहते हैं Android, लेकिन आपको अपने ऐप्लिकेशन में उन्हें मैन्युअल रूप से ऐप्लिकेशन शॉर्टकट में बदलना होगा.

ऐप शॉर्टकट में हुए बदलावों के बारे में ज़्यादा जानने के लिए, शॉर्टकट को पिन करना और विजेट की सुविधा से जुड़ी गाइड.

स्थान-भाषा और अंतरराष्ट्रीय स्तर का कॉन्टेंट बनाना

Android 7.0 (एपीआई लेवल 24) ने, एक डिफ़ॉल्ट श्रेणी स्थान निर्दिष्ट करता है, लेकिन कुछ API इसका उपयोग करना जारी रखते हैं सामान्य Locale.getDefault() विधि में आर्ग्युमेंट के बिना, जब उन्हें इसके बजाय डिफ़ॉल्ट DISPLAY श्रेणी स्थान का उपयोग करना चाहिए था. Android 8.0 (एपीआई लेवल 26) में, नीचे दिए गए तरीके अब Locale.getDefault(Category.DISPLAY) का इस्तेमाल करते हैं Locale.getDefault() के बजाय:

Locale.getDisplayScript(Locale) ने भी Locale.getDefault() पर वापस आ जाता है, जब Locale के लिए displayScript वैल्यू दी गई तर्क उपलब्ध नहीं है.

अतिरिक्त स्थान-भाषा और अंतरराष्ट्रीयकरण से जुड़े बदलाव इस तरह हैं अनुसरण करता है:

  • Currency.getDisplayName(null) को कॉल करने पर NullPointerException दिखता है, दस्तावेज़ में मौजूद व्यवहार से मेल खा रहा है.
  • टाइम ज़ोन का नाम पार्स करने की प्रोसेस बदल गई है. पहले, Android डिवाइसों ने बूट के समय सैंपल के तौर पर ली गई सिस्टम की घड़ी की वैल्यू का इस्तेमाल किया तारीख पार्स करने के लिए इस्तेमाल होने वाले टाइम ज़ोन के नामों को कैश मेमोरी में सेव करने का समय बार. इस वजह से, अगर सिस्टम चालू होने के समय या अन्य, कभी-कभी होने वाले मामलों में क्लॉक गलत था.

    अब, सामान्य मामलों में पार्स करने में मदद करने वाला लॉजिक, ICU और टाइम ज़ोन के नाम पार्स करते समय मौजूदा सिस्टम घड़ी का मान. यह बदलाव से ज़्यादा सही नतीजे मिलते हैं. ये नतीजे पहले वाले नतीजों से अलग हो सकते हैं Android के वर्शन, जब आपका ऐप्लिकेशन इस तरह की क्लास का इस्तेमाल करता है SimpleDateFormat.

  • Android 8.0 (एपीआई लेवल 26), ICU के वर्शन को 58 पर अपडेट कर देता है.

अलर्ट विंडो

अगर कोई ऐप्लिकेशन, SYSTEM_ALERT_WINDOW का इस्तेमाल करता है अनुमति देता है और प्रदर्शित करने का प्रयास करने के लिए निम्न में से एक विंडो प्रकार का उपयोग करता है अलर्ट विंडो, दूसरे ऐप्लिकेशन और सिस्टम विंडो के ऊपर:

...तो ये विंडो हमेशा उन विंडो के नीचे दिखाई देती हैं जो TYPE_APPLICATION_OVERLAY विंडो टाइप करें. अगर कोई ऐप्लिकेशन Android 8.0 (एपीआई लेवल 26) को टारगेट करता है, तो ऐप्लिकेशन TYPE_APPLICATION_OVERLAY अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अलर्ट विंडो प्रदर्शित करने के लिए विंडो का प्रकार.

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

इनपुट और नेविगेशन

ChromeOS पर Android ऐप्लिकेशन आने और डिवाइसों के नाप या आकार के हिसाब से, देख रहे हैं कि इन कीबोर्ड नेविगेशन के उपयोग में तेज़ी से वृद्धि हुई है. Android ऐप्लिकेशन. Android 8.0 (एपीआई लेवल 26) में, हमने समस्याओं को हल करने के लिए कीबोर्ड का इस्तेमाल नेविगेशन इनपुट डिवाइस के तौर पर करना चाहते हैं. इससे ज़्यादा भरोसेमंद, ऐरो और टैब पर आधारित नेविगेशन के लिए अनुमान लगाने लायक मॉडल.

खास तौर पर, हमने एलिमेंट फ़ोकस में ये बदलाव किए हैं व्यवहार:

  • अगर आपने View ऑब्जेक्ट (उसकी फ़ोरग्राउंड या बैकग्राउंड ड्रॉ करने लायक), फ़्रेमवर्क अब View. फ़ोकस हाइलाइट, रिपल ड्रॉ करने लायक है, गतिविधि की थीम के हिसाब से.

    अगर आपको किसी View ऑब्जेक्ट को इस डिफ़ॉल्ट ऑब्जेक्ट का इस्तेमाल नहीं करने देना है, तो हाइलाइट होने पर हाइलाइट करें, android:defaultFocusHighlightEnabled एट्रिब्यूट false लेआउट एक्सएमएल फ़ाइल में View या false में पास करें setDefaultFocusHighlightEnabled() होना चाहिए.

  • कीबोर्ड इनपुट, यूज़र इंटरफ़ेस (यूआई) एलिमेंट के फ़ोकस पर कैसे असर डालता है, इसकी जांच करने के लिए ड्रॉइंग > लेआउट की सीमाएं दिखाएं डेवलपर के लिए सेटिंग और टूल. Android में 8.0, यह विकल्प "X" दिखाता है आइकन पर अभी मौजूद है फ़ोकस.

साथ ही, Android 8.0 में टूलबार के सभी एलिमेंट अपने-आप कीबोर्ड नेविगेशन क्लस्टर, इससे उपयोगकर्ताओं के लिए, हर टूलबार में मौजूद और उससे बाहर आना-जाना आसान हो जाता है. पूरा.

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

वेब फ़ॉर्म के लिए, जानकारी अपने-आप भरने की सुविधा

अब जबकि Android ऑटोमैटिक भरने वाला फ़्रेमवर्क में अपने-आप जानकारी भरने की सुविधा पहले से मौजूद होती है. WebView ऑब्जेक्ट से जुड़े ये तरीके बदल गए हैं Android 8.0 (एपीआई लेवल 26) वाले डिवाइसों पर इंस्टॉल किए गए ऐप्लिकेशन के लिए:

WebSettings
  • कॉन्टेंट बनाने getSaveFormData() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है तरीका अब false दिखाता है. पहले, यह विधि दिखाई जाती थी अगर आपके पास इन फ़ॉर्मैट की फ़ाइल नहीं है, तो true बटन का इस्तेमाल करें.
  • कॉल से जुड़ी सुविधा setSaveFormData() ने ’नहीं’ में जवाब दिया है का कोई असर होता है.
WebViewDatabase
  • कॉल से जुड़ी सुविधा clearFormData() ने ’नहीं’ में जवाब दिया है का कोई असर होता है.
  • कॉन्टेंट बनाने hasFormData() तरीका अब false लौटाता है. पहले, यह विधि दिखाई जाती थी true जब फ़ॉर्म में डेटा शामिल हो.

सुलभता

Android 8.0 (एपीआई लेवल 26) में, सुलभता से जुड़े ये बदलाव शामिल हैं:

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

    अगर आपके ऐप्लिकेशन के View ऑब्जेक्ट, कस्टम टच का इस्तेमाल करते हैं हैंडलिंग के दौरान, आपको यह पुष्टि करनी होगी कि वे अब भी TalkBack के साथ काम करते हैं. आप आपको बस वह क्लिक हैंडलर रजिस्टर करना होगा जो आपका View ऑब्जेक्ट इस्तेमाल करते हैं. अगर TalkBack अब भी इन जेस्चर (हाव-भाव) की पहचान नहीं कर पाता है View ऑब्जेक्ट, बदलें performAccessibilityAction().

  • सुलभता सेवाओं को अब आपके ऐप्लिकेशन में ClickableSpan इंस्टेंस TextView ऑब्जेक्ट.

अपने ऐप्लिकेशन को ज़्यादा से ज़्यादा लोगों तक पहुंचाने के तरीके के बारे में ज़्यादा जानने के लिए, यहां जाएं सुलभता.

नेटवर्किंग और एचटीटीपी या एचटीटीपीएस कनेक्टिविटी

Android 8.0 (एपीआई लेवल 26) में, उपयोगकर्ता के व्यवहार में ये बदलाव होते हैं नेटवर्किंग और HTTP(S) कनेक्टिविटी:

  • OPTIONS अनुरोधों में कोई शरीर नहीं है Content-Length: 0 हेडर. पहले उनके पास Content-Length हेडर नहीं था.
  • HttpURLConnection, जोड़े गए खाली पाथ वाले यूआरएल को नॉर्मलाइज़ करता है स्लैश के साथ, होस्ट या संस्था के नाम के बाद स्लैश. उदाहरण के लिए, यह यह http://example.com को इसमें बदल देता है http://example.com/.
  • ProxySelector.setDefault() के ज़रिए सेट किया गया, कस्टम प्रॉक्सी सिलेक्टर सिर्फ़ अनुरोध किए गए यूआरएल के पते (स्कीम, होस्ट, और पोर्ट) को टारगेट करता हो. इस वजह से, प्रॉक्सी को सिर्फ़ उन वैल्यू के आधार पर चुना जा सकता है. यूआरएल को कस्टम प्रॉक्सी सिलेक्टर को पास किया जाता है, लेकिन इसमें अनुरोध किए गए यूआरएल का पाथ, क्वेरी पैरामीटर या फ़्रैगमेंट.
  • यूआरआई में खाली लेबल नहीं हो सकते.

    इससे पहले, यह प्लैटफ़ॉर्म, खाली लेबल स्वीकार करने के लिए एक समाधान के तौर पर काम करता था होस्ट के नाम, जो यूआरआई का गैर-कानूनी इस्तेमाल है. यह समाधान इसके लिए था पुराने libcore रिलीज़ के साथ काम करता है. एपीआई का इस्तेमाल करने वाले डेवलपर एक ADB मैसेज गलत तरीके से दिखेगा: " यूआरआई example..com में खाली लेबल हैं होस्टनेम. यह फ़ॉर्मैट गलत है और आने वाले समय में इसे स्वीकार नहीं किया जाएगा रिलीज़." Android 8.0 इस समाधान को हटा देता है; तो सिस्टम वापस भेजता है गलत यूआरआई के लिए वैल्यू खाली है.

  • Android 8.0 के ज़रिए HttpsURLConnection को लागू करना असुरक्षित TLS/एसएसएल प्रोटोकॉल वर्शन का फ़ॉलबैक लागू नहीं करता.
  • टनलिंग एचटीटीपी(एस) कनेक्शन के इस्तेमाल में इस तरह बदलाव किया गया है:
    • कनेक्शन पर एचटीटीपीएस कनेक्शन को टनल करते समय, सिस्टम भेजते समय, पोर्ट नंबर (:443) को होस्ट लाइन में सही तरीके से रख देता है यह जानकारी किसी इंटरमीडिएट सर्वर को उपलब्ध कराती है. पहले, पोर्ट नंबर केवल कनेक्ट लाइन में ही आया है.
    • सिस्टम अब उपयोगकर्ता-एजेंट और प्रॉक्सी-अनुमति नहीं भेजता टनल किए गए अनुरोध के हेडर, जो प्रॉक्सी सर्वर पर भेजे जाते हैं.

      सिस्टम अब एपीआई सेट अप करते समय, प्रॉक्सी से टनल किया गया Http(s)URLConnect टनल. इसके बजाय, सिस्टम एक प्रॉक्सी-ऑथराइज़ेशन हेडर जनरेट करता है, और जब वह प्रॉक्सी भेजता है, तो उसे प्रॉक्सी एचटीटीपी 407, शुरुआती अनुरोध के रिस्पॉन्स में.

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

  • send(java.net.DatagramPacket) अगर पहले से एक्ज़ीक्यूट किया गया Connect(), तो तरीका Socketअपवाद देता है तरीका काम नहीं कर रहा.
    • DatagramSocket.connect() यह तब सेट करता है, जब सिस्टम में गड़बड़ी हुई. Android 8.0 से पहले के वर्शन में, इसके बाद आने वाली recv() कॉल ने एक Socketअपवाद दिया, भले ही send() कॉल पूरा हो गया होगा. समानता बनाए रखने के लिए, अब दोनों कॉल में Socketअपवाद का इस्तेमाल किया जाता है.
  • टीसीपी इको पर वापस जाने से पहले, InetAddress.isReachable(), आईसीएमपी का इस्तेमाल करता है प्रोटोकॉल का इस्तेमाल करना चाहिए.
    • कुछ होस्ट जो पोर्ट 7 (टीसीपी इको) को ब्लॉक करते हैं, जैसे कि google.com अब अगर वे ICMP Echo प्रोटोकॉल को स्वीकार करते हैं, तो उनसे संपर्क किया जा सकता है.
    • जिन होस्ट को वाकई ऐक्सेस नहीं किया जा सकता उनके लिए इस बदलाव का मतलब है कि का समय खत्म हो जाता है.

ब्लूटूथ

Android 8.0 (एपीआई लेवल 26) की समयसीमा में ये बदलाव किए जाते हैं वह डेटा जो ScanRecord.getBytes() तरीका वापस मिल जाता है:

  • getBytes() तरीका, यह अनुमान नहीं लगाता कि मिलने वाली बाइट की संख्या. इसलिए, ऐप्लिकेशन को किसी भी वापस की गई बाइट की कम से कम या ज़्यादा से ज़्यादा संख्या. इसके बजाय, उन्हें नतीजे के तौर पर बने अरे की लंबाई.
  • ब्लूटूथ 5 के साथ काम करने वाले डिवाइसों के लिए, डेटा की लंबाई ज़्यादा से ज़्यादा ~60 बाइट होना चाहिए.
  • अगर कोई रिमोट डिवाइस 60 बाइट से कम का स्कैन जवाब नहीं देता है, तो उन्हें वापस भी किया जा सकता है.

आसानी से कनेक्टिविटी

Android 8.0 (एपीआई लेवल 26) चुनने के लिए, वाई-फ़ाई सेटिंग को कई तरह से बेहतर बनाया गया है सबसे अच्छा उपयोगकर्ता अनुभव देने वाला वाई-फ़ाई नेटवर्क. खास बदलावों में ये शामिल हैं:

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

सुरक्षा

Android 8.0 में सुरक्षा से जुड़े ये अपडेट शामिल हैं बदलाव:

  • यह प्लैटफ़ॉर्म अब SSLv3 के साथ काम नहीं करता.
  • गलत तरीके से किसी सर्वर से एचटीटीपीएस कनेक्शन बनाते समय TLS प्रोटोकॉल-वर्शन नेगोशिएशन लागू करता है, HttpsURLConnection अब इस समाधान को आज़माता नहीं है TLS प्रोटोकॉल के पुराने वर्शन पर वापस जाने और फिर से कोशिश करने के बारे में है.
  • Android 8.0 (एपीआई लेवल 26) पर सिक्योर कंप्यूटिंग (एसईसीओएमपी) का इस्तेमाल किया जाता है सभी ऐप्लिकेशन के लिए फ़िल्टर करना. अनुमति वाले सिस्टम कॉल की सूची बायोनिक के ज़रिए खतरा होता है. हालांकि, कई अन्य सिस्टम कॉल उपलब्ध कराए जाते हैं हमारा सुझाव है कि इनका इस्तेमाल न करें.
  • आपके ऐप्लिकेशन के WebView ऑब्जेक्ट अब मल्टीप्रोसेस में चलते हैं मोड. वेब कॉन्टेंट को जिसमें बेहतर सुरक्षा के लिए ऐप्लिकेशन की प्रोसेस शामिल है.
  • अब यह नहीं माना जा सकता कि APKs उन डायरेक्ट्री में मौजूद हैं जिनके नाम के आखिर में -1 या -2 में. ऐप्लिकेशन को इन चीज़ों का इस्तेमाल करना चाहिए पाने के लिए sourceDir और सीधे डायरेक्टरी प्रारूप पर निर्भर नहीं होते हैं.
  • नेटिव विज्ञापनों का इस्तेमाल करने से जुड़ी बेहतर सुरक्षा सुविधाओं के बारे में जानकारी पाने के लिए लाइब्रेरी में, स्थानीय लाइब्रेरी देखें.

इसके अलावा, Android 8.0 (एपीआई लेवल 26) में, इंस्टॉल करने से जुड़े ये बदलाव किए गए हैं अज्ञात सोर्स से मिले अज्ञात ऐप्लिकेशन:

  • लेगसी सेटिंग की वैल्यू INSTALL_NON_MARKET_APPS अब है हमेशा 1. यह तय करने के लिए कि कोई अज्ञात स्रोत, पैकेज इंस्टॉलर है, तो आपको इसके बजाय canRequestPackageInstalls().
  • यदि आप INSTALL_NON_MARKET_APPS का इस्तेमाल किया जा रहा है setSecureSetting(), UnsupportedOperationException फेंक दिया जाता है. उपयोगकर्ताओं को अज्ञात ऐप्लिकेशन का इस्तेमाल करके इंस्टॉल करने से रोकने के लिए स्रोत है, तो आपको इसके बजाय DISALLOW_INSTALL_UNKNOWN_SOURCES उपयोगकर्ता प्रतिबंध.
  • Android 8.0 (एपीआई लेवल 26) पर चलने वाले डिवाइसों पर, मैनेज की जा रही प्रोफ़ाइलों में अपने-आप DISALLOW_INSTALL_UNKNOWN_SOURCES उपयोगकर्ता पाबंदी चालू की गई. उन मौजूदा डिवाइसों पर मैनेज की जा रही मौजूदा प्रोफ़ाइलों के लिए जिन्हें Android 8.0 में अपग्रेड किया था, DISALLOW_INSTALL_UNKNOWN_SOURCES उपयोगकर्ता पाबंदी अपने-आप चालू रहेगी. ऐसा तब तक होगा, जब तक प्रोफ़ाइल के मालिक ने साफ़ तौर पर सेटिंग ने इस प्रतिबंध को (अपग्रेड करने से पहले) अक्षम किया है INSTALL_NON_MARKET_APPS से 1.

अज्ञात ऐप्लिकेशन इंस्टॉल करने के बारे में अतिरिक्त जानकारी के लिए, अज्ञात ऐप्लिकेशन इंस्टॉल करने की अनुमतियां गाइड.

अपने ऐप्लिकेशन को ज़्यादा सुरक्षित बनाने के बारे में अन्य दिशा-निर्देश जानने के लिए, यहां जाएं Android डेवलपर के लिए सुरक्षा.

निजता

Android 8.0 (एपीआई लेवल 26) इन नीतियों को निजता से जुड़ा बनाता है प्लैटफ़ॉर्म में हुए बदलावों के बारे में बताया है.

  • यह प्लैटफ़ॉर्म अब आइडेंटिफ़ायर को अलग तरीके से हैंडल करता है.
    • उन ऐप्लिकेशन के लिए जिन्हें OTA से पहले, Android 8.0 (एपीआई लेवल 26) (एपीआई लेवल 26), ANDROID_ID में कोई बदलाव नहीं है जब तक कि इसे अनइंस्टॉल न किया गया हो और फिर OTA के बाद फिर से इंस्टॉल न किया जाए. सभी प्लैटफ़ॉर्म पर वैल्यू बनाए रखने के लिए OTA के बाद अनइंस्टॉल किए जाते हैं, तो डेवलपर कुंजी/वैल्यू का बैकअप.
    • Android 8.0 चला रहे डिवाइस पर इंस्टॉल किए गए ऐप्लिकेशन के लिए, ANDROID_ID का दायरा अब उपलब्ध है हर ऐप्लिकेशन साइनिंग पासकोड के हिसाब से. मान ANDROID_ID यूनीक है के तौर पर उपलब्ध है. इस वजह से, एक ही डिवाइस पर अलग-अलग साइनिंग पासकोड वाले ऐप्लिकेशन चल रहे हैं एक जैसा Android आईडी नहीं दिखाई देगा (किसी एक उपयोगकर्ता के लिए भी).
    • ANDROID_ID की वैल्यू पैकेज अनइंस्टॉल या फिर से इंस्टॉल करने पर तब तक नहीं बदलता, जब तक कि साइनिंग पासकोड एक जैसा हो. साथ ही, ऐप्लिकेशन को Android 8.0 वर्शन के तौर पर उपलब्ध है.
    • ANDROID_ID की वैल्यू सिस्टम अपडेट की वजह से पैकेज साइनिंग पासकोड में बदलाव होने पर भी, कोई बदलाव नहीं होता.
    • Google Play services और विज्ञापन आईडी की मदद से शिपिंग किए जाने वाले डिवाइसों पर, तो आपको विज्ञापन आईडी. ऐप्लिकेशन से कमाई करने का एक आसान और स्टैंडर्ड सिस्टम. विज्ञापन आईडी, विज्ञापन के लिए इस्तेमाल किया जाने वाला ऐसा यूनीक आईडी है जिसे उपयोगकर्ता अपने हिसाब से सेट कर सकते हैं. यह दिया गया है Google Play services से.

      डिवाइस बनाने वाली अन्य कंपनियों को जारी रखना चाहिए ANDROID_ID देने के लिए.

  • net.hostname सिस्टम प्रॉपर्टी की क्वेरी करने से शून्य जनरेट होता है नतीजा.

ऐसे अपवादों की जानकारी लॉग करना जिनकी पहचान नहीं हो पाई

अगर कोई ऐप्लिकेशन ऐसा Thread.UncaughtExceptionHandler इंस्टॉल करता है जो डिफ़ॉल्ट Thread.UncaughtExceptionHandler पर कॉल नहीं किया जाता, सिस्टम यह काम करता है किसी ऐसे अपवाद की स्थिति में ऐप्लिकेशन को बंद नहीं करता है जिसकी पहचान नहीं हुई हो. इतने से शुरू Android 8.0 (एपीआई लेवल 26) के वर्शन के साथ काम करता है, तो सिस्टम इसमें अपवाद स्टैकट्रेस को लॉग करता है स्थिति; इस प्लैटफ़ॉर्म के पुराने वर्शन में, तो सिस्टम अपवाद स्टैकट्रेस लॉग किया गया.

हम आपको कस्टम Thread.UncaughtExceptionHandler इस्तेमाल करने का सुझाव देते हैं लागू करने की प्रक्रिया हमेशा डिफ़ॉल्ट हैंडलर; इस सुझाव का पालन करने वाले ऐप्लिकेशन पर, इन बदलावों का असर नहीं पड़ेगा Android 8.0 में बदलाव हुआ है.

FindViewById() सिग्नेचर में बदलाव

findViewById() तरीके के सभी इंस्टेंस अब View के बजाय <T extends View> T दिखाते हैं. यह बदलाव इसके ये नतीजे होते हैं:

  • इसकी वजह से, हो सकता है कि मौजूदा कोड में रिटर्न टाइप साफ़ तौर पर न दिखे, उदाहरण के लिए अगर someMethod(View) और someMethod(TextView) पर किए गए कॉल का नतीजा findViewById().
  • Java 8 स्रोत भाषा का उपयोग करते समय, इसे View, जब रिटर्न टाइप तय न हो (उदाहरण के लिए, assertNotNull(findViewById(...)).someViewMethod()).
  • नॉन-फ़ाइनल findViewById() तरीकों के ओवरराइड (इसके लिए उदाहरण, Activity.findViewById()) को वापस करने की ज़रूरत होगी टाइप अपडेट किया गया.

संपर्क सेवा देने वाली कंपनी के इस्तेमाल के आंकड़ों में बदलाव

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

ऐप्लिकेशन अब भी इस डेटा को ऐक्सेस करने का अनुरोध कर सकते हैं READ_CONTACTS अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अनुमति. Android 8.0 (एपीआई लेवल 26) और उसके बाद के वर्शन में, इस्तेमाल के बारे में डेटा को लौटाने के लिए क्वेरी अनुमान के लिए इस्तेमाल किया जाता है. Android सिस्टम, आंतरिक रूप से सटीक मान, इसलिए इस परिवर्तन से अपने-आप पूरा होने वाला एपीआई.

व्यवहार में होने वाले इस बदलाव से, इन क्वेरी पैरामीटर पर असर पड़ता है:

कलेक्शन मैनेज करना

AbstractCollection.removeAll() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है और AbstractCollection.retainAll() अब हमेशा NullPointerException फेंकें; पहले, NullPointerException को तब फेंका नहीं गया जब संग्रह खाली. इस बदलाव से दस्तावेज़ के मुताबिक व्यवहार एक जैसा हो जाता है.

Android एंटरप्राइज़

Android 8.0 (एपीआई लेवल 26) की मदद से, एंटरप्राइज़ ऐप्लिकेशन के लिए, कुछ एपीआई और सुविधाओं के काम करने का तरीका. इनमें डिवाइस भी शामिल हैं पॉलिसी कंट्रोलर (डीपीसी). बदलावों में ये शामिल हैं:

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

Android 8.0 (एपीआई लेवल 26) में एंटरप्राइज़ में हुए सभी बदलावों को देखने और यह जानने के लिए कि ये बदलाव कैसे हो सकते हैं आपके ऐप्लिकेशन पर असर डाल सकते हैं. इसके बारे में ज़्यादा जानने के लिए, Enterprise में Android.

Android 8.0 को टारगेट करने वाले ऐप्लिकेशन

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

अलर्ट विंडो

SYSTEM_ALERT_WINDOW का इस्तेमाल करने वाले ऐप्लिकेशन अनुमति, अब सूचना विंडो दिखाने के लिए इस तरह की विंडो का इस्तेमाल नहीं कर सकती ऐप्लिकेशन और सिस्टम विंडो के ऊपर:

इसके बजाय, ऐप्लिकेशन को इस नाम की नई विंडो का इस्तेमाल करना होगा TYPE_APPLICATION_OVERLAY.

इसका इस्तेमाल करते समय: TYPE_APPLICATION_OVERLAY विंडो अपने ऐप्लिकेशन की सूचना विंडो दिखाने के लिए टाइप करें. साथ ही, इन विशेषताओं को ध्यान में रखें नए विंडो टाइप को ध्यान में रखकर:

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

कॉन्टेंट में बदलाव से जुड़ी सूचनाएं

Android 8.0 (एपीआई लेवल 26) के वर्शन में बदलाव करने का तरीका ContentResolver.notifyChange() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है और registerContentObserver(Uri, boolean, ContentObserver) Android 8.0 को टारगेट करने वाले ऐप्लिकेशन के लिए व्यवहार करें.

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

फ़ोकस देखें

क्लिक किए जा सकने वाले View ऑब्जेक्ट पर भी अब फ़ोकस किया जा सकता है डिफ़ॉल्ट. अगर आपको View ऑब्जेक्ट को क्लिक करना है, लेकिन ऐसा नहीं करना है फ़ोकस करने के लिए, लेआउट में false के लिए android:focusable एट्रिब्यूट एक्सएमएल फ़ाइल जिसमें View है या false में पास करें आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में setFocusable() तक लॉजिक.

ब्राउज़र की पहचान करने वाली सुविधा में उपयोगकर्ता-एजेंट मैच

Android 8.0 (एपीआई लेवल 26) और उसके बाद के वर्शन में, बिल्ड आइडेंटिफ़ायर स्ट्रिंग OPR. कुछ पैटर्न का मिलान हो सकता है ब्राउज़र की पहचान करने वाले लॉजिक से किसी गैर-ओपेरा ब्राउज़र की गलत पहचान करने में मदद मिलती है. ऐसे पैटर्न के मिलान का एक उदाहरण यह हो सकता है:

if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}

इस तरह की गलत पहचान से पैदा होने वाली समस्याओं से बचने के लिए, Opera ब्राउज़र के लिए पैटर्न-मैच के रूप में OPR.

सुरक्षा

ये बदलाव Android 8.0 (एपीआई लेवल 26) की सुरक्षा पर असर डालते हैं:

  • अगर आपके ऐप्लिकेशन के नेटवर्क का सुरक्षा कॉन्फ़िगरेशन ऑप्ट साफ़ टेक्स्ट वाले ट्रैफ़िक को नहीं दिखाता, तो आपका ऐप्लिकेशन WebView ऑब्जेक्ट, एचटीटीपी पर वेबसाइटों को ऐक्सेस नहीं कर सकते. हर WebView ऑब्जेक्ट को इसके बजाय एचटीटीपीएस का इस्तेमाल करना होगा.
  • अनजान सोर्स को अनुमति दें सिस्टम सेटिंग हटा दी गई है; इसमें अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति, अनजान ऐप्लिकेशन इंस्टॉल को मैनेज करती है अनजान सोर्स से. इस नई अनुमति के बारे में ज़्यादा जानने के लिए, यहां देखें अज्ञात ऐप्लिकेशन इंस्टॉल करने की अनुमतियां गाइड.

अपने ऐप्लिकेशन को ज़्यादा सुरक्षित बनाने के बारे में अन्य दिशा-निर्देश जानने के लिए, यहां जाएं Android डेवलपर के लिए सुरक्षा.

खाते का ऐक्सेस और उसे खोजे जाने की सेटिंग

Android 8.0 (एपीआई लेवल 26) में, अब ऐप्लिकेशन को ऐक्सेस नहीं मिलेगा उपयोगकर्ता खातों में तब तक नहीं जोड़ा जा सकता, जब तक पुष्टि करने वाले के पास खातों का मालिकाना हक न हो या उपयोगकर्ता को वह ऐक्सेस मिल जाता है. कॉन्टेंट बनाने GET_ACCOUNTS की अनुमति काफ़ी नहीं है. किसी खाते का ऐक्सेस पाने के लिए, ऐप्लिकेशन को यह करना होगा AccountManager.newChooseAccountIntent() का इस्तेमाल करें या खास तौर पर पुष्टि करने वाले के लिए बनाया गया है तरीका. खातों का ऐक्सेस मिलने के बाद, ऐप्लिकेशन कॉल कर सकता है AccountManager.getAccounts() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है उन्हें ऐक्सेस करने के लिए.

Android 8.0 अब सेवा में नहीं है LOGIN_ACCOUNTS_CHANGED_ACTION. ऐप्लिकेशन इसके बजाय, इसका इस्तेमाल करना चाहिए addOnAccountsUpdatedListener() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है रनटाइम के दौरान खातों के बारे में अपडेट पाने के लिए.

नए एपीआई और खाता ऐक्सेस करने के लिए जोड़े गए तरीकों के बारे में जानकारी पाने और देखने के लिए, खाता ऐक्सेस देखें और खोजे जाने की क्षमता के लिए, इस दस्तावेज़ के नए एपीआई सेक्शन में जाएं.

निजता

नीचे दिए गए बदलाव, Android 8.0 (एपीआई लेवल 26) की निजता पर असर डालते हैं.

  • सिस्टम की प्रॉपर्टी net.dns1, net.dns2, net.dns3 और net.dns4 अब नहीं हैं उपलब्ध है, जो इस प्लैटफ़ॉर्म पर निजता को बेहतर बनाने वाला बदलाव है.
  • डीएनएस सर्वर जैसी नेटवर्किंग जानकारी हासिल करने के लिए, ACCESS_NETWORK_STATE अनुमति के आधार पर NetworkRequest या NetworkCallback ऑब्जेक्ट. ये क्लास, Android 5.0 (एपीआई लेवल 21) और इसके बाद वाले वर्शन में उपलब्ध हैं.
  • Build.SERIAL अब काम नहीं करता. जिन ऐप्लिकेशन को हार्डवेयर का सीरियल नंबर जानने की ज़रूरत है उन्हें इसके बजाय नए Build.getSerial() तरीके का इस्तेमाल करें, जो यह ज़रूरी है READ_PHONE_STATE अनुमति.
  • LauncherApps API अब वर्क प्रोफ़ाइल की अनुमति नहीं देता ऐप्लिकेशन चुनें. जब कोई उपयोगकर्ता किसी काम में होता है प्रोफ़ाइल है, तो LauncherApps एपीआई इस तरह काम करता है जैसे कि कोई ऐप्लिकेशन नहीं करता है एक ही प्रोफ़ाइल ग्रुप में मौजूद अन्य प्रोफ़ाइलों में इंस्टॉल किए जाते हैं. पहले की तरह, जो प्रोफ़ाइल से मेल नहीं खातीं, उन्हें ऐक्सेस करने की कोशिश करने से Securityअपवादों की वजह बनती है.

अनुमतियां

अगर किसी ऐप्लिकेशन ने अनुमति का अनुरोध किया हो, तो Android 8.0 (एपीआई लेवल 26) से पहले के वर्शन में और अनुमति दे दी गई थी, तो सिस्टम ने भी गलत तरीके से ऐप्लिकेशन को इसकी अन्य सभी अनुमतियां दी गईं साथ ही, जो मेनिफ़ेस्ट में रजिस्टर किए गए हों.

Android 8.0 को टारगेट करने वाले ऐप्लिकेशन का यह व्यवहार ठीक किया गया. ऐप्लिकेशन को सिर्फ़ वही अनुमतियां दी जाती हैं जो उसके पास साफ़ तौर पर हैं अनुरोध किया गया है. हालांकि, जब उपयोगकर्ता ऐप्लिकेशन को अनुमति देता है, तो सभी उस ग्रुप की अनुमतियों के लिए बाद में किए जाने वाले अनुरोध अपने-आप अनुमति मिल गई.

उदाहरण के लिए, मान लें कि किसी ऐप्लिकेशन में READ_EXTERNAL_STORAGE और WRITE_EXTERNAL_STORAGE के मेनिफ़ेस्ट में शामिल है. ऐप्लिकेशन, READ_EXTERNAL_STORAGE और जब उपयोगकर्ता इसे अनुमति दे. अगर ऐप्लिकेशन, एपीआई लेवल 25 या उससे पहले के लेवल को टारगेट करता है, तो सिस्टम साथ ही, WRITE_EXTERNAL_STORAGE देता है बार की वजह से, क्योंकि यह उसी STORAGE अनुमति ग्रुप से जुड़ा है और मेनिफ़ेस्ट में रजिस्टर किया गया हो. अगर ऐप्लिकेशन Android 8.0 (एपीआई लेवल 26) को टारगेट करता है, तो सिस्टम उस समय सिर्फ़ READ_EXTERNAL_STORAGE; हालांकि, अगर ऐप्लिकेशन बाद में WRITE_EXTERNAL_STORAGE का अनुरोध करता है, तो सिस्टम तुरंत उपयोगकर्ता को प्रॉम्प्ट किए बिना वह खास अधिकार देता है.

मीडिया

  • फ़्रेमवर्क ये काम कर सकता है: ऑटोमैटिक ऑडियो डकिंग मदद मिलती है. इस मामले में, जब कोई दूसरा ऐप्लिकेशन, AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, ऐप्लिकेशन जो फ़ोकस अपनी आवाज़ कम कर देता है, लेकिन आम तौर पर onAudioFocusChange() कॉलबैक करता है और नहीं करता ऑडियो फ़ोकस बंद हो जाएगा. नए एपीआई, ऐसे ऐप्लिकेशन जिन्हें डकिंग के बजाय रोकना होता है.
  • जब उपयोगकर्ता फ़ोन कॉल करता है, तो चालू मीडिया स्ट्रीम तब तक म्यूट रहती हैं, जब तक कॉल.
  • ऑडियो से जुड़े सभी एपीआई को AudioAttributes का इस्तेमाल करना चाहिए इस्तेमाल करें. सिर्फ़ आवाज़ कंट्रोल करने के लिए, अलग-अलग तरह के ऑडियो स्ट्रीम का इस्तेमाल जारी रखें. स्ट्रीम टाइप के अन्य इस्तेमाल अब भी काम करते हैं उदाहरण के लिए, 'अब काम नहीं करता' के लिए streamType आर्ग्युमेंट AudioTrack कंस्ट्रक्टर), लेकिन सिस्टम इसे गड़बड़ी के तौर पर लॉग करता है.
  • AudioTrack का इस्तेमाल करते समय, अगर ऐप्लिकेशन बड़े ऑडियो बफ़र का अनुरोध करता है, डीप बफ़र आउटपुट उपलब्ध होने पर, फ़्रेमवर्क उसके इस्तेमाल की कोशिश करेगा.
  • Android 8.0 (एपीआई लेवल 26) में, मीडिया बटन इवेंट को अलग तरीके से हैंडल किया जाता है:
    1. मीडिया बटन का इस्तेमाल करना यूज़र इंटरफ़ेस (यूआई) में की गई गतिविधि में बदलाव नहीं किया गया है: फ़ोरग्राउंड गतिविधियों को अब भी मैनेज करने में प्राथमिकता दी जाती है मीडिया बटन इवेंट.
    2. अगर फ़ोरग्राउंड गतिविधि, मीडिया बटन इवेंट को हैंडल नहीं करती है, तो सिस्टम इवेंट को रूट करता है हाल ही में स्थानीय तौर पर चलाए गए ऑडियो वाले ऐप्लिकेशन से. मौजूदा स्थिति, फ़्लैग, और प्लेबैक किस ऐप्लिकेशन को मीडिया मिलेगा, यह तय करते समय मीडिया सेशन की स्थिति को शामिल नहीं किया जाता बटन इवेंट.
    3. अगर ऐप्लिकेशन का मीडिया सेशन रिलीज़ कर दिया गया है, सिस्टम ऐप्लिकेशन के अगर इसमें कोई हो, तो MediaButtonReceiver.
    4. दूसरे हर मामले में, सिस्टम मीडिया बटन इवेंट को खारिज कर देता है.

स्थानीय लाइब्रेरी

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

अधिक जानकारी के लिए, देखें लिखने और एक्ज़ीक्यूट किए जा सकने वाले सेगमेंट.

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

कलेक्शन मैनेज करना

Android 8.0 (एपीआई लेवल 26) में, Collections.sort() इस तारीख को लागू किया गया List.sort() के ऊपर. इसका उलटा Android 7.x (एपीआई लेवल 24 और 25) में सही था: List.sort() का डिफ़ॉल्ट रूप से लागू होना Collections.sort() नाम का इस्तेमाल करें.

इस बदलाव से Collections.sort() ऑप्टिमाइज़ किए गए List.sort() का फ़ायदा लेने के लिए हालांकि, इसमें ये पाबंदियां होती हैं:

  • List.sort() को लागू करने का तरीका Collections.sort() को कॉल नहीं करना चाहिए, क्योंकि ऐसा करने से स्टैक ओवरफ़्लो हो जाएगा बार-बार होने की वजह से. इसके बजाय, अगर आप डिफ़ॉल्ट व्यवहार चाहते हैं अपने List लागू करते समय, आपको इन बदलावों को बदलने से बचना चाहिए sort().

    अगर कोई पैरंट क्लास sort() को गलत तरीके से लागू करती है, तो आम तौर पर, List.sort() को बदला जा सकता है के साथ-साथ List.toArray(), Arrays.sort(), और ListIterator.set(). उदाहरण के लिए:

    @Override
    public void sort(Comparator<? super E> c) {
      Object[] elements = toArray();
      Arrays.sort(elements, c);
      ListIterator<E> iterator = (ListIterator<Object>) listIterator();
      for (Object element : elements) {
        iterator.next();
        iterator.set((E) element);
      }
    }
    

    ज़्यादातर मामलों में, आपके पास List.sort() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एक लागू करने की वजह से अलग-अलग डिफ़ॉल्ट सेटिंग को डेलिगेट किया जा सकता है लागू करने की प्रोसेस, एपीआई लेवल के हिसाब से तय होती है. उदाहरण के लिए:

    @Override
    public void sort(Comparator<? super E> comparator) {
      if (Build.VERSION.SDK_INT <= 25) {
        Collections.sort(this);
      } else {
        super.sort(comparator);
      }
    }
    

    अगर आप बाद वाला विकल्प सिर्फ़ इसलिए इस्तेमाल कर रहे हैं, तो आपको sort() चाहिए तरीका सभी एपीआई लेवल पर उपलब्ध है, तो इसे एक अलग नाम देने पर विचार करें, बदलने के बजाय sortCompat() sort().

  • Collections.sort() को अब इस तौर पर गिना जाएगा में स्ट्रक्चरल मॉडिफ़िकेशन को लागू की जाने वाली उन चीज़ों की सूची जिनमें sort() को शामिल किया गया है. उदाहरण के लिए, Android 8.0 (एपीआई लेवल 26) से पहले के प्लैटफ़ॉर्म पर, एक ArrayList और उस पर sort() को कॉल किया जा रहा है अलग-अलग समय पर एक ConcurrentModificationException फेंक सकता था अगर क्रम से लगाया गया था, List.sort() पर कॉल करके. Collections.sort() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अपवाद नहीं मिला.

    इस बदलाव से प्लैटफ़ॉर्म के काम करने का तरीका एक जैसा हो जाएगा: अप्रोच का नतीजा ConcurrentModificationException में आता है.

क्लास लोड होने का तरीका

Android 8.0 (एपीआई लेवल 26) इस बात की जांच करता है कि क्लास लोड करने वाले ऐप्लिकेशन नई क्लास लोड करते समय, रनटाइम के अनुमान को तोड़ा जा सकता है. ये जांच यह जांच की जाती है कि क्लास Java का रेफ़रंस है ( forName()), Delvik बाइट कोड या JNI. यह प्लैटफ़ॉर्म, Java से loadClass() तरीका इस्तेमाल नहीं किया जाता और न ही इसकी जांच की जाती है के नतीजे नहीं मिल सकते. इस व्यवहार से अच्छे व्यवहार की क्षमता पर असर नहीं पड़ना चाहिए क्लास लोडर.

प्लैटफ़ॉर्म यह जांच करता है कि क्लास लोडर से मिलने वाली क्लास का डिस्क्रिप्टर अनुमानित डिस्क्रिप्टर से मैच करता है. अगर रिटर्न किया गया डिस्क्रिप्टर मेल नहीं खाता है, प्लैटफ़ॉर्म, NoClassDefFoundError गड़बड़ी दिखाता है और अपवाद के तौर पर, अंतर को दिखाने वाला एक पूरा मैसेज.

प्लैटफ़ॉर्म यह भी जांच करता है कि अनुरोध की गई क्लास के डिस्क्रिप्टर मान्य हैं या नहीं. यह चेक ऐसे JNI कॉल कैच करता है जो अप्रत्यक्ष रूप से क्लास लोड करते हैं, जैसे कि GetFieldID(), उन क्लास में अमान्य डिस्क्रिप्टर पास कर रहे हों. उदाहरण के लिए, हस्ताक्षर वाला फ़ील्ड java/lang/String नहीं मिला, क्योंकि हस्ताक्षर गलत है; यह Ljava/lang/String; होना चाहिए.

यह FindClass() को किए गए JNI कॉल से अलग है जहां java/lang/String एक मान्य और पूरी तरह क्वालिफ़ाइड नाम है.

Android 8.0 (एपीआई लेवल 26) पर, एक से ज़्यादा क्लास लोड करने वाले उपयोगकर्ता काम नहीं करते. ऐसा करके क्लास को तय करने की कोशिश की जाती है उसी DexFile ऑब्जेक्ट का इस्तेमाल किया जा रहा हो. ऐसा करने की कोशिश करने पर Android रनटाइम InternalError अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है "dex फ़ाइल को रजिस्टर करने की कोशिश करें <filename>" मैसेज के साथ गड़बड़ी जिसमें कई क्लास लोडर की सुविधा है".

DexFile API को अब बंद कर दिया गया है. हमारा सुझाव है कि आप कोई प्लैटफ़ॉर्म क्लासलोडर. इसमें PathClassLoader या इसके बजाय, BaseDexClassLoader का इस्तेमाल करें.

ध्यान दें: आप एक से ज़्यादा क्लास लोडर बना सकते हैं जो फ़ाइल सिस्टम से एक ही APK या JAR फ़ाइल कंटेनर को हटाना होगा. आम तौर पर ऐसा करने से मेमोरी ओवरहेड होती है: अगर कंटेनर में DEX फ़ाइलों को तो प्लैटफ़ॉर्म इस तरह की कार्रवाई करने के बजाय उन पर mmap कार्रवाई कर सकता है एक्सट्रैक्ट किए जा सकते हैं. हालांकि, अगर प्लैटफ़ॉर्म को कंटेनर से DEX फ़ाइल निकालनी होगी, इस तरीके से DEX फ़ाइल का रेफ़रंस देने से बहुत ज़्यादा मेमोरी खर्च हो सकती है.

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

चेतावनी: प्लैटफ़ॉर्म के वर्शन में अगर आपका ऐप्लिकेशन Android 8.0 (एपीआई लेवल 26) से पहले वाला वर्शन नहीं है, तो इन अनुमानों को तोड़ने से, उपयोगकर्ता के पास कई बार क्लास होती है, क्लास के भ्रम की वजह से गड़बड़ी हो जाती है, और अन्य अनचाहे इफ़ेक्ट शामिल हैं.