يتضمّن Android 10 تغييرات محدَّثة في سلوك النظام قد تؤثّر في تطبيقك.
تنطبق التغييرات المدرَجة في هذه الصفحة حصريًا على التطبيقات التي تستهدف
المستوى 29 من واجهة برمجة التطبيقات أو المستويات الأعلى. إذا كان تطبيقك يضبط السمة targetSdkVersion على "29" أو قيمة أعلى، عليك تعديل تطبيقك ليتوافق مع هذه السلوكيات بشكل صحيح، حيثما ينطبق ذلك.
يُرجى أيضًا مراجعة قائمة التغييرات في السلوك التي تؤثر في جميع التطبيقات التي تعمل على Android 10.
ملاحظة: بالإضافة إلى التغييرات المدرَجة في هذه الصفحة، يقدّم Android 10 عددًا كبيرًا من التغييرات والقيود المستندة إلى الخصوصية، بما في ذلك ما يلي:
- تخزين فرعي
- الوصول إلى الرقم التسلسلي لجهاز USB
- إمكانية تفعيل Wi-Fi وإيقافها وضبطها
- أذونات تحديد الموقع الجغرافي لواجهات برمجة التطبيقات الخاصة بإمكانية الاتصال
هذه التغييرات التي تؤثر في التطبيقات التي تستهدف المستوى 29 أو أعلى من واجهة برمجة التطبيقات، تعزّز خصوصية المستخدم. لمزيد من المعلومات حول كيفية دعم هذه التغييرات، يُرجى الاطّلاع على صفحة تغييرات الخصوصية.
تعديلات على القيود المفروضة على الواجهات غير المضمّنة في حزمة تطوير البرامج (SDK)
للمساعدة في ضمان ثبات التطبيق والتوافق، بدأت المنصة في فرض قيود على الواجهات غير المضمّنة في حزمة تطوير البرامج (SDK) التي يمكن لتطبيقك استخدامها في الإصدار Android 9 (مستوى واجهة برمجة التطبيقات 28). يتضمّن Android 10 قوائم معدَّلة لواجهات غير حزمة تطوير البرامج (SDK) المحظورة استنادًا إلى التعاون مع مطوّري برامج Android وأحدث الاختبارات الداخلية. هدفنا هو التأكّد من توفّر بدائل عامة قبل حظر الواجهات غير المتوفّرة في حزمة SDK.
إذا لم تكن تستهدف الإصدار Android 10 (المستوى 29 لواجهة برمجة التطبيقات)، قد لا تؤثر بعض هذه التغييرات فيك على الفور. ومع ذلك، على الرغم من أنّه يمكنك حاليًا استخدام بعض الواجهات غير المتوفّرة في حزمة SDK (وفقًا لمستوى واجهة برمجة التطبيقات المستهدَف في تطبيقك)، فإنّ استخدام أي طريقة أو حقل غير متوفّر في حزمة SDK ينطوي دائمًا على مخاطرة كبيرة بتعطُّل تطبيقك.
إذا لم تكن متأكدًا مما إذا كان تطبيقك يستخدم واجهات غير متوفّرة في حزمة SDK، يمكنك اختبار تطبيقك لمعرفة ذلك. إذا كان تطبيقك يعتمد على واجهات غير متوفّرة في حزمة SDK، عليك البدء في التخطيط للانتقال إلى بدائل حزمة SDK. ومع ذلك، ندرك أنّ بعض التطبيقات لديها حالات استخدام صالحة لاستخدام واجهات غير حِزم تطوير البرامج (SDK). إذا لم تتمكّن من العثور على بديل لاستخدام واجهة غير متوفّرة في حزمة SDK لميزة في تطبيقك، عليك طلب واجهة برمجة تطبيقات عامة جديدة.
لمزيد من المعلومات، يُرجى الاطّلاع على التعديلات على القيود المفروضة على الواجهات غير المتوفّرة في حزمة SDK في Android 10 والقيود المفروضة على الواجهات غير المتوفّرة في حزمة SDK.
الذاكرة المشتركة
غيّر Ashmem تنسيق خرائط dalvik في /proc/<pid>/maps، ما يؤثر في التطبيقات التي تحلّل ملف الخرائط مباشرةً. على مطوّري التطبيقات اختبار تنسيق /proc/<pid>/maps على الأجهزة التي تعمل بنظام التشغيل Android 10 أو الإصدارات الأحدث وتحليله وفقًا لذلك إذا كان التطبيق يعتمد على تنسيقات خرائط Dalvik.
لا يمكن للتطبيقات التي تستهدف الإصدار Android 10 استخدام ashmem مباشرةً
(/dev/ashmem)، وعليها بدلاً من ذلك الوصول إلى الذاكرة المشتركة من خلال فئة
ASharedMemory في NDK.
بالإضافة إلى ذلك، لا يمكن للتطبيقات إجراء عمليات IOCTL مباشرةً على واصِفات ملفات ashmem الحالية، وعليها بدلاً من ذلك استخدام فئة ASharedMemory في NDK أو واجهات برمجة تطبيقات Java في Android لإنشاء مناطق ذاكرة مشتركة. يؤدي هذا التغيير إلى زيادة الأمان
والقوة عند العمل باستخدام الذاكرة المشتركة، ما يحسّن أداء وأمان
نظام Android بشكل عام.
تمت إزالة إذن التنفيذ لدليل الصفحة الرئيسية للتطبيق
يُعدّ تنفيذ الملفات من دليل الصفحة الرئيسية للتطبيق القابل للكتابة انتهاكًا لسياسة W^X. يجب ألا تحمّل التطبيقات سوى الرمز الثنائي المضمّن في ملف APK الخاص بالتطبيق.
لا يمكن للتطبيقات غير الموثوق بها التي تستهدف الإصدار Android 10 استدعاء execve()
مباشرةً على الملفات داخل الدليل الرئيسي للتطبيق.
بالإضافة إلى ذلك، لا يمكن للتطبيقات التي تستهدف الإصدار 10 من نظام التشغيل Android تعديل الرمز البرمجي القابل للتنفيذ في الذاكرة من الملفات التي تم فتحها باستخدام dlopen() وتوقُّع كتابة هذه التغييرات على القرص، لأنّه لا يمكن ربط المكتبة PROT_EXEC من خلال واصِف ملف قابل للكتابة. ويشمل ذلك أي ملفات كائنات مشتركة (.so) تتضمّن عمليات نقل نصية.
لا يقبل وقت تشغيل Android سوى ملفات OAT التي ينشئها النظام
لم يعُد وقت تشغيل Android (ART) يستدعي dex2oat من عملية التطبيق. يعني هذا التغيير أنّ وقت تشغيل Android سيقبل فقط ملفات OAT التي أنشأها النظام.
فرض صحة AOT في 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 لإعطاء أولوية أعلى للأنشطة التي تفاعل معها المستخدم مؤخرًا. يمكن أن يكون النشاط مستأنفًا في المقدّمة، ولكنّه لا يحظى بالتركيز (على سبيل المثال، إذا كان مركز الإشعارات موسّعًا).
في الإصدار 10 من نظام التشغيل Android (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك الاشتراك في دالة الاستدعاء
onTopResumedActivityChanged()
ليتم إعلامك عندما يكتسب نشاطك الموضع الأعلى في قائمة الأنشطة المستأنفة أو يفقده. وهذا يعادل حالة الاستئناف قبل الإصدار Android 10 ويمكن أن يكون مفيدًا كتلميح إذا كان تطبيقك يستخدم موارد حصرية أو أحادية قد تحتاج إلى مشاركتها مع تطبيقات أخرى.
تم أيضًا تغيير سلوك سمة البيان
resizeableActivity. إذا ضبط أحد التطبيقات السمة resizeableActivity=false في الإصدار Android 10 (مستوى واجهة برمجة التطبيقات 29) أو الإصدارات الأحدث، قد يتم وضعه في وضع التوافق عند تغيُّر حجم الشاشة المتاح أو عند نقل التطبيق من شاشة إلى أخرى.
يمكن للتطبيقات استخدام السمة
android:minAspectRatio
التي تم تقديمها في Android 10 للإشارة إلى نسب الشاشة التي يتيحها تطبيقك.
بدءًا من الإصدار 3.5، تتضمّن أداة المحاكي في استوديو Android أجهزة افتراضية بمقاس 7.3 بوصة و8 بوصة لاختبار الرمز البرمجي على شاشات أكبر.
لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تصميم تطبيقاتك للأجهزة القابلة للطي.