يتضمّن نظام التشغيل Android 10 تغييرات معدَّلة في سلوك النظام قد تؤثّر في تطبيقك،
وتنطبق التغييرات المدرَجة في هذه الصفحة حصريًا على التطبيقات التي تستهدف
المستوى 29 من واجهة برمجة التطبيقات أو المستويات الأعلى. إذا كان تطبيقك يضبط قيمة targetSdkVersion
على "29" أو أعلى، عليك تعديل تطبيقك ليتوافق مع هذه السلوكيات بشكل صحيح، حيثما ينطبق ذلك.
احرص أيضًا على مراجعة قائمة التغييرات في السلوك التي تؤثّر في جميع التطبيقات التي تعمل على نظام التشغيل Android 10.
ملاحظة: بالإضافة إلى التغييرات الواردة في هذه الصفحة، يقدّم نظام التشغيل Android 10 عددًا كبيرًا من التغييرات والقيود المستندة إلى الخصوصية، بما في ذلك ما يلي:
- التخزين المحصور النطاق
- الوصول إلى الرقم التسلسلي لجهاز USB
- إمكانية تفعيل شبكة Wi-Fi وإيقافها وإعدادها
- أذونات تحديد الموقع الجغرافي لواجهات برمجة التطبيقات المتعلقة بالاتصال
تؤثّر هذه التغييرات في التطبيقات التي تستهدف المستوى 29 أو أعلى من واجهة برمجة التطبيقات، وهي تهدف إلى تعزيز خصوصية المستخدمين. لمزيد من المعلومات حول كيفية دعم هذه التغييرات، يُرجى الاطّلاع على صفحة تغييرات الخصوصية.
تعديلات على القيود المفروضة على الواجهات غير المتوفرة في حزمة SDK
للمساعدة في ضمان ثبات التطبيق وتوافقه، بدأت المنصة في فرض قيود على واجهات برمجة التطبيقات غير التابعة لحزمة SDK التي يمكن لتطبيقك استخدامها في Android 9 (المستوى 28 من واجهة برمجة التطبيقات). يتضمّن نظام التشغيل Android 10 قوائم معدَّلة بواجهات غير حِزمات SDK المحظورة استنادًا إلى التعاون مع مطوّري تطبيقات Android وأحدث الاختبارات الداخلية. هدفنا هو التأكّد من توفّر بدائل عامة قبل أن نحظر الواجهات غير المتوفّرة في حزمة SDK.
إذا كنت لا تستهدف الإصدار 10 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات)، قد لا تؤثر بعض هذه التغييرات فيك على الفور. ومع ذلك، على الرغم من أنّه يمكنك حاليًا استخدام بعض الواجهات غير التابعة لحزمة SDK (حسب مستوى واجهة برمجة التطبيقات المستهدَف في تطبيقك)، فإنّ استخدام أي طريقة أو حقل غير تابع لحزمة SDK ينطوي دائمًا على خطر كبير بتعطُّل تطبيقك.
إذا لم تكن متأكدًا مما إذا كان تطبيقك يستخدم واجهات غير متوفرة في حزمة SDK، يمكنك اختبار تطبيقك لمعرفة ذلك. إذا كان تطبيقك يعتمد على واجهات غير متوفرة في حزمة SDK، عليك البدء في التخطيط لنقل البيانات إلى بدائل لحزمة SDK. ومع ذلك، ندرك أنّ بعض التطبيقات لديها حالات استخدام صالحة لواجهات غير متوفرة في حزمة SDK. إذا لم تتمكّن من العثور على بديل لاستخدام واجهة غير متوفرة في حزمة SDK لإحدى الميزات في تطبيقك، عليك طلب واجهة برمجة تطبيقات عامة جديدة.
لمزيد من المعلومات، اطّلِع على التعديلات على القيود المفروضة على الواجهات غير المتوفّرة في حزمة SDK في نظام التشغيل Android 10 والقيود المفروضة على الواجهات غير المتوفّرة في حزمة SDK.
الذاكرة المشترَكة
غيّرت Ashmem تنسيق خرائط Dalvik في /proc/<pid>/maps، ما يؤثر في التطبيقات التي تحلّل ملف الخرائط مباشرةً. على مطوّري التطبيقات اختبار تنسيق /proc/<pid>/maps على الأجهزة التي تعمل بالإصدار 10 من نظام التشغيل Android أو إصدار أحدث، وتحليله وفقًا لذلك إذا كان التطبيق يعتمد على تنسيقات خرائط Dalvik.
لا يمكن للتطبيقات التي تستهدف الإصدار 10 من نظام التشغيل Android استخدام ashmem (/dev/ashmem) مباشرةً، بل يجب بدلاً من ذلك الوصول إلى الذاكرة المشتركة من خلال فئة ASharedMemory
في حزمة تطوير البرامج الأصلية (NDK).
بالإضافة إلى ذلك، لا يمكن للتطبيقات إجراء عمليات IOCTL مباشرة على واصفات ملفات ashmem الحالية، ويجب بدلاً من ذلك استخدام إما فئة ASharedMemory
في NDK أو واجهات برمجة تطبيقات Android Java لإنشاء مناطق ذاكرة مشتركة. يؤدي هذا التغيير إلى زيادة مستوى الأمان
والثبات عند استخدام الذاكرة المشتركة، ما يحسّن الأداء والأمان
في نظام Android بشكل عام.
تمت إزالة إذن التنفيذ لدليل الصفحة الرئيسية للتطبيق
يُعد تنفيذ الملفات من دليل الصفحة الرئيسية للتطبيق القابل للكتابة انتهاكًا لقاعدة W^X. يجب ألا تحمّل التطبيقات سوى الرمز الثنائي المضمّن في ملف APK الخاص بالتطبيق.
لا يمكن للتطبيقات غير الموثوق بها التي تستهدف الإصدار 10 من نظام التشغيل Android استدعاء execve()
مباشرةً على الملفات ضِمن دليل الصفحة الرئيسية للتطبيق.
بالإضافة إلى ذلك، لا يمكن للتطبيقات التي تستهدف الإصدار 10 من نظام التشغيل Android تعديل الرمز التنفيذي في الذاكرة من الملفات التي تم فتحها باستخدام dlopen()
وتوقُّع كتابة هذه التغييرات على القرص، لأنّه لا يمكن ربط المكتبة PROT_EXEC
من خلال واصف ملف قابل للكتابة. ويشمل ذلك أي ملفات
عناصر مشترَكة (.so
) تتضمّن عمليات نقل نصية.
لا يقبل وقت تشغيل Android إلا ملفات OAT التي ينشئها النظام
لم يعُد وقت تشغيل Android (ART) يستدعي dex2oat
من عملية التطبيق. يعني هذا التغيير أنّ ART لن يقبل سوى ملفات OAT التي أنشأها النظام.
فرض صحة الترجمة مسبقًا في "وقت تشغيل Android" (ART)
في السابق، كان التجميع المسبق (AOT) الذي يتم تنفيذه بواسطة وقت تشغيل Android (ART) قد يتسبّب في حدوث أعطال أثناء وقت التشغيل إذا لم تكن بيئة مسار الفئة هي نفسها في وقت التجميع ووقت التشغيل. يتطلّب الإصدار 10 من نظام التشغيل Android والإصدارات الأحدث دائمًا أن تكون سياقات البيئة هذه متطابقة، ما يؤدي إلى حدوث تغييرات في السلوك على النحو التالي:
- لا يتم تجميع أدوات تحميل الفئات المخصّصة، أي أدوات تحميل الفئات التي تكتبها التطبيقات، على عكس أدوات تحميل الفئات من حزمة
dalvik.system
، باستخدام التجميع المسبق (AOT). ويرجع ذلك إلى أنّ ART لا يمكنه معرفة عملية البحث المخصّصة عن الفئات في وقت التشغيل. - يتم تجميع ملفات DEX الثانوية، أي ملفات DEX التي يتم تحميلها يدويًا بواسطة التطبيقات غير الموجودة في حزمة APK الأساسية، مسبقًا (AOT) في الخلفية. ويرجع ذلك إلى أنّ عملية الترجمة عند الاستخدام الأول قد تكون مكلفة للغاية، ما يؤدي إلى حدوث تأخير غير مرغوب فيه قبل التنفيذ. يُرجى العِلم أنّه يُنصح باستخدام حِزم APK مقسّمة للتطبيقات والتوقّف عن استخدام ملفات dex الثانوية.
- يتم تنفيذ المكتبات المشترَكة في نظام التشغيل Android (الإدخالات <library> و<uses-library> في ملف بيان Android) باستخدام تسلسل هرمي مختلف لأداة تحميل الفئات عن التسلسل الهرمي المستخدَم في الإصدارات السابقة من النظام الأساسي.
تغييرات على أذونات العرض ملء الشاشة
يجب أن تطلب التطبيقات التي تستهدف الإصدار 10 من نظام التشغيل Android أو الإصدارات الأحدث وتستخدم الإشعارات مع النوايا بملء الشاشة الإذن USE_FULL_SCREEN_INTENT
في ملف البيان الخاص بالتطبيق. هذا إذن عادي، لذا يمنحه النظام تلقائيًا للتطبيق الذي يطلب الإذن.
إذا حاول تطبيق يستهدف الإصدار 10 من نظام التشغيل Android أو إصدارًا أحدث إنشاء إشعار باستخدام إذن بالعرض ملء الشاشة بدون طلب الإذن اللازم، سيتجاهل النظام الإذن بالعرض ملء الشاشة ويعرض رسالة السجلّ التالية:
Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission
التوافق مع الأجهزة القابلة للطي
يتضمّن نظام التشغيل Android 10 تغييرات تتوافق مع الأجهزة القابلة للطي والأجهزة ذات الشاشات الكبيرة.
عند تشغيل تطبيق على نظام التشغيل Android 10، تعمل الطريقتان
onResume()
و
onPause()
بشكل مختلف. عندما تظهر تطبيقات متعددة في الوقت نفسه في وضع النوافذ المتعددة أو وضع الشاشات المتعددة، تكون جميع الأنشطة العلوية القابلة للتركيز في الحِزم المرئية في حالة "استئناف"، ولكن يركّز النظام على أحدها فقط، وهو النشاط "الأعلى الذي تم استئنافه". عند التشغيل على إصدارات أقدم من Android 10، لا يمكن استئناف سوى نشاط واحد في النظام في كل مرة، ويتم إيقاف جميع الأنشطة الأخرى المرئية مؤقتًا.
لا تخلط بين "التركيز" والنشاط "الأعلى الذي تم استئنافه". يحدّد النظام أولويات الأنشطة استنادًا إلى ترتيبها حسب المحور z، وذلك لمنح أولوية أعلى للأنشطة التي تفاعل معها المستخدم مؤخرًا. يمكن استئناف نشاط في المقدّمة، ولكن بدون التركيز عليه (على سبيل المثال، إذا تم توسيع لوحة الإشعارات).
في نظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك الاشتراك في
onTopResumedActivityChanged()
للرجوع
إلى الصفحة السابقة لتلقّي إشعار عندما يكتسب نشاطك أو يفقد موضع الاستئناف في أعلى الشاشة. وهذه الحالة هي نفسها حالة "تمت استئناف النشاط" قبل الإصدار Android 10، ويمكن أن تكون مفيدة
كتلميح إذا كان تطبيقك يستخدم موارد حصرية أو موارد ذات مثيل واحد قد تحتاج إلى
مشاركتها مع تطبيقات أخرى.
تغيّر أيضًا سلوك سمة ملف البيان
resizeableActivity
. إذا ضبط أحد التطبيقات قيمة
resizeableActivity=false
في الإصدار 10 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، قد يتم وضعه في وضع التوافق
عندما يتغير حجم الشاشة المتاح، أو إذا تم نقل التطبيق من شاشة إلى
أخرى.
يمكن للتطبيقات استخدام السمة
android:minAspectRatio
،
التي تم طرحها في نظام التشغيل Android 10، للإشارة إلى نسب الشاشة التي يتوافق معها تطبيقك.
بدءًا من الإصدار 3.5، تتضمّن أداة المحاكي في Android Studio أجهزة افتراضية بحجم 7.3 بوصة و8 بوصات لاختبار الرمز على شاشات أكبر.
لمزيد من المعلومات، اطّلِع على مقالة تصميم تطبيقاتك للأجهزة القابلة للطي.