Android 8.1 सुविधाएं और एपीआई

Android 8.1 (एपीआई लेवल 27) में, कई तरह के उपयोगकर्ताओं और डेवलपर के लिए नई सुविधाएं और क्षमताएं. इस दस्तावेज़ में बताया गया है कि डेवलपर के लिए क्या नया है.

Android Oreo (Go संस्करण)

Android Go, दुनिया भर में ऑनलाइन आने वाले अरबों लोगों के लिए, Android का अनुभव ऑप्टिमाइज़ करने के लिए हमारी पहल है. Android 8.1 से शुरू करके, हम Android को कम सुविधाओं वाले डिवाइसों के लिए बेहतरीन प्लैटफ़ॉर्म बना रहे हैं. Android Oreo (Go वर्शन) कॉन्फ़िगरेशन की सुविधाओं में ये शामिल हैं:

  • मेमोरी ऑप्टिमाइज़ेशन. सभी प्लैटफ़ॉर्म पर मेमोरी के इस्तेमाल को बेहतर बनाया, ताकि पक्का किया जा सके कि ऐप्लिकेशन 1 जीबी या इससे कम रैम वाले डिवाइसों पर बेहतर तरीके से चल सकें.
  • ज़रूरत के हिसाब से टारगेटिंग के विकल्प. नई सीरीज़ हार्डवेयर की सुविधा कॉन्सटेंट की मदद से, आपको सामान्य या कम रैम वाले डिवाइसों पर ऐप्लिकेशन डिस्ट्रिब्यूशन को टारगेट करने की सुविधा मिलती है Google Play से डाउनलोड करें.
  • Google Play.Android Oreo (Go वर्शन) पर चलने वाले डिवाइसों पर सभी ऐप्लिकेशन उपलब्ध होंगे. हालांकि, Google Play पर उन ऐप्लिकेशन को दिखाया जाएगा जिन्हें डेवलपर ने खास तौर पर ऑप्टिमाइज़ किया है. ऐसा इसलिए किया जाता है, ताकि अरबों लोगों को बेहतर अनुभव दिया जा सके. इसके लिए, 'अरबों लोगों के लिए बनाना' दिशा-निर्देशों का पालन किया जाता है.

हमने बिल्डिंग को अरबों निर्देशों के लिए अपडेट किया है. इसमें, Android Oreo (Go वर्शन) पर चलने वाले डिवाइसों के लिए, अपने ऐप्लिकेशन को ऑप्टिमाइज़ करने का तरीका बताया गया है. ज़्यादातर डेवलपर के लिए, अपने मौजूदा APK को ऑप्टिमाइज़ करना या Google Play पर, आपके APK के वर्शन को कम रैम वाले डिवाइसों पर टारगेट करने के लिए, एक से ज़्यादा APK सुविधा Android Oreo (Go वर्शन) वाले डिवाइसों के लिए, तैयारी करने का सबसे अच्छा तरीका है. याद रखें कि अपने ऐप्लिकेशन आसान और ज़्यादा असरदार से, आपकी पूरी ऑडियंस को फ़ायदा मिलता है. इस बात से कोई फ़र्क़ नहीं पड़ता है कि कोई भी डिवाइस कौनसा है.

न्यूरल नेटवर्क एपीआई

Neural Networks API से, डिवाइस पर मौजूद मशीन के लिए तेज़ी से कंप्यूटेशन और अनुमान की सुविधा मिलती है TensorFlow जैसे लर्निंग फ़्रेमवर्क Lite—मोबाइल के लिए Google की क्रॉस-प्लैटफ़ॉर्म ML लाइब्रेरी— साथ ही, Caffe2 और अन्य. TensorFlow Lite पर जाएं ओपन सोर्स रेपो का इस्तेमाल करें. TensorFlow Lite, न्यूरल नेटवर्क एपीआई के साथ काम करता है, ताकि इस तरह के मॉडल चलाए जा सकें MobileNets, इंसेप्शन v3, और आपके मोबाइल डिवाइस पर बेहतर तरीके से स्मार्ट जवाब की सुविधा मिलती है.

ऑटोमैटिक भरने की सुविधा के फ़्रेमवर्क से जुड़े अपडेट

Android 8.1 (एपीआई लेवल 27) की मदद से, जानकारी अपने-आप भरने की सुविधा में कई सुधार किए गए हैं फ़्रेमवर्क जिसे अपने ऐप्लिकेशन में शामिल किया जा सकता है.

