تغييرات السلوك: جميع التطبيقات

يتضمّن نظام التشغيل Android 16 تغييرات في السلوك قد تؤثر في تطبيقك. تنطبق تغييرات السلوك التالية على جميع التطبيقات عند تشغيلها على Android 16، بغض النظر عن targetSdkVersion. يجب اختبار تطبيقك ثم تعديله حسب الحاجة لتتوافق مع هذه التغييرات، حيثما ينطبق ذلك.

احرص أيضًا على مراجعة قائمة التغييرات في السلوك التي تؤثر فقط في التطبيقات التي تستهدف الإصدار 16 من Android.

الوظيفة الأساسية

يتضمّن الإصدار Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية التي تعدّل أو توسّع الإمكانات الأساسية المختلفة لنظام Android.

تحسينات الحصة في JobScheduler

Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:

  • Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
  • If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
  • If the job is executing while running a Foreground Service: in Android 16, jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.

This change impacts tasks scheduled using WorkManager, JobScheduler, and DownloadManager. To debug why a job was stopped, we recommend logging why your job was stopped by calling WorkInfo.getStopReason() (for JobScheduler jobs, call JobParameters.getStopReason()).

For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.

We also recommend leveraging the new JobScheduler#getPendingJobReasonsHistory API introduced in Android 16 to understand why a job has not executed.

Testing

To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.

To disable enforcement of "top state will adhere to job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

To disable enforcement of "jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

To test certain app standby bucket behavior, you can set the app standby bucket of your app using the following adb command:

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

To understand the app standby bucket your app is in, you can get the app standby bucket of your app using the following adb command:

adb shell am get-standby-bucket APP_PACKAGE_NAME

سبب إيقاف المهام الفارغة المهجورة

An abandoned job occurs when the JobParameters object associated with the job has been garbage collected, but JobService#jobFinished(JobParameters, boolean) has not been called to signal job completion. This indicates that the job may be running and being rescheduled without the app's awareness.

Apps that rely on JobScheduler, don't maintain a strong reference to the JobParameters object, and timeout will now be granted the new job stop reason STOP_REASON_TIMEOUT_ABANDONED, instead of STOP_REASON_TIMEOUT.

If there are frequent occurrences of the new abandoned stop reason, the system will take mitigation steps to reduce job frequency.

Apps should use the new stop reason to detect and reduce abandoned jobs.

If you're using WorkManager, AsyncTask, or DownloadManager, you aren't impacted because these APIs manage the job lifecycle on your app's behalf.

إيقاف الإصدار القديم من JobInfo#setImportantWhileForeground نهائيًا

تشير طريقة JobInfo.Builder#setImportantWhileForeground(boolean) إلى أهمية إحدى المهام عندما يكون تطبيق تحديد الموعد في المقدّمة أو عندما يتم إعفاؤه مؤقتًا من القيود المفروضة على التطبيقات التي تعمل في الخلفية.

تم إيقاف هذه الطريقة نهائيًا منذ الإصدار 12 من Android (المستوى 31 لواجهة برمجة التطبيقات). اعتبارًا من الإصدار Android 16، لم تعُد هذه الطريقة تعمل بفعالية، وسيتم تجاهل استدعاء هذه الطريقة.

تنطبق إزالة هذه الوظيفة أيضًا على JobInfo#isImportantWhileForeground(). بدءًا من الإصدار Android 16، إذا تم استدعاء الطريقة، ستُرجع الطريقة false.

لم يعُد نطاق أولوية البث المجدوَل عالميًا.

يُسمح لتطبيقات Android بتحديد الأولويات في أجهزة استقبال البث للتحكّم في الترتيب الذي تتلقّى به أجهزة الاستقبال البث وتعالجه. بالنسبة إلى تطبيقات معالجة الإشعارات المُعلَن عنها في البيان، يمكنها استخدام السمة android:priority لتحديد الأولوية، وبالنسبة إلى تطبيقات معالجة الإشعارات المسجَّلة في السياق، يمكنها استخدام واجهة برمجة التطبيقات IntentFilter#setPriority() لتحديد الأولوية. عند إرسال بث، يرسله النظام إلى المستلِمين حسب تصاعد أولويتهم، من الأعلى إلى الأدنى.

