تغييرات السلوك: التطبيقات التي تستهدف المستوى 28 من واجهة برمجة التطبيقات أو أكثر

يقدّم الإصدار Android 9 (المستوى 28 من واجهة برمجة التطبيقات) عددًا من التغييرات في نظام Android. تسري تغييرات السلوك التالية حصريًا على التطبيقات التي تستهدف المستوى 28 من واجهة برمجة التطبيقات أو مستوى أعلى. على التطبيقات التي تم ضبط targetSdkVersion على المستوى 28 من واجهة برمجة التطبيقات أو مستوى أعلى، عليك تعديل تطبيقاتها لإتاحة هذه السلوكيات بشكل صحيح، حيثما ينطبق ذلك على التطبيق.

لمعرفة التغييرات التي تؤثر في جميع التطبيقات التي تعمل بنظام التشغيل Android 9، بغض النظر عن مستوى واجهة برمجة التطبيقات الذي تستهدفه، يُرجى الاطّلاع على التغييرات في السلوك: جميع التطبيقات.

الخدمات التي تعمل في المقدّمة

على التطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث وتستخدم خدمات تعمل في المقدّمة، أن تطلب الحصول على إذن FOREGROUND_SERVICE. وهذا إذن عادي، لذلك يمنحه النظام تلقائيًا التطبيق الطالب.

إذا كان التطبيق الذي يستهدف الإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث يحاول إنشاء خدمة تعمل في المقدّمة بدون طلب FOREGROUND_SERVICE، يطرح النظام SecurityException.

تغييرات الخصوصية

إذا كان تطبيقك يستهدف نظام التشغيل Android 9، عليك مراعاة التغييرات التالية في السلوك. تعمل هذه التحديثات على المعلومات التسلسلية للجهاز ونظام أسماء النطاقات على تحسين خصوصية المستخدم.

إيقاف إصدار الرقم التسلسلي نهائيًا

في نظام التشغيل Android 9، تم ضبط Build.SERIAL دائمًا على "UNKNOWN" لحماية خصوصية المستخدمين.

إذا كان تطبيقك يحتاج إلى الوصول إلى الرقم التسلسلي لجهاز الجهاز، عليك طلب إذن READ_PHONE_STATE بدلاً من ذلك، ثم الاتصال بـ getSerial().

خصوصية نظام أسماء النطاقات

على التطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android الالتزام بواجهات برمجة تطبيقات نظام أسماء النطاقات الخاصة. على وجه الخصوص، يجب أن تضمن التطبيقات أنه إذا كان محلل النظام يستخدم نظام DNS-over-TLS، أي برنامج نظام أسماء نطاقات مضمّن يستخدم إما نظام أسماء نطاقات مشفّرًا لاسم المضيف نفسه الذي يستخدمه النظام، أو تم إيقافه لصالح برنامج تعيين النظام.

تغييرات أمان إطار العمل

يتضمّن نظام التشغيل Android 9 العديد من التغييرات في السلوك التي تعمل على تحسين أمان تطبيقك، لكنّ هذه التغييرات لا تسري إلا إذا كان تطبيقك يستهدف المستوى 28 من واجهة برمجة التطبيقات أو مستوى أعلى.

تفعيل بروتوكول أمان طبقة النقل (TLS) تلقائيًا للشبكة

إذا كان تطبيقك يستهدف نظام التشغيل Android 9 أو إصدارًا أحدث، تعرض الطريقة isCleartextTrafficPermitted() false بشكل تلقائي. إذا كان تطبيقك يحتاج إلى تفعيل نص واضح لنطاقات محدّدة، يجب ضبط cleartextTrafficPermitted صراحةً على true لهذه النطاقات في إعدادات أمان الشبكة في تطبيقك.

أدلة بيانات مستندة إلى الويب مفصولة حسب العملية

لتحسين ثبات التطبيقات وسلامة البيانات في نظام التشغيل Android 9، لا يمكن للتطبيقات مشاركة دليل بيانات WebView واحد من بين عمليات متعددة. وتخزِّن أدلة البيانات هذه عادةً ملفات تعريف الارتباط وذاكرات التخزين المؤقت لبروتوكول HTTP وغيرها من وحدات التخزين الدائمة والمؤقتة المتعلقة بتصفح الويب.