BaseAdapter क्लास में अब setAutofillOptions() तरीका शामिल है. इसकी मदद से, किसी अडैप्टर में वैल्यू की स्ट्रिंग के तौर पर जानकारी दी जा सकती है. यह स्पिनर के लिए उपयोगी है ऐसे कंट्रोल होते हैं जो अपने अडैप्टर में डाइनैमिक तौर पर वैल्यू जनरेट करते हैं. उदाहरण के लिए, setAutofillOptions() तरीके का इस्तेमाल करके, उन सालों की सूची को स्ट्रिंग के तौर पर दिखाया जा सकता है जिन्हें उपयोगकर्ता, क्रेडिट कार्ड की समयसीमा खत्म होने की तारीख के तौर पर चुन सकते हैं. ऑटोमैटिक भरने की सुविधाएं, स्ट्रिंग के तौर पर डेटा दिखाने की सुविधा का इस्तेमाल करके, उन व्यू को सही तरीके से भर सकती हैं जिनमें डेटा की ज़रूरत होती है.

साथ ही, AutofillManager क्लास में notifyViewVisibilityChanged(View, int, boolean) तरीका शामिल है जिसे आप दस्तावेज़ की दृश्यता में होने वाले बदलावों के बारे में फ़्रेमवर्क को सूचित करने के लिए कॉल कर सकते हैं वर्चुअल स्ट्रक्चर में देखने के लिए किया जा सकता है. गैर-लाभकारी संस्थाओं के लिए तरीके का ओवरलोड भी वर्चुअल स्ट्रक्चर. हालांकि, आम तौर पर नॉन-वर्चुअल स्ट्रक्चर के लिए, आपको फ़्रेमवर्क को साफ़ तौर पर सूचना देने की ज़रूरत नहीं होती, क्योंकि View क्लास पहले से ही उस तरीके को कॉल कर लेती है.

Android 8.1 में, ऑटोमैटिक भरने की सेवाओं को SaveInfo में CustomDescription and Validator के लिए सहायता जोड़कर, सेव करने के यूज़र इंटरफ़ेस (यूआई) को पसंद के मुताबिक बनाने की ज़्यादा सुविधा भी मिलती है.

पसंद के मुताबिक बनाई गई जानकारी, ऑटोमैटिक भरने की सेवा को यह बताने में मदद करती है कि कौनसी जानकारी सेव किया जा रहा है; उदाहरण के लिए, जब स्क्रीन में क्रेडिट कार्ड हो, तो क्रेडिट कार्ड के बैंक का लोगो और क्रेडिट कार्ड के आखिरी चार अंक दिखेंगे और उसका एक्सपायर नंबर. ज़्यादा जानने के लिए, CustomDescription देखें क्लास.

Validator अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है पुष्टि करने वाले प्रोग्राम में, ऑब्जेक्ट का इस्तेमाल इसलिए किया जाता है, ताकि ऑटोमैटिक भरने की सुविधा को सेव करने के लिए यूज़र इंटरफ़ेस (यूआई) न दिखे शर्त पूरी नहीं हुई. ज़्यादा जानकारी के लिए, पुष्टि करने वाली क्लास और इसके सब-क्लास, LunChecksumValidator और RegexValidator.

सूचनाएं

Android 8.1 में सूचनाओं से जुड़े ये बदलाव किए गए हैं:

  • ऐप्लिकेशन अब हर सेकंड में सिर्फ़ एक बार सूचना की चेतावनी वाली आवाज़ निकाल सकते हैं. इस दर से ज़्यादा की सूचना वाली आवाज़ें, सूची में नहीं जोड़ी जातीं और वे खो जाती हैं. इस बदलाव का असर सूचना के दूसरे पहलुओं पर नहीं पड़ता व्यवहार और सूचना वाले मैसेज अब भी उम्मीद के मुताबिक पोस्ट होते रहेंगे.
  • NotificationListenerService और ConditionProviderService, कम रैम वाले Android डिवाइसों पर काम नहीं करते. ये ऐसे डिवाइस होते हैं जिन पर ActivityManager.isLowRamDevice() को कॉल करने पर true दिखता है.

EditText अपडेट

एपीआई लेवल 27 से शुरू करते हुए, EditText.getText() वाला तरीका Editable दिखाता है; पहले इससे CharSequence मिला. यह बदलाव, पहले के वर्शन के साथ काम करता है, क्योंकि Editable, CharSequence को लागू करता है.

