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

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

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

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

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

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

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

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

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

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

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

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

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

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

يتضمّن الإصدار 9 من نظام التشغيل Android العديد من التغييرات في السلوك التي تعمل على تحسين أمان تطبيقك، ولكن لا تسري هذه التغييرات إلا إذا كان تطبيقك يستهدف المستوى 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 الآن معلومات حول شبكات VPN إلى التطبيقات. يسهّل هذا التغيير على التطبيقات رصد أحداث الاتصال بدون الحاجة إلى الجمع بين عمليات طلب البيانات المتزامنة وغير المتزامنة واستخدام واجهات برمجة تطبيقات محدودة. بالإضافة إلى ذلك، يعني ذلك أنّ نقل المعلومات يعمل على النحو المتوقّع عند توصيل جهاز بشبكات Wi-Fi متعددة أو شبكات جوّال متعددة في الوقت نفسه.

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

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

لمواصلة استخدام عميل 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).

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

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

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

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

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

استنشاق نوع MIME لملفات: معرّفات الموارد الموحّدة

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

يمكن أن يكون استخدام محتوى الملفات لاستنتاج أنواع 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، يتم إخفاء الإشعارات الواردة من التطبيقات المعلّقة إلى أن يتم استئناف التطبيق.