في معظم الحالات، يجب أن يستخدم تطبيقك فئات من حزمة android.webkit، مثل WebView و CookieManager، في عملية واحدة فقط. على سبيل المثال، يجب نقل جميع عناصر Activity التي تستخدم WebView في العملية نفسها. يمكنك فرض قاعدة "عملية واحدة فقط" بصرامة أكبر عن طريق استدعاء disableWebView() في العمليات الأخرى لتطبيقك. يؤدي هذا الطلب إلى منع إعداد WebView في تلك العمليات الأخرى عن طريق الخطأ، حتى إذا تم طلبه من مكتبة تابعة.

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

نطاقات SELinux بحسب التطبيق

إنّ التطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث لا يمكنها مشاركة البيانات مع التطبيقات الأخرى باستخدام أذونات Unix المتاحة لجميع أنحاء العالم. يحسّن هذا التغيير من سلامة وضع حماية تطبيقات Android، خاصةً المتطلبات التي تقضي بإتاحة البيانات الخاصة لأحد التطبيقات من خلال هذا التطبيق فقط.

لمشاركة الملفات مع تطبيقات أخرى، استخدِم موفّر المحتوى.

التغييرات في إمكانية الاتصال

احتساب بيانات الاتصال والمسارات المتعددة

وفي التطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث، يحتسب النظام زيارات الشبكة على الشبكات غير التلقائية حاليًا، مثل حركة بيانات شبكة الجوّال عندما يكون الجهاز متصلاً بشبكة Wi-Fi، ويوفّر طرقًا في فئة NetworkStatsManager لطلب بحث عن تلك الزيارات.

على وجه الخصوص، يعرض getMultipathPreference() الآن قيمة بناءً على حركة بيانات الشبكة المذكورة أعلاه. بدءًا من نظام التشغيل Android 9، تعرض الطريقة true لبيانات الخلية، ولكن عند تراكم أكثر من عدد معيّن من الزيارات في اليوم الواحد، تبدأ في عرض false. على التطبيقات التي تعمل على Android 9 تنفيذ الطريقة المناسبة وتنفيذ هذا التلميح.

يرسل الآن صف ConnectivityManager.NetworkCallback إلى التطبيقات معلومات عن الشبكات الافتراضية الخاصة. يسهّل هذا التغيير على التطبيقات الاستماع إلى أحداث الاتصال بدون الحاجة إلى المزج بين المكالمات المتزامنة وغير المتزامنة واستخدام واجهات برمجة تطبيقات محدودة. بالإضافة إلى ذلك، يعني ذلك أنّ عملية نقل المعلومات تتم على النحو المتوقّع عند اتصال الجهاز بعدة شبكات Wi-Fi أو شبكات خلوية متعددة في الوقت نفسه.

إيقاف عميل Apache HTTP نهائيًا

في الإصدار Android 6.0، أزلنا دعم عميل Apache HTTP. وبدايةً من نظام التشغيل Android 9، ستتم إزالة تلك المكتبة من مسار التمهيد ولا تكون متاحة للتطبيقات تلقائيًا.

لمواصلة استخدام عميل Apache HTTP، يمكن للتطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android والإصدارات الأحدث إضافة ما يلي إلى AndroidManifest.xml:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

وكبديل لاستخدام مكتبة Apache في وقت التشغيل، يمكن للتطبيقات تجميع نسختها الخاصة من مكتبة org.apache.http في حزمة APK. في حال إجراء ذلك، عليك إعادة إنشاء المكتبة (باستخدام أداة مساعدة مثل Jar Jar) لتجنُّب مشاكل التوافق مع الصفوف مع الفئات المقدّمة في وقت التشغيل.

تغييرات واجهة المستخدم

عرض التركيز

لم يعد بالإمكان التركيز على المشاهدات التي تتضمن مساحة 0 (سواءً كان العرض أو الارتفاع 0).