في الإصدار Android 16، لن يتم ضمان ترتيب إرسال البث باستخدام سمة android:priority أو IntentFilter#setPriority() في عمليات مختلفة. سيتم الالتزام بأولويات البث فقط في عملية التقديم نفسها وليس في جميع العمليات.

بالإضافة إلى ذلك، سيتم تلقائيًا حصر أولويات البث في النطاق (SYSTEM_LOW_PRIORITY + 1، SYSTEM_HIGH_PRIORITY - 1). سيتم السماح فقط لمكونات النظام بضبط SYSTEM_LOW_PRIORITY وSYSTEM_HIGH_PRIORITY كأولوية البث.

قد يتأثر تطبيقك إذا كان ينفّذ أيًا مما يلي:

  1. أعلن تطبيقك عن عمليات متعدّدة باستخدام نية البث نفسها، ولديه توقّعات بشأن تلقّي هذه النوايا بترتيب معين استنادًا إلى الأولوية.
  2. تتفاعل عملية تقديم الطلب مع عمليات أخرى وتتوقّع تلقّي نية بثّ بترتيب معيّن.

إذا كانت العمليات بحاجة إلى التنسيق مع بعضها، يجب أن تتواصل باستخدام قنوات تنسيق أخرى.

التغييرات الداخلية في ART

يتضمّن Android 16 أحدث التحديثات لنظام التشغيل Android Runtime (ART) التي تحسِّن أداء Android Runtime (ART) وتوفّر دعمًا لمزيد من ميزات Java. من خلال تحديثات نظام Google Play، تصبح هذه التحسينات متوفرة أيضًا لـ أكثر من مليار جهاز يعمل بالإصدار 12 من نظام Android (المستوى 31 من واجهة برمجة التطبيقات) والإصدارات الأحدث.

عند طرح هذه التغييرات، قد لا تعمل المكتبات ورموز التطبيقات التي تعتمد على البنى الداخلية لـ ART بشكل صحيح على الأجهزة التي تعمل بالإصدار 16 من Android، بالإضافة إلى إصدارات Android الأقدم التي تعمل على تحديث وحدة ART من خلال تحديثات نظام Google Play.

يمكن أن يؤدي الاعتماد على البنى الداخلية (مثل واجهات غير حِزم تطوير البرامج (SDK)) دائمًا إلى مشاكل في التوافق، ولكن من المهم بشكل خاص تجنُّب الاعتماد على الرموز البرمجية (أو المكتبات التي تحتوي على رموز برمجية) التي تستفيد من بنى ART الداخلية، لأنّ تغييرات ART لا تكون مرتبطة بإصدار النظام الذي يعمل عليه الجهاز وتصل إلى أكثر من مليار جهاز من خلال تحديثات نظام Google Play.

على جميع المطوّرين التحقّق مما إذا كان تطبيقاتهم متأثرة من خلال اختبارها بدقة على Android 16. بالإضافة إلى ذلك، يمكنك الاطّلاع على المشاكل المعروفة لتحديد ما إذا كان تطبيقك يعتمد على أي مكتبات رصدناها تعتمد بدورها على بنى ART الداخلية. إذا كان لديك رموز برمجية للتطبيقات أو مكتبات متأثرة ، ابحث عن بدائل لواجهات برمجة التطبيقات المتاحة للجميع كلما أمكن ذلك واطلِب واجهات برمجة التطبيقات المتاحة للجميع لحالات الاستخدام الجديدة من خلال إنشاء طلب ميزة في أداة تتبُّع الصعوبات.

وضع التوافق مع حجم الصفحة البالغ 16 كيلوبايت

