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

يتضمّن الإصدار 10 من نظام التشغيل Android تغييرات معدَّلة في سلوك النظام قد تؤثّر في تطبيقك. تسري التغييرات المذكورة في هذه الصفحة حصريًا على التطبيقات التي تستهدف الإصدار 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 تنسيق خرائط دالفيك في /proc/<pid>/maps، يؤثر في التطبيقات التي تحلّل ملف الخرائط مباشرةً. على مطوّري التطبيقات اختبار تنسيق ‎/proc/<pid>/maps على الأجهزة التي تعمل بالإصدار Android 10 أو إصدار أحدث وتحليله وفقًا لذلك إذا كان التطبيق يعتمد على تنسيقات ملفّات ‎dalvik.

لا يمكن للتطبيقات التي تستهدف الإصدار 10 من Android استخدام ashmem (‎/dev/ashmem) مباشرةً، بل يجب أن تصل إلى الذاكرة المشتركة من خلال ASharedMemory class في حزمة 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 من التطبيق الدفع. يعني هذا التغيير أن ART لن تقبل سوى ملفات OAT التي التي أنشأها النظام.

فرض صحة AOT في ART

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

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

تغييرات الأذونات لطلبات العرض ملء الشاشة

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

إذا حاول أحد التطبيقات التي تستهدف Android 10 أو الإصدارات الأحدث إنشاء إشعار بالعرض ملء الشاشة بدون طلب المعلومات اللازمة يتجاهل النظام الإذن بملء الشاشة ويعرض ما يلي: رسالة السجل:

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

التوافق مع الأجهزة القابلة للطي

يشمل نظام Android 10 تغييرات تتوافق مع الأجهزة القابلة للطي والأجهزة ذات الشاشات الكبيرة.

عند تشغيل تطبيق على نظام التشغيل Android 10، onResume() و طريقة عمل onPause() بشكل مختلف. عند ظهور عدة تطبيقات في الوقت نفسه من خلال النوافذ المتعددة أو وضع العرض المتعدّد، وأبرز الأنشطة التي يمكن التركيز عليها في الحزم المرئية في حالة استئنافها، ولكن أحدهما فقط هو "الأعلى استئنافًا" النَّشَاطْ التركيز بالفعل. عند تشغيل التطبيق على إصدارات أقدم من Android 10، يمكن استئناف نشاط فردي في النظام في وقت واحد، الأنشطة متوقفة مؤقتًا.

لا تخلط بين "التركيز" يعرض الخيار "أعلى معدّل استئناف" الأخرى. يعيّن النظام الأولويات للأنشطة على أساس ترتيب z لإعطاء أولوية أعلى الأنشطة التي تفاعل معها المستخدم في النهاية. يمكن إعادة عرض النشاط في المقدّمة، ولكن بدون التركيز عليه (على سبيل المثال، إذا كان مربّع إشعارات Android موسّعًا).

في نظام التشغيل Android 10 (المستوى 29 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك الاشتراك في onTopResumedActivityChanged() معاودة الاتصال ليتم إرسال إشعار إليك عند استعادة نشاطك لأقصى حد يتم استئنافه أو عند فقدانه الموقع. هذه الحالة تعادل حالة الاستئناف قبل Android 10 وقد تكون مفيدة كتلميح إذا كان تطبيقك يستخدم موارد حصرية أو موارد فردية قد تحتاج إلى لمشاركته مع تطبيقات أخرى.

تم أيضًا تغيير سلوك سمة البيان resizeableActivity . إذا ضبط أحد التطبيقات resizeableActivity=false في نظام التشغيل Android 10 (المستوى 29 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، قد يتم ضبطه في وضع التوافق. عند تغير حجم الشاشة المتاح، أو إذا انتقل التطبيق من شاشة إلى البعض

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

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

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