بالإضافة إلى ذلك، لم تعد الأنشطة تحدد ضمنيًا تركيزًا أوليًا عند استخدام وضع اللمس. بدلاً من ذلك، الأمر متروك لك لطلب التركيز الأوّلي بشكل صريح، إذا كنت ترغب في ذلك.

معالجة القيمة الست عشرية لنموذج أحمر أخضر أزرق في CSS

على التطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث أن تفعّل سلوك المسودّة المستوى 4 من وحدة ألوان CSS للتعامل مع ألوان CSS المكوّنة من 4 و8 أرقام سداسية عشرية.

كان المستوى 4 من وحدة ألوان CSS متوافقًا مع Chrome منذ الإصدار 52، إلا أنّ WebView توقِف هذه الميزة حاليًا لأنه تبيّن أن تطبيقات Android الحالية تحتوي على ألوان سداسية عشرية 32 بت وفق ترتيب Android (ARGB)، ما قد يؤدي إلى حدوث أخطاء في العرض.

مثلاً، يتم حاليًا عرض اللون #80ff8080 في WebView بلون أحمر فاتح معتم (#ff8080) للتطبيقات التي تستهدف مستويات واجهة برمجة التطبيقات 27 أو أقل. يتم في الوقت الحالي تجاهل المكوِّن الرئيسي (الذي يمكن تفسيره من خلال Android على أنه مكوّن الإصدار الأولي). إذا كان التطبيق يستهدف المستوى 28 من واجهة برمجة التطبيقات أو مستوى أعلى، يتم تفسير #80ff8080 على أنّه أخضر فاتح بنسبة% 50 (#80ff80).

التقاط نوع MIME للملف: معرّفات الموارد المنتظمة (URI)

يمكن لإصدارات Android الأقدم من نظام التشغيل Android 9 استنتاج أنواع MIME من محتويات الملفات. بدءًا من نظام التشغيل Android 9 (المستوى 28 لواجهة برمجة التطبيقات)، يجب أن تستخدم التطبيقات امتداد الملف الصحيح عند تحميل معرّفات الموارد المنتظمة (URI) file: في WebView.

فاستخدام محتوى الملف لاستنتاج أنواع MIME يمكن أن يكون مصدرًا لأخطاء أمنية، ولا تسمح المتصفحات الحديثة بذلك بوجه عام.

إذا كان الملف بامتداد ملف معروف، مثل .html أو .txt أو .js أو .css، سيتم تحديد نوع MIME من خلال الإضافة. وإذا لم يكن للملف امتداد أو امتداد غير معروف، سيكون نوع MIME نصًا عاديًا.

على سبيل المثال، سيتم عرض معرّف موارد منتظم (URI) مثل file:///sdcard/test.html على شكل HTML، وسيتم عرض معرّف موارد منتظم (URI) مثل file:///sdcard/test كنص عادي، حتى إذا كان الملف يحتوي على بيانات HTML.

عنصر تمرير المستند

يتعامل Android 9 مع الحالة التي يكون فيها العنصر الجذر في المستند هو عنصر التمرير. في الإصدارات السابقة، كان يتم تعيين موضع التمرير على عنصر النص الأساسي، وكان العنصر الجذر يحتوي على قيم تمرير صفرية. يسمح نظام Android 9 بالسلوك المتوافق مع المعايير حيث يكون عنصر التمرير هو العنصر الجذر.

بالإضافة إلى ذلك، يختلف سلوك الوصول المباشر إلى document.body.scrollTop أو document.body.scrollLeft أو document.documentElement.scrollTop أو document.documentElement.scrollLeft وفقًا لحزمة تطوير البرامج (SDK) المستهدَفة. للوصول إلى قيم التمرير في إطار العرض، استخدِم document.scrollingElement، إذا كان ذلك متاحًا.

الإشعارات من التطبيقات المعلّقة

قبل الإصدار 9 من Android، كان يتم إلغاء الإشعارات الواردة من التطبيقات المعلّقة. وبدايةً من نظام التشغيل Android 9، يتم إخفاء الإشعارات الواردة من التطبيقات المعلّقة إلى أن يتم استئناف التطبيق.