Editable इंटरफ़ेस, ज़्यादा काम की सुविधाएं देता है. उदाहरण के लिए, Editable में Spannable इंटरफ़ेस भी लागू होता है. इसलिए, EditText के किसी इंस्टेंस में कॉन्टेंट पर मार्कअप लागू किया जा सकता है.

प्रोग्राम के हिसाब से सुरक्षित ब्राउज़िंग की कार्रवाइयां

Safe Browsing API के WebView लागू करने की सुविधा का इस्तेमाल करके, आपका ऐप्लिकेशन यह पता लगा सकता है कि WebView का कोई इंस्टेंस, उस यूआरएल पर नेविगेट करने की कोशिश कब करता है जिसे Google ने खतरे के तौर पर मार्क किया है. डिफ़ॉल्ट रूप से, WebView पेज पर अचानक दिखने वाला एक विज्ञापन दिखाता है, जो उपयोगकर्ताओं को पहले से मालूम खतरे की चेतावनी देता है. यह स्क्रीन, उपयोगकर्ताओं को यूआरएल को फिर भी लोड करने या जो सुरक्षित हैं.

Android 8.1 में, प्रोग्राम के हिसाब से यह तय किया जा सकता है कि आपका ऐप्लिकेशन किसी ज्ञात खतरे का जवाब कैसे देगा:

  • यह कंट्रोल किया जा सकता है कि आपका ऐप्लिकेशन, सुरक्षित कॉन्टेंट के लिए जाने-पहचाने खतरों की रिपोर्ट करे या नहीं ब्राउज़िंग.
  • आप अपने ऐप्लिकेशन से कोई खास कार्रवाई अपने-आप करने के लिए सेट कर सकते हैं—जैसे सुरक्षित ब्राउज़िंग की सुविधा का इस्तेमाल करना—जब उसे कोई ऐसा यूआरएल मिले जिसमें सुरक्षित ब्राउज़िंग की सुविधा चालू हो पहले से मालूम खतरे के रूप में करता है.

ध्यान दें: जाने-पहचाने खतरों से बेहतर सुरक्षा पाने के लिए, WebView ऑब्जेक्ट के loadUrl() तरीके को शुरू करने से पहले, सुरक्षित ब्राउज़िंग की सुविधा शुरू होने तक इंतज़ार करें.

नीचे दिए गए कोड स्निपेट दिखाते हैं कि आप अपने ऐप्लिकेशन के इंस्टेंस को समस्या का सामना करने के बाद हमेशा सुरक्षित रहने के लिए WebView पहले से मालूम खतरा:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:valu>e=&qu<ot;true">;< /
    /a>pplication
/manifest

MyWebActivity.java

Kotlin

private var superSafeWebView: WebView? = null
private var safeBrowsingIsInitialized: Boolean = false

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    superSafeWebView = WebView(this).apply {
        webViewClient = MyWebViewClient()
        safeBrowsingIsInitialized = false
        startSafeBrowsing(this@SafeBrowsingActivity, { success ->
            safeBrowsingIsInitialized = true
            if (!success) {
                Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!")
            }
        })
    }
}

Java

private WebView superSafeWebView;
private boolean safeBrowsingIsInitialized;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    superSafeWebView = new WebView(this);
    superSafeWebView.setWebViewClient(new MyWebViewClient());
    safeBrowsingIsInitialized = false;

    superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() {
        @Override
        public void onReceiveValue(Boolean success) {
            safeBrowsingIsInitialized = true;
            if (!success) {
                Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!");
            }
        }
    });
}

MyWebViewClient.java

Kotlin

class MyWebViewClient : WebViewClient() {
    // Automatically go "back to safety" when attempting to load a website that
    // Safe Browsing has identified as a known threat. An instance of WebView
    // calls this method only after Safe Browsing is initialized, so there's no
    // conditional logic needed here.
    override fun onSafeBrowsingHit(
            view: WebView,
            request: WebResourceRequest,
            threatType: Int,
            callback: SafeBrowsingResponse
    ) {
        // The "true" argument indicates that your app reports incidents like
        // this one to Safe Browsing.
        callback.backToSafety(true)
        Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show()
    }
}

Java

