يقدّم الإصدار 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.