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

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

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

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

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

تحسينات على حصص JobScheduler

从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业的执行运行时配额:

  • 应用所处的应用待机存储分区:在 Android 16 中,活跃待机存储分区将开始通过宽松的运行时配额强制执行。
  • 如果作业在应用处于前台状态时开始执行:在 Android 16 中,如果作业在应用对用户可见时开始执行,并在应用变为不可见后继续执行,则会遵守作业运行时配额。
  • 如果作业在运行前台服务时执行:在 Android 16 中,与前台服务同时执行的作业将遵守作业运行时配额。如果您利用作业进行用户发起的数据传输,请考虑改用用户发起的数据传输作业

此变更会影响使用 WorkManager、JobScheduler 和 DownloadManager 调度的任务。如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason()(对于 JobScheduler 作业,请调用 JobParameters.getStopReason())来记录作业停止的原因。

如需了解应用的状态如何影响其可使用的资源,请参阅电源管理资源限制。 如需详细了解电池优化方面的最佳实践,请参阅有关针对任务调度 API 优化电池使用的指南。

我们还建议利用 Android 16 中引入的新 JobScheduler#getPendingJobReasonsHistory API 来了解作业未执行的原因。

测试

如需测试应用的行为,只要应用在 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 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。

发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。

依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。

所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。

وضع التوافق مع حجم الصفحة 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 المتوقّفة نهائيًا مزيدًا من التفاصيل حول البدائل المقترَحة.

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

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

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

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

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

从 Android 16 QPR 2 开始,Android 会自动将主题应用于应用图标,以打造一致的主屏幕体验。如果应用未提供自己的带主题的应用图标,就会发生这种情况。应用可以通过在自适应图标中添加单色图层来控制主题化应用图标的设计,并在 Android Studio 中预览应用图标的外观。

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

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

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

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

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

الإعدادات التي يتم تجاهلها لكل تطبيق

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

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

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

المراجع

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

الأمان

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

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

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

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

تحدث إعادة توجيه النية في Android عندما يتمكّن مهاجم من التحكّم جزئيًا أو كليًا في محتويات نية تُستخدم لتشغيل مكوّن جديد في سياق تطبيق معرّض للخطر، بينما يشغّل تطبيق الضحية نية غير موثوق بها على مستوى فرعي في حقل إضافات لنية ("على المستوى الأعلى"). يمكن أن يؤدي ذلك إلى تشغيل تطبيق المهاجم لمكوّنات خاصة في سياق تطبيق الضحية، أو تشغيل إجراءات مميزة، أو الحصول على إذن الوصول إلى بيانات حساسة باستخدام عنوان 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) }
بالنسبة إلى التطبيقات التي يتم تجميعها باستخدام حزمة تطوير البرامج (SDK) لنظام التشغيل 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) }

لم يعُد يتم إشعار التطبيقات المصاحبة بمهلات الاكتشاف

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

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

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

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

تحسين معالجة فقدان الربط

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

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