الإصدار 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
للعودة إلى وضع الأمان دائمًا بعد مواجهة
تهديد معروف:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
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!"); } } }); }
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()
بتمرير المصدر القابل للرسم كمعلمة.
لاسترداد تفاصيل اللون الأساسي أو الثانوي أو الثالث من الخلفية، يمكنك استدعاء الطرق التالية:
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
حيث لا يتم ملء بنية المفتاح سينتج عن المخزن المؤقت بأكملهInvalidKeySpecException
. - عندما تتم مقاطعة قراءة المقبس عند إغلاق المقبس، تستخدم أداة Conscrypt
لعرض -1 من القراءة. يتجاهل القراءة الآن
SocketException
- تم تغيير مجموعة شهادات CA الجذر، وأدى ذلك غالبًا إلى إزالة عدد الشهادات القديمة، ولكن ستتم أيضًا إزالة شهادات الجذر لـ WoSign وStartCom. للحصول على مزيد من المعلومات حول هذا القرار، يمكنك الاطّلاع على مشاركة مدونة الأمان، نهائي إزالة الثقة في شهادتَي WoSign وStartCom