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

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

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

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

إذا كان تطبيقك يستهدف الإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث، تعرض الطريقة isCleartextTrafficPermitted() القيمة false تلقائيًا. إذا كان تطبيقك يحتاج إلى تفعيل cleartext لنطاقات محدّدة، يجب ضبط 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).

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

معالجة القيمة الست عشرية لنموذج RGBA في CSS

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

يتوافق Chrome مع المستوى 4 من وحدة ألوان CSS منذ الإصدار 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، وسيتم عرض معرّف الموارد المنتظم مثل 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، يتم إخفاء الإشعارات الواردة من التطبيقات المعلّقة إلى أن يتم استئناف التطبيق.