التغييرات في السلوك: التطبيقات التي تستهدف الإصدار 29 من واجهة برمجة التطبيقات أو الإصدارات الأحدث

يتضمن 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).

الذكريات المشتركة

لقد غيّر "أشميم" تنسيق خرائط "دالفيك" في /proc/<pid>/maps، مما يؤثر في التطبيقات التي تحلّل ملف الخرائط مباشرةً. يجب على مطوّري التطبيقات اختبار تنسيق /proc/<pid>/maps على الأجهزة التي تعمل بنظام التشغيل Android 10 أو الإصدارات الأحدث وتحليله وفقًا لذلك إذا كان التطبيق يعتمد على تنسيقات خرائط sitemap.

ولا يمكن للتطبيقات التي تستهدف الإصدار Android 10 استخدام 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 التي أنشأها النظام.

فرض صحة AOT في ART

في السابق، كان التجميع في وقت مبكر (AOT) الذي يُجريه "وقت تشغيل Android" (ART) إلى حدوث أعطال في وقت التشغيل إذا لم تكن بيئة مسار الفئة هي نفسها في وقت التجميع ووقت التشغيل. يتطلّب نظام التشغيل Android 10 والإصدارات الأحدث دائمًا أن تكون سياقات البيئة هذه متطابقة، ما يؤدي إلى حدوث التغييرات التالية في السلوك:

  • لا يتم تجميع أدوات تحميل الفئات المخصَّصة، أي محمّلات الفئات التي أنشأتها التطبيقات، على عكس أدوات تحميل الفئات من حزمة dalvik.system. وهذا لأنه لا يمكن لـ ART معرفة التنفيذ المخصص للبحث عن الفئة في وقت التشغيل.
  • يتم تجميع ملفات dex الثانوية، أي ملفات dex التي يتم تحميلها يدويًا من خلال تطبيقات ليست في حزمة APK الأساسية، في الخلفية بطريقة AOT. والسبب في ذلك هو أنّ تحويل المحتوى للمرة الأولى قد يكون مكلفًا جدًا، ما يؤدي إلى وقت استجابة غير مرغوب فيه قبل التنفيذ. تجدر الإشارة إلى أنّه يُنصح باستخدام التقسيمات والابتعاد عن ملفات 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 في Android 10 (المستوى 29 من واجهة برمجة التطبيقات) أو إصدار أحدث، قد يتم ضبطه في وضع التوافق عند تغيُّر حجم الشاشة المتاح أو في حال انتقال التطبيق من شاشة إلى أخرى.

يمكن للتطبيقات استخدام السمة android:minAspectRatio المتوفّرة في نظام التشغيل Android 10 للإشارة إلى نِسب الشاشة التي يتوافق معها تطبيقك.

بدءًا من الإصدار 3.5، تم تزويد أداة المحاكي في "استوديو Android" بأجهزة افتراضية بمقاسَين 7.3 و8 بوصة لاختبار الرمز البرمجي على شاشات أكبر.

لمزيد من المعلومات، يمكنك الاطّلاع على مقالة تصميم تطبيقاتك للأجهزة القابلة للطي.