public class MyWebViewClient extends WebViewClient {
    // Automatically go "back to safety" when attempting to load a website that
    // Safe Browsing has identified as a known threat. An instance of WebView
    // calls this method only after Safe Browsing is initialized, so there's no
    // conditional logic needed here.
    @Override
    public void onSafeBrowsingHit(WebView view, WebResourceRequest request,
            int threatType, SafeBrowsingResponse callback) {
        // The "true" argument indicates that your app reports incidents like
        // this one to Safe Browsing.
        callback.backToSafety(true);
        Toast.makeText(view.getContext(), "Unsafe web page blocked.",
                Toast.LENGTH_LONG).show();
    }
}

वीडियो का थंबनेल निकालने वाला टूल

MediaMetadataRetriever क्लास में एक नया तरीका, getScaledFrameAtTime() है. यह किसी तय समय के आस-पास का फ़्रेम ढूंढता है और सोर्स फ़्रेम के जैसे आसपेक्ट रेशियो वाला बिटमैप दिखाता है. हालांकि, इसे तय चौड़ाई और ऊंचाई वाले रेक्टैंगल में फ़िट करने के लिए स्केल किया जाता है. इससे वीडियो से थंबनेल इमेज जनरेट करने में मदद मिलती है.

हमारा सुझाव है कि getFrameAtTime() के बजाय, यह तरीका इस्तेमाल करें. इससे मेमोरी बर्बाद हो सकती है क्योंकि यह सोर्स वीडियो की तरह ही रिज़ॉल्यूशन वाला बिटमैप दिखाता है. इसके लिए उदाहरण के लिए, किसी 4K वीडियो से लिया गया फ़्रेम, 16 एमबी का बिटमैप होगा, जो आपसे काफ़ी बड़ा होगा के लिए थंबनेल इमेज की ज़रूरत होगी.

शेयर की गई मेमोरी का एपीआई

Android 8.1 (एपीआई लेवल 27) के लिए, पेश है एक नया SharedMemory एपीआई. इस क्लास में आपको अपनी पहचान छिपाकर, मैप करने, और मैनेज करने की सुविधा मिलती है SharedMemory इंस्टेंस. आपने मेमोरी की सुरक्षा मोड को सेट किया है एक पर SharedMemory पढ़ने और/या लिखने के लिए ऑब्जेक्ट प्रदान करता है और, SharedMemory ऑब्जेक्ट पार्स किया जा सकता है. एआईडीएल की मदद से, इसे किसी दूसरी प्रोसेस में आसानी से पास किया जा सकता है.

SharedMemory एपीआई, NDK में ASharedMemory सुविधा के साथ काम करता है. ASharedMemory ऐक्सेस देता है को फ़ाइल डिस्क्रिप्टर से जोड़ा जा सकता है, जिसे पढ़ने और लिखने के लिए मैप किया जा सकता है. यह बहुत बढ़िया है बड़ी मात्रा में शेयर करने का तरीका ऐप्लिकेशन के बीच या एक ही ऐप्लिकेशन में कई प्रोसेस के बीच का डेटा.

वॉलपेपर के रंग का एपीआई

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

WallpaperColors ऑब्जेक्ट बनाने के लिए, इनमें से कोई एक काम करें:

  • WallpaperColors बनाने के लिए ऑब्जेक्ट बनाने के लिए, तीन रंगों का इस्तेमाल करें और WallpaperColors का इंस्टेंस बनाएं प्राइमरी, सेकंडरी, और टर्शीयरी कलर की मदद से क्लास को पास करें. प्राइमरी रंग शून्य नहीं होना चाहिए.
  • बिटमैप से WallpaperColors ऑब्जेक्ट बनाने के लिए, बिटमैप सोर्स को पैरामीटर के तौर पर पास करके fromBitmap() तरीका कॉल करें.
  • ड्रॉबल से WallpaperColors ऑब्जेक्ट बनाने के लिए, ड्रॉबल सोर्स को पैरामीटर के तौर पर पास करके fromDrawable() तरीका कॉल करें.

इमेज की मदद से, मुख्य, दूसरे या तीसरे रंग की जानकारी वापस पाने के लिए वॉलपेपर के लिए, इन तरीकों का इस्तेमाल करें:

  • getPrimaryColor() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वॉलपेपर का सबसे विज़ुअल तौर पर दिखाने वाला रंग दिखाता है.
  • getSecondaryColor() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वॉलपेपर का दूसरा सबसे खास रंग लौटाता है.
  • getTertiaryColor() तरीका, वॉलपेपर का तीसरा सबसे प्रमुख रंग दिखाता है.

