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

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

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

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

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

تحسينات حصص JobScheduler

اعتبارًا من Android 16، سنعدّل حصة وقت التشغيل المخصّصة لتنفيذ المهام العادية والمستعجلة استنادًا إلى العوامل التالية:

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

يؤثّر هذا التغيير في المهام المُجدوَلة باستخدام WorkManager وJobScheduler وDownloadManager. لتحديد سبب إيقاف مهمة، ننصح بتسجيل سبب إيقاف مهمتك من خلال استدعاء WorkInfo.getStopReason() (بالنسبة إلى مهام JobScheduler، استدعِ JobParameters.getStopReason()).

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

ننصحك أيضًا بالاستفادة من واجهة برمجة التطبيقات الجديدة JobScheduler#getPendingJobReasonsHistory التي تم طرحها في Android 16 لمعرفة سبب عدم تنفيذ مهمة.

الاختبار

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

لإيقاف فرض "الالتزام بحصة وقت التشغيل المخصّصة للوظيفة"، نفِّذ الأمر adb التالي:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

لإيقاف فرض "المهام التي يتم تنفيذها بشكل متزامن مع خدمة تعمل في المقدّمة ستلتزم بحصة وقت تشغيل المهمة"، شغِّل الأمر adb التالي:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

لاختبار سلوك معيّن لحزمة التطبيق في وضع الاستعداد، يمكنك ضبط حزمة التطبيق في وضع الاستعداد باستخدام الأمر adb التالي:

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

لمعرفة فئة وضع الاستعداد التي يندرج فيها تطبيقك، يمكنك الحصول على فئة وضع الاستعداد لتطبيقك باستخدام الأمر adb التالي:

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، لن تتأثر بهذه التغييرات، لأنّ واجهات برمجة التطبيقات هذه تدير دورة حياة المهام نيابةً عن تطبيقك.

إيقاف 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. تتفاعل عملية تقديم الطلب مع عمليات أخرى وتتوقّع تلقّي نية بثّ بترتيب معيّن.

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

التغييرات الداخلية في وقت تشغيل Android ‏(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 كيلوبايت

Android 15 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。

当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。

为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

兼容模式对话框:当系统检测到 4 KB 对齐的应用在 16 KB 对齐的情况下可以更高效地运行时,系统会显示此对话框。

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

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

إيقاف الإشعارات الخطيرة المتعلّقة بإمكانية الوصول نهائيًا

Android 16 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。

替代方案示例:

已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。

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

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

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

صور متحركة تعرض إيماءة الرجوع إلى الخلف التنبؤية في وضع التنقّل باستخدام 3 أزرار

رموز تطبيقات مستوحاة من موضوع معيّن تلقائيًا

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

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

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

تجاهل مالك الجهاز الافتراضي

虚拟设备所有者是创建和管理虚拟设备的可信应用或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者使用的是本地设备,例如手机。

手机上的虚拟设备所有者创建将应用投影到远程显示屏的虚拟设备。

按应用替换项

在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者在将应用投影到外部显示屏上时,可以忽略屏幕方向、宽高比和可调整大小性限制。

常见的重大更改

Android 16 的行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备规格上的界面,尤其是那些专为竖屏小显示屏设计的布局。如需了解如何让应用适应所有设备类型,请参阅关于自适应布局

参考

配套应用串流

الأمان

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

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

Android 16 针对一般的 Intent 重定向攻击提供了默认安全性,并且只需要最低限度的兼容性和开发者更改。

我们引入了默认安全加固解决方案,以应对 Intent 重定向漏洞。在大多数情况下,正常使用 intent 的应用不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现中断。

Intent 重定向在 Android 中出现,当攻击者可以部分或完全 控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,而受害应用会在 intent 的 extra 字段中启动不受信任的子级 intent。这可能会导致攻击者应用在受害应用的上下文中启动私有组件、触发特权操作或获取对敏感数据的 URI 访问权限,从而可能导致数据窃取和任意代码执行。

选择停用 intent 重定向处理

Android 16 引入了一个新 API,允许应用选择停用启动安全保护。在默认安全行为会干扰合法应用用例的特定情况下,这可能是必要的。

对于针对 Android 16(API 级别 36)SDK 或更高版本进行编译的应用

您可以直接对 Intent 对象使用 removeLaunchSecurityProtection() 方法。

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 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) }

لم تعُد التطبيقات المصاحبة تتلقّى إشعارات بانتهاء مهلة البحث عن الأجهزة

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

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

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

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

تحسين معالجة فقدان الاتصال

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

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