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

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

توفر واجهة برمجة تطبيقات الشبكات العصبية تسريعًا للعمليات الحسابية والاستنتاجات للأجهزة على الجهاز أطر عمل تعليمية مثل TensorFlow Lite: مكتبة تعلُّم الآلة من عدّة منصات من Google للأجهزة الجوّالة: بالإضافة إلى Caffe2 وغير ذلك. يمكنك الانتقال إلى مستودع GitHub المفتوح المصدر الخاص بـ 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 and Validator .

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

تُستخدَم عناصر Validator لتجنُّب عرض واجهة مستخدم حفظ الملء التلقائي في حال عدم استيفاء شرط 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 تنفيذ واجهة برمجة التطبيقات Safe Browsing API، يمكن لتطبيقك رصد الحالات التي يحاول فيها مثيل 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: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 كائن قابل للتوزيع، فيمكنك تمريره بسهولة إلى عملية أخرى من خلال AIDL.

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