अपने लाइव वॉलपेपर के रंग में किसी भी बड़े बदलाव के बारे में सिस्टम को सूचित करने के लिए, notifyColorsChanged() को कॉल करो तरीका. यह तरीका, onComputeColors() लाइफ़साइकल इवेंट को ट्रिगर करता है. इसमें, आपको नया WallpaperColors ऑब्जेक्ट देने का मौका मिलता है.

रंग में हुए बदलावों के लिए कोई श्रोता जोड़ने के लिए, addOnColorsChangedListener() तरीके को कॉल किया जा सकता है. किसी वॉलपेपर के मुख्य रंगों को वापस पाने के लिए, getWallpaperColors() तरीके को भी कॉल किया जा सकता है.

फ़िंगरप्रिंट से जुड़े अपडेट

FingerprintManager क्लास में, गड़बड़ी के ये कोड जोड़े गए हैं:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT – उपयोगकर्ता ने कोशिश की कई बार फ़िंगरप्रिंट रीडर का इस्तेमाल करके डिवाइस को अनलॉक नहीं कर पाते.
  • FINGERPRINT_ERROR_VENDOR – वेंडर के लिए खास फ़िंगरप्रिंट रीडर की गड़बड़ी हुई.

क्रिप्टोग्राफ़ी से जुड़े अपडेट

Android 8.1 के साथ क्रिप्टोग्राफ़ी में कई बदलाव किए गए हैं:

  • Conscrypt में नए एल्गोरिदम लागू किए गए हैं. द कॉन्क्रिप्ट इस सुविधा को लागू करने का इस्तेमाल, मौजूदा बाउंसी कैसल के मुकाबले ज़्यादा किया जाता है लागू करना. नए एल्गोरिदम में ये शामिल हैं:
    • AlgorithmParameters:GCM
    • KeyGenerator:AES
    • KeyGenerator:DESEDE
    • KeyGenerator:HMACMD5
    • KeyGenerator:HMACSHA1
    • KeyGenerator:HMACSHA224
    • KeyGenerator:HMACSHA256
    • KeyGenerator:HMACSHA384
    • KeyGenerator:HMACSHA512
    • SecretKeyFactory:DESEDE
    • Signature:NONEWITHECDSA
  • Cipher.getParameters().getParameterSpec(IvParameterSpec.class) अब GCM का इस्तेमाल करने वाले एल्गोरिदम के लिए काम नहीं करता. इसके बजाय, getParameterSpec(GCMParameterSpec.class).
  • TLS से जुड़ी कई इंटरनल Conscrypt क्लास को फिर से तैयार किया गया. डेवलपर कभी-कभी इनका ऐक्सेस रिफ़्लेक्टिव तरीके से करते हैं. इसलिए, पिछले इस्तेमाल को जारी रखने के लिए, शिम को बरकरार रखा गया है. हालांकि, कुछ जानकारी बदल गई है. उदाहरण के लिए, सॉकेट पहले ये OpenSSLSocketImpl टाइप की थीं, लेकिन अब इनका टाइप है ConscryptFileDescriptorSocket या ConscryptEngineSocket, ये दोनों ही विस्तृत होते हैं OpenSSLSocketImpl.
  • SSLSession मेथड, कोई शून्य रेफ़रंस मिलने पर IllegalArgumentException को दिखाते थे. अब वे NullPointerException को दिखाते हैं.
  • आरएसए KeyFactory अब कुंजी जनरेट करने की अनुमति नहीं देता कोड में बदली गई कुंजी से बड़े साइज़ वाले बाइट सरणियों से. इन पर कॉल generatePrivate() और generatePublic() जो KeySpec जहां कुंजी संरचना पूरे बफ़र का नतीजा InvalidKeySpecException होगा.
  • जब किसी सोकेट को बंद करने की वजह से, सोकेट को पढ़ने में रुकावट आती है, तो Conscrypt, पढ़ने की प्रोसेस से -1 दिखाता है. अब पढ़ने पर, SocketException दिखता है.
  • रूट CA सर्टिफ़िकेट के सेट में बदलाव किया गया है. इसमें ज़्यादातर बड़े सर्टिफ़िकेट को हटाया गया है पुराने सर्टिफ़िकेट की संख्या नहीं, बल्कि रूट सर्टिफ़िकेट को भी हटाया जा सकता है WoSign और StartCom. इस फ़ैसले के बारे में ज़्यादा जानने के लिए, Google Security Blog की पोस्ट, WoSign और StartCom के सर्टिफ़िकेट पर भरोसा करने की सुविधा को हटाने का फ़ैसला देखें.