وفّر الإصدار 15 من Android إمكانية استخدام صفحات ذاكرة بحجم 16 كيلوبايت لتحسين أداء المنصة. يضيف الإصدار 16 من Android وضع ملف شخصي متوافقًا، ما يسمح بتشغيل بعض التطبيقات المُنشأة لصفحات ذاكرة بحجم 4 كيلوبايت على جهاز تم ضبطه لصفحات ذاكرة بحجم 16 كيلوبايت.

عندما يكون تطبيقك قيد التشغيل على جهاز يعمل بنظام Android 16 أو إصدار أحدث، إذا رصد نظام Android أنّ تطبيقك يحتوي على صفحات ذاكرة بحجم 4 كيلوبايت، سيستخدم تلقائيًا وضع التوافق ويعرض مربّع حوار إشعار للمستخدم. سيؤدي ضبط سمة android:pageSizeCompat في AndroidManifest.xml لتفعيل وضع التوافق مع الإصدارات القديمة إلى منع عرض مربّع الحوار عند تشغيل تطبيقك. لاستخدام السمة android:pageSizeCompat، عليك تجميع تطبيقك باستخدام حزمة تطوير البرامج (SDK) لنظام التشغيل Android 16.

لتحقيق أفضل أداء وموثوقية وثبات، يجب أن يظل تطبيقك متوافقًا مع حجم الصفحة الذي يبلغ 16 كيلوبايت. يمكنك الاطّلاع على مزيد من التفاصيل في مقالتنا الأخيرة في المدونة التي تتناول تحديث تطبيقاتك لتتوافق مع صفحات الذاكرة التي تبلغ سعة كل منها 16 كيلوبايت.

مربّع حوار وضع التوافق الذي يظهر عندما يرصد النظام أنّه يمكن تشغيل تطبيق مُحاذَى بحجم 4 كيلوبايت بشكلٍ أفضل إذا تم محاذاة 16 كيلوبايت.

تجربة المستخدم وواجهة المستخدم للنظام

