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

يتضمّن نظام التشغيل 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

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

如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters, boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。

依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT

如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。

应用应使用新的停止原因来检测和减少被废弃的作业。

如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。

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

JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。

此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 false

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

Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority 属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority() API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。

在 Android 16 中,无法保证使用 android:priority 属性或 IntentFilter#setPriority() 在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。

此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITYSYSTEM_HIGH_PRIORITY 设置为广播优先级。

如果您的应用执行以下任一操作,可能会受到影响:

  1. 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
  2. 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。

如果进程需要相互协调,则应使用其他协调渠道进行通信。

التغييرات الداخلية في 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 أنّ تطبيقك يتضمّن صفحات ذاكرة بحجم 4 كيلوبايت، فإنه يستخدِم تلقائيًا وضع التوافق ويعرض مربع حوار إشعار للمستخدم. سيؤدي ضبط سمة android:pageSizeCompat في AndroidManifest.xml لتفعيل وضع التوافق مع الإصدارات القديمة إلى منع عرض المربّع الحواري عند تشغيل تطبيقك. لتحقيق أفضل أداء وموثوقية وثبات، يجب أن يظل تطبيقك متوافقًا مع حجم الصفحة الذي يبلغ 16 كيلوبايت. يمكنك الاطّلاع على مزيد من التفاصيل في مشاركة المدونة الأخيرة التي نشرناها حول تحديث تطبيقاتك لتتوافق مع صفحات الذاكرة التي تبلغ سعة كل صفحة منها 16 كيلوبايت.

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

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

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

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

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

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

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

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

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

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

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

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

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

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

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

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

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

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

المراجع

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

الأمان

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

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

يقدّم نظام التشغيل Android 16 أمانًا تلقائيًا ضد هجمات Intent إعادة التوجيه العامة، مع الحد الأدنى من التوافق والتغييرات المطلوبة للمطوّرين.

نحن بصدد تقديم حلول تحصين الأمان بشكل تلقائي لمنع Intent عمليات استغلال إعادة التوجيه. في معظم الحالات، لن تواجه التطبيقات التي تستخدم النوايا عادةً أي مشاكل في التوافق. لقد جمعنا المقاييس طوال عملية تطوير التطبيقات بهدف رصد التطبيقات التي قد تواجه مشاكل.

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

إيقاف معالجة إعادة التوجيه المستندة إلى النيّة

يقدّم نظام التشغيل Android 16 واجهة برمجة تطبيقات جديدة تتيح للتطبيقات إيقاف ميزات أمان الإطلاق. قد يكون ذلك ضروريًا في حالات معيّنة يتداخل فيها سلوك أمان الإعدادات التلقائية مع حالات الاستخدام المشروعة للتطبيق.

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

يمكنك استخدام الطريقة removeLaunchSecurityProtection() مباشرةً في عنصر Intent.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
بالنسبة إلى التطبيقات التي يتم تجميعها لنظام التشغيل Android 15 (المستوى 35 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم

على الرغم من أنّه لا يُنصح بذلك، يمكنك استخدام ميزة "العرض" للوصول إلى الطريقة removeLaunchSecurityProtection().

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 من واجهة برمجة التطبيقات) التغييرات التالية في حِزمة البلوتوث لتحسين إمكانية الاتصال بالأجهزة الطرفية.

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

从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。

为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。