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

Neural Networks API

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

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

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

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

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

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

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

Validator ऑब्जेक्ट का इस्तेमाल तब किया जाता है, जब पुष्टि करने वाले की शर्त पूरी नहीं होती. इससे, अपने-आप भरने की सुविधा के लिए सेव करने वाला यूज़र इंटरफ़ेस (यूआई) नहीं दिखता. ज़्यादा जानने के लिए, Validator क्लास और इसकी सबक्लास, LuhnChecksumValidator और 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:value="true" />
    </application>
</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 एमबी का बिटमैप होगा. यह थंबनेल इमेज के लिए ज़रूरी साइज़ से काफ़ी बड़ा है.

Shared memory API

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

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

WallpaperColors API

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 में नए एल्गोरिदम लागू किए गए हैं. Conscrypt को Bouncy Castle के मौजूदा वर्शन के मुकाबले प्राथमिकता दी जाती है. नए एल्गोरिदम में ये शामिल हैं:
    • 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) का इस्तेमाल करें.
  • टीएलएस से जुड़ी कई इंटरनल Conscrypt क्लास को फिर से बनाया गया है. डेवलपर कभी-कभी इन फ़ंक्शन को रिफ़्लेक्टिव तरीके से ऐक्सेस करते हैं. इसलिए, पिछले इस्तेमाल को सपोर्ट करने के लिए, शिम को अपनी जगह पर छोड़ दिया गया है. हालांकि, कुछ जानकारी में बदलाव किया गया है. उदाहरण के लिए, सॉकेट पहले OpenSSLSocketImpl टाइप के होते थे, लेकिन अब वे ConscryptFileDescriptorSocket या ConscryptEngineSocket टाइप के होते हैं. ये दोनों ही OpenSSLSocketImpl टाइप के होते हैं.
  • SSLSession तरीकों का इस्तेमाल, शून्य रेफ़रंस पास किए जाने पर IllegalArgumentException को थ्रो करने के लिए किया जाता था. अब वे NullPointerException को थ्रो करते हैं.
  • आरएसए KeyFactory अब एन्कोड की गई कुंजी से बड़े बाइट ऐरे से कुंजियां जनरेट करने की अनुमति नहीं देता. generatePrivate() और generatePublic() को कॉल करने पर, KeySpec मिलता है. अगर कुंजी का स्ट्रक्चर पूरे बफ़र को नहीं भरता है, तो InvalidKeySpecException मिलेगा.
  • जब सॉकेट बंद होने की वजह से सॉकेट रीड में रुकावट आती है, तो Conscrypt, रीड से -1 वैल्यू दिखाता था. read now SocketException दिखाता है.
  • रूट सीए सर्टिफ़िकेट का सेट बदल दिया गया है. इसमें ज़्यादातर पुराने सर्टिफ़िकेट हटा दिए गए हैं. साथ ही, WoSign और StartCom के रूट सर्टिफ़िकेट भी हटा दिए गए हैं. इस फ़ैसले के बारे में ज़्यादा जानने के लिए, Google Security Blog पोस्ट WoSign और StartCom सर्टिफ़िकेट पर भरोसा करने की सुविधा को हमेशा के लिए हटाना पढ़ें.