يتضمّن الإصدار 16 من Android (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية التي تهدف إلى توفير تجربة مستخدم أكثر اتساقًا وسهولة.

إيقاف إعلانات إمكانية الوصول المزعجة نهائيًا

يوقف نظام التشغيل Android 16 نهائيًا إعلانات تسهيل الاستخدام التي تتميز باستخدام announceForAccessibility أو إرسال TYPE_ANNOUNCEMENT أحداث تسهيل الاستخدام. ويمكن أن تؤدي هذه العناصر إلى اختلاف تجربتَي المستخدمين في TalkBack وقارئ شاشة Android، وتعمل العناصر البديلة بشكل أفضل على تلبية مجموعة أوسع من احتياجات المستخدمين في مجموعة متنوعة من التكنولوجيات المساعِدة في Android.

أمثلة على الحلول البديلة:

تتضمّن المستندات المرجعية لواجهة برمجة التطبيقات announceForAccessibility المتوقّفة نهائيًا مزيدًا من التفاصيل حول البدائل المقترَحة.

إتاحة وضع "التنقّل باستخدام ثلاثة أزرار"

Android 16 brings predictive back support to the 3-button navigation for apps that have properly migrated to predictive back. Long-pressing the back button initiates a predictive back animation, giving you a preview of where the back swipe takes you.

This behavior applies across all areas of the system that support predictive back animations, including the system animations (back-to-home, cross-task, and cross-activity).

The predictive back animations in 3-button navigation mode.

أشكال الأجهزة

يتضمّن الإصدار Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية على التطبيقات عند عرضها على الشاشات من قِبل مالكي الأجهزة الافتراضية.

عمليات إلغاء مالك الجهاز الافتراضي

مالك الجهاز الافتراضي هو تطبيق موثوق به أو مميّز ينشئ ويدير جهازًا افتراضيًا. يشغِّل مالكو الأجهزة الافتراضية التطبيقات على جهاز افتراضي ثم يُعرِضون التطبيقات على شاشة جهاز بعيد، مثل كمبيوتر شخصي أو جهاز واقع افتراضي أو نظام معلومات ترفيهية في السيارة. يكون مالك الجهاز الافتراضي على جهاز محلي، مثل هاتف جوّال.

ينشئ مالك الجهاز الافتراضي على الهاتف جهازًا افتراضيًا يعرض التطبيق على شاشة جهاز التحكّم عن بُعد.

عمليات إلغاء الإعدادات لكل تطبيق

على الأجهزة التي تعمل بإصدار Android 16 (المستوى 36 لواجهة برمجة التطبيقات)، يمكن لمالكي الأجهزة الافتراضية تجاوز إعدادات التطبيقات على أجهزة افتراضية محدّدة يديرها أصحاب الأجهزة الافتراضية. على سبيل المثال، لتحسين تنسيق التطبيق، يمكن لمالك الجهاز الافتراضي تجاهل القيود المفروضة على الاتجاه ونسبة العرض إلى الارتفاع وإمكانية تغيير الحجم عند بث التطبيقات على شاشة خارجية.

التغييرات الشائعة التي قد تؤدي إلى حدوث أعطال

قد يؤثر سلوك Android 16 في واجهة مستخدم تطبيقك على شاشات كبيرة، مثل شاشات السيارات أو أجهزة Chromebook، خاصةً التنسيقات التي تم تصميمها للشاشات الصغيرة في الوضع العمودي. للتعرّف على كيفية جعل تطبيقك متوافقًا مع جميع أشكال الأجهزة، اطّلِع على لمحة عن التنسيقات المتوافقة.

المراجع

بث التطبيقات المصاحبة

الأمان

يتضمّن الإصدار 16 من Android (المستوى 36 لواجهة برمجة التطبيقات) تغييرات تعزّز أمان النظام بهدف المساعدة في حماية التطبيقات والمستخدمين من التطبيقات الضارّة.

أمان محسَّن ضد هجمات إعادة التوجيه المستندة إلى الأهداف

Android 16 provides default security against general Intent redirection attacks, with minimum compatibility and developer changes required.

We are introducing by-default security hardening solutions to Intent redirection exploits. In most cases, apps that use intents normally won't experience any compatibility issues; we've gathered metrics throughout our development process to monitor which apps might experience breakages.

Intent redirection in Android occurs when an attacker can partly or fully control the contents of an intent used to launch a new component in the context of a vulnerable app, while the victim app launches an untrusted sub-level intent in an extras field of an ("top-level") Intent. This can lead to the attacker app launching private components in the context of the victim app, triggering privileged actions, or gaining URI access to sensitive data, potentially leading to data theft and arbitrary code execution.

Opt out of Intent redirection handling

Android 16 introduces a new API that allows apps to opt out of launch security protections. This might be necessary in specific cases where the default security behavior interferes with legitimate app use cases.

For applications compiling against Android 16 (API level 36) SDK or higher

You can directly use the removeLaunchSecurityProtection() method on the Intent object.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
For applications compiling against Android 15 (API level 35) or lower

While not recommended, you can use reflection to access the removeLaunchSecurityProtection() method.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
    val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
    removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
    // Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }

إمكانية الاتصال

يتضمّن الإصدار 16 من Android (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية في حِزمة البلوتوث لتحسين إمكانية الاتصال بالأجهزة الطرفية.

معالجة محسّنة لخسارة الضمان

Starting in Android 16, the Bluetooth stack has been updated to improve security and user experience when a remote bond loss is detected. Previously, the system would automatically remove the bond and initiate a new pairing process, which could lead to unintentional re-pairing. We have seen in many instances apps not taking care of the bond loss event in a consistent way.

To unify the experience, Android 16 improved the bond loss handling to the system. If a previously bonded Bluetooth device could not be authenticated upon reconnection, the system will disconnect the link, retain local bond information, and display a system dialog informing users of the bond loss and directing them to re-pair.