ميزات Android 8.1 وواجهات برمجة التطبيقات

الإصدار Android 8.1 (المستوى 27 من واجهة برمجة التطبيقات) يقدّم مجموعة متنوعة من ميزات وإمكانات جديدة للمستخدمين والمطوّرين. يعرض هذا المستند الميزات الجديدة للمطوّرين.

Android Oreo (إصدار Go)

Android Go هي مبادرتنا لتحسين تجربة استخدام Android لمليارات الأشخاص الذين يستخدمون الإنترنت حول العالم. بدءًا من Android 8.1، جعلنا Android نظامًا أساسيًا رائعًا للأجهزة منخفضة المواصفات. الميزات في Android Oreo (إصدار Go) تشمل إعدادات الضبط ما يلي:

  • تحسينات الذاكرة: تحسين استخدام الذاكرة في النظام الأساسي لضمان الذي يتيح تشغيل التطبيقات بكفاءة على الأجهزة المزوّدة بذاكرة وصول عشوائي (RAM) بسعة 1 غيغابايت أو أقل.
  • خيارات استهداف مرنة: الإصدار الجديد ميزات الأجهزة الثوابت للسماح لك بتوجيه توزيع تطبيقاتك إلى الأجهزة العادية أو ذات ذاكرة الوصول العشوائي المنخفضة من خلال Google Play.
  • Google Play:في حين أنّ جميع التطبيقات ستكون متوفّرة على الأجهزة التي تعمل بنظام Android Oreo (إصدار Go)، سيمنح Google Play إمكانية الوصول إلى التطبيقات التي حسَّنها المطوِّرون تحديدًا لتقديم تجربة رائعة لمليارات الأشخاص مع البناء لمليارات إرشاداتنا

تم تحديث المبنى لمليارات المستخدمين والإرشادات مع المزيد من الإرشادات حول كيفية تحسين تطبيقك للأجهزة التي تعمل Android Oreo (إصدار Go) ننصح معظم المطوّرين بتحسين ملف APK الحالي أو استخدام على Google Play ميزة متعددة في حِزم APK لاستهداف الأجهزة التي تتضمّن ذاكرة وصول عشوائي (RAM) ضِمن إصدار من حزمة APK هو أفضل طريقة للاستعداد للأجهزة التي تعمل بنظام Android Oreo (إصدار Go). تذكر أن جعل التطبيق أخفّ وأعلى كفاءة يفيد جمهورك بالكامل، بغض النظر عن الجهاز الذي تستخدمه.

واجهة برمجة تطبيقات الشبكات العصبونية

توفر واجهة برمجة تطبيقات الشبكات العصبية تسريعًا للعمليات الحسابية والاستنتاجات للأجهزة على الجهاز أطر عمل تعليمية مثل TensorFlow Lite: مكتبة تعلُّم الآلة من عدّة منصات من Google للأجهزة الجوّالة: بالإضافة إلى Caffe2 وغير ذلك. الانتقال إلى TensorFlow Lite البرامج المفتوحة المصدر المستودع لعمليات التنزيل والمستندات. تعمل TensorFlow Lite مع واجهة برمجة التطبيقات Neual Networks API لتشغيل نماذج مثل MobileNets، Inception v3، و يمكنك استخدام ميزة "الرد السريع" بكفاءة على جهازك الجوّال.

تعديلات إطار العمل لميزة "الملء التلقائي"

يوفّر Android 8.1 (المستوى 27 لواجهة برمجة التطبيقات) العديد من التحسينات على ميزة "الملء التلقائي" إطار عمل يمكنك دمجه في تطبيقاتك.

BaseAdapter تضم هذه الصف الآن setAutofillOptions() تسمح لك بتقديم تمثيلات سلسلة للقيم في محوّل. ويمكن الاستفادة من ذلك في استخدام أداة التدوير. التي تنشئ القيم ديناميكيًا في المحولات الخاصة بها. على سبيل المثال: يمكنك استخدام طريقة setAutofillOptions() لتوفير سلسلة لقائمة السنوات التي يمكن للمستخدمين اختيارها كجزء من تاريخ انتهاء صلاحية بطاقة الائتمان. يمكن لخدمات الملء التلقائي استخدام تمثيل السلسلة. لملء طرق العرض التي تتطلب البيانات بشكل مناسب.

بالإضافة إلى ذلك، إنّ AutofillManager تتضمن الفئة طريقة notifyViewVisibilityChanged(View, int, boolean) يمكنك استدعاؤه لإبلاغ إطار العمل بالتغييرات في مستوى رؤية العرض في هيكل افتراضي. هناك أيضًا إحمال زائد على الطريقة التي يتم بها الهياكل الافتراضية. ومع ذلك، لا تتطلب منك الهياكل غير الافتراضية عادةً إطار العمل بشكل صريح لأن الطريقة يتم استدعاءها بالفعل بواسطة View الصف.

يوفّر Android 8.1 أيضًا لـ "خدمات الملء التلقائي" المزيد من القدرة على تخصيص واجهة المستخدم الخاصة بالحفظ. الدعم من خلال إضافة دعم لـ CustomDescription and Validator في حدود SaveInfo.

الأوصاف المخصّصة مفيدة لمساعدة خدمة الملء التلقائي في توضيح ما هو يتم حفظها على سبيل المثال، عندما تحتوي الشاشة على بطاقة ائتمان، يمكن أن عرض شعار لمصرف بطاقة الائتمان، وآخر أربعة أرقام من ورقمه، ورقم انتهاء صلاحيته. لمزيد من المعلومات، يُرجى الاطّلاع على CustomDescription. الصف.

Validator يتم استخدام الكائنات لتجنُّب عرض واجهة مستخدم الحفظ التلقائي عند استخدام أداة التحقّق غير راضٍ. لمزيد من المعلومات، يُرجى مراجعة فئة أداة التحقق مع فئاتها الفرعية، LuhnChecksumValidator وRegexValidator.

الإشعارات

يتضمّن الإصدار Android 8.1 التغييرات التالية على الإشعارات:

  • يمكن للتطبيقات الآن إصدار صوت تنبيه بالإشعارات مرة واحدة فقط في الثانية. أصوات التنبيهات التي تتجاوز هذه الدرجة السعر غير في قائمة الانتظار ويتم فقدانه. لا يؤثر هذا التغيير في الجوانب الأخرى للإشعار. السلوك ورسائل الإعلام كما هو متوقع.
  • NotificationListenerService و لا يمكن استخدام ConditionProviderService على ذاكرة الوصول العشوائي المنخفضة الأجهزة التي تعمل بنظام التشغيل Android التي تعرض الخطأ true عند تسمّى ActivityManager.isLowRamDevice().

تعديل EditText

بدءًا من المستوى 27 لواجهة برمجة التطبيقات، تعرض الطريقة EditText.getText() العنصر Editable. في السابق ورجعت CharSequence. هذا التغيير متوافقة مع الإصدارات القديمة، حسب تنفيذ Editable CharSequence

توفر الواجهة Editable معلومات إضافية الأخرى. على سبيل المثال، لأنّ السمة Editable أيضًا لتنفيذ الواجهة Spannable، يمكنك تطبيق الترميز على المحتوى في مثال EditText.

الإجراءات الآلية في التصفّح الآمن

باستخدام تنفيذ WebView لواجهة برمجة تطبيقات التصفح الآمن، يمكن لتطبيقك اكتشاف متى يحاول مثيل WebView التنقل إلى عنوان URL صنّفه Google كتهديد معروف. بشكل افتراضي، يعرض WebView إعلانًا بينيًا يحذّر المستخدمين من التهديد المعروف. وتتيح هذه الشاشة للمستخدمين خيار تحميل عنوان URL على أي حال أو الرجوع إلى الصفحة السابقة آمنة.

في Android 8.1، يمكنك تحديد كيفية عمل استجابة التطبيق لتهديد معروف:

  • يمكنك التحكّم في ما إذا كان تطبيقك سيُبلغ عن التهديدات المعروفة للتهديدات الآمنة التصفح.
  • يمكنك السماح لتطبيقك بتنفيذ إجراء معين تلقائيًا، مثل بالعودة إلى وضع الأمان، في كل مرة يصادف فيها عنوان URL تستخدمه ميزة "التصفّح الآمن" كتهديد معروف.

ملاحظة: للحصول على حماية مثالية من التهديدات المعروفة، يُرجى الانتظار إلى أن تنتهي من إعداد "التصفح الآمن" قبل استدعاء الطريقة loadUrl() لكائن WebView

توضح مقتطفات الرمز التالية كيفية توجيه مثيلات تطبيقك 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 ميجابايت، أي أكبر بكثير سيحتاج لصورة مصغّرة.

واجهة برمجة التطبيقات للذاكرة المشتركة

الإصدار Android 8.1 (المستوى 27 من واجهة برمجة التطبيقات) يقدّم ميزة جديدة SharedMemory واجهة برمجة التطبيقات. يتيح لك هذا الصف إنشاء ملف شخصي مجهول الهوية وربطه وإدارته SharedMemory مثال. أنت تضبط ميزة حماية الذاكرة في SharedMemory كائنًا للقراءة و/أو الكتابة، وبما أن SharedMemory كائن قابل للتوزيع، فيمكنك تمريره بسهولة إلى عملية أخرى من خلال AIDL.

SharedMemory تتفاعل واجهة برمجة التطبيقات مع ASharedMemory في كوريا الجنوبية. يمنح ASharedMemory الإذن بالوصول إلى واصف الملف، والذي يمكن بعد ذلك تعيينه للقراءة والكتابة. إنّه طريقة لمشاركة كميات كبيرة من البيانات بين التطبيقات أو بين عمليات متعددة داخل تطبيق واحد.

واجهة برمجة تطبيقات BackgroundColors

يتيح Android 8.1 (المستوى 27 من واجهة برمجة التطبيقات) للخلفية المتحركة إضافة الألوان إلى الخلفية. المعلومات إلى واجهة مستخدم النظام. يمكنك إجراء ذلك من خلال إنشاء WallpaperColors كائن من صورة نقطية أو عنصر قابل للرسم أو باستخدام ثلاثة ألوان محددة يدويًا. يمكنك أيضًا استرداد معلومات اللون هذه.

لإنشاء WallpaperColors المستخدم، فيمكنك تنفيذ أي مما يلي:

  • لإنشاء WallpaperColors باستخدام ثلاثة ألوان، يمكنك إنشاء مثيل للسمة WallpaperColors باجتياز اللون الأساسي والثانوي والثالث. الأساسية يجب ألا يكون اللون فارغًا.
  • لإنشاء WallpaperColors من صورة نقطية، استدعِ fromBitmap() بتمرير مصدر الصور النقطية كمعلمة.
  • لإنشاء WallpaperColors كائن من عنصر قابل للرسم، عليك باستدعاء fromDrawable() بتمرير المصدر القابل للرسم كمعلمة.

لاسترداد تفاصيل اللون الأساسي أو الثانوي أو الثالث من الخلفية، يمكنك استدعاء الطرق التالية:

لإشعار النظام بأي تغييرات مهمة في ألوان الخلفية المتحركة، الِاتِّصَالْ بِـ notifyColorsChanged() . تؤدي هذه الطريقة إلى بدء دورة حياة onComputeColors(). فعالية يمكنك من خلالها تقديم WallpaperColors الخاص بك.

لإضافة مستمع إلى تغيرات الألوان، يمكنك استدعاء الطريقة addOnColorsChangedListener(). يمكنك أيضًا استدعاء طريقة getWallpaperColors() لاسترداد الألوان الأساسية للخلفية.

التحديثات المتعلقة ببصمة الإصبع

تضم الفئة FingerprintManager قدمنا رموز الخطأ التالية:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT – حاول المستخدم عدة مرات لفتح قفل جهازه باستخدام قارئ بصمة الإصبع.
  • FINGERPRINT_ERROR_VENDOR – ملف مرجعي خاص بالمورّد حدث خطأ في القارئ.

الإشعارات بشأن التشفير

تم إجراء عدد من التغييرات في التشفير على Android 8.1:

  • تم تنفيذ خوارزميات جديدة في 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 RSA يسمح بإنشاء مفاتيح. من صفائف البايت التي يزيد حجمها عن المفتاح المشفر. المكالمات إلى generatePrivate() و generatePublic() التي توفّر KeySpec حيث لا يتم ملء بنية المفتاح سينتج عن المخزن المؤقت بأكمله InvalidKeySpecException.
  • عندما تتم مقاطعة قراءة المقبس عند إغلاق المقبس، تستخدم أداة Conscrypt لعرض -1 من القراءة. يتجاهل القراءة الآن SocketException
  • تم تغيير مجموعة شهادات CA الجذر، وأدى ذلك غالبًا إلى إزالة عدد الشهادات القديمة، ولكن ستتم أيضًا إزالة شهادات الجذر لـ WoSign وStartCom. للحصول على مزيد من المعلومات حول هذا القرار، يمكنك الاطّلاع على مشاركة مدونة الأمان، نهائي إزالة الثقة في شهادتَي WoSign وStartCom