يتضمّن الإصدار 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,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。
إيقاف JobInfo#setImportantWhileForeground نهائيًا
تشير طريقة JobInfo.Builder#setImportantWhileForeground(boolean)
إلى أهمية إحدى المهام عندما يكون تطبيق تحديد الموعد في
المقدّمة أو عندما يتم إعفاؤه مؤقتًا من القيود المفروضة على التطبيقات التي تعمل في الخلفية.
تم إيقاف هذه الطريقة نهائيًا منذ الإصدار 12 من Android (المستوى 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_PRIORITY、SYSTEM_HIGH_PRIORITY 设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
التغييرات الداخلية في 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 的内存页面。
تجربة المستخدم وواجهة مستخدم النظام
يتضمّن نظام التشغيل Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية التي تهدف إلى توفير تجربة مستخدم أكثر اتساقًا وسهولة.
إيقاف الإشعارات الخطيرة المتعلّقة بإمكانية الوصول نهائيًا
يوقف نظام التشغيل Android 16 نهائيًا إعلانات تسهيل الاستخدام التي تتميز باستخدام
announceForAccessibility أو إرسال
TYPE_ANNOUNCEMENT أحداث تسهيل الاستخدام. ويمكن أن تؤدي هذه العناصر إلى اختلاف تجربتَي المستخدمين في TalkBack وقارئ شاشة Android،
وتعمل العناصر البديلة بشكل أفضل على تلبية مجموعة أوسع من احتياجات المستخدمين في مجموعة متنوعة من
التكنولوجيات المساعِدة في Android.
أمثلة على الحلول البديلة:
- بالنسبة إلى التغييرات المهمة في واجهة المستخدم، مثل التغييرات في النوافذ، استخدِم
Activity.setTitle(CharSequence)وsetAccessibilityPaneTitle(java.lang.CharSequence). في الكتابة، استخدِمModifier.semantics { paneTitle = "paneTitle" } - لإعلام المستخدم بالتغييرات في واجهة المستخدم المهمة، استخدِم رمز
setAccessibilityLiveRegion(int). في ميزة "إنشاء"، استخدِم رمزModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}. يجب استخدام هذه الإعدادات بقدر معقول، لأنّها قد تؤدي إلى إنشاء إشعارات في كل مرة يتم فيها تعديل أحد "المشاهدات". - لإعلام المستخدمين بالأخطاء، أرسِل
AccessibilityEventمن النوعAccessibilityEvent#CONTENT_CHANGE_TYPE_ERRORواضبطAccessibilityNodeInfo#setError(CharSequence)، أو استخدِمTextView#setError(CharSequence).
تتضمّن المستندات المرجعية لواجهة برمجة التطبيقات
announceForAccessibility المتوقّفة نهائيًا مزيدًا من التفاصيل حول
البدائل المقترَحة.
إتاحة التنقّل باستخدام ثلاثة أزرار
يتيح نظام Android 16 ميزة "الرجوع التوقّعي" في ميزة التنقّل باستخدام 3 أزرار للتطبيقات التي تم نقلها بشكل صحيح إلى ميزة "الرجوع التوقّعي". يؤدي الضغط مع الاستمرار على زر الرجوع إلى تشغيل صورة متحركة تنبؤية للرجوع، ما يمنحك معاينة للصفحة التي يؤدي التمرير السريع للخلف إلى عرضها.
ينطبق هذا السلوك على جميع أقسام النظام التي تتيح استخدام الصور المتحركة التنبؤية للرجوع، بما في ذلك الصور المتحركة في النظام (للرجوع إلى الشاشة الرئيسية والتنقّل بين المهام وتنفيذ عدة أنشطة في الوقت نفسه).
رموز تطبيقات مستوحاة من موضوع معيّن تلقائيًا
بدءًا من الإصدار الثاني من Android 16 QPR، يطبّق Android تلقائيًا المظاهر على رموز التطبيقات لتوفير تجربة متسقة على الشاشة الرئيسية. يحدث ذلك إذا لم يوفّر التطبيق رمزًا مستوحى من موضوع معيّن. يمكن للتطبيقات التحكّم في تصميم رمز التطبيق المتوافق مع المظهر من خلال تضمين طبقة أحادية اللون في الرمز التكيّفي ومعاينة الشكل الذي سيبدو عليه رمز التطبيق في استوديو Android.
أشكال الأجهزة
يتضمّن نظام التشغيل Android 16 (المستوى 36 لواجهة برمجة التطبيقات) التغييرات التالية للتطبيقات عند عرضها على الشاشات من قِبل مالكي الأجهزة الافتراضية.
تجاهل مالك الجهاز الافتراضي
مالك الجهاز الافتراضي هو تطبيق موثوق به أو لديه امتيازات، وهو ينشئ جهازًا افتراضيًا ويديره. يشغّل مالكو الأجهزة الافتراضية التطبيقات على جهاز افتراضي ثم يعرضونها على شاشة جهاز بعيد، مثل جهاز كمبيوتر شخصي أو جهاز واقع افتراضي أو نظام معلومات وترفيه في السيارة. يكون مالك الجهاز الافتراضي على جهاز محلي، مثل هاتف جوّال.
عمليات التجاوز على مستوى التطبيق
على الأجهزة التي تعمل بالإصدار 16 من نظام التشغيل Android (المستوى 36 لواجهة برمجة التطبيقات)، يمكن لمالكي الأجهزة الافتراضية إلغاء إعدادات التطبيقات على أجهزة افتراضية محدّدة يديرها مالكو الأجهزة الافتراضية. على سبيل المثال، لتحسين تخطيط التطبيق، يمكن لمالك جهاز افتراضي تجاهل القيود المتعلقة بالاتجاه ونسبة العرض إلى الارتفاع وإمكانية تغيير الحجم عند عرض التطبيقات على شاشة خارجية.
التغييرات الشائعة التي قد تؤدي إلى أعطال
قد يؤثّر سلوك Android 16 في واجهة المستخدم لتطبيقك على أجهزة ذات شاشات كبيرة، مثل شاشات السيارات أو أجهزة Chromebook، خاصةً التصاميم التي تم إنشاؤها لشاشات صغيرة في الوضع العمودي. للتعرّف على كيفية جعل تطبيقك متوافقًا مع جميع أشكال الأجهزة، يمكنك الاطّلاع على لمحة عن التصاميم المتجاوبة.
المراجع
الأمان
يتضمّن نظام التشغيل Android 16 (المستوى 36 لواجهة برمجة التطبيقات) تغييرات تعزّز أمان النظام للمساعدة في حماية التطبيقات والمستخدمين من التطبيقات الضارة.
تحسين الأمان ضد هجمات إعادة توجيه Intent
يوفر نظام التشغيل Android 16 حماية تلقائية من هجمات إعادة التوجيه العامة Intent، مع الحد الأدنى من التوافق والتغييرات المطلوبة من المطوّرين.
نحن بصدد طرح حلول لتعزيز الأمان بشكل تلقائي بهدف الحماية من استغلال عمليات إعادة التوجيه.Intent في معظم الحالات، لن تواجه التطبيقات التي تستخدم الأهداف أي مشاكل في التوافق، إذ جمعنا مقاييس خلال عملية التطوير لمراقبة التطبيقات التي قد تواجه مشاكل.
تحدث عملية إعادة توجيه Intent في نظام التشغيل Android عندما يتمكّن أحد المهاجمين من التحكّم جزئيًا أو كليًا في محتوى Intent المستخدَم لإطلاق مكوِّن جديد في سياق تطبيق معرَّض للخطر، بينما يطلق تطبيق الضحية Intent غير موثوق به على مستوى فرعي في حقل التطبيقات الإضافية من Intent ("على المستوى الأعلى"). ويمكن أن يؤدي ذلك إلى أن يطلق تطبيق المهاجم مكوّنات خاصة في سياق تطبيق الضحية، أو أن يؤدي إلى تشغيل إجراءات ذات امتيازات، أو الحصول على إذن الوصول إلى بيانات حساسة باستخدام معرّف الموارد الموحّد (URI)، ما قد يؤدي إلى سرقة البيانات وتنفيذ رموز برمجية عشوائية.
إيقاف معالجة إعادة التوجيه المستندة إلى Intent
يقدّم 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) }
بالنسبة إلى التطبيقات التي يتم تجميعها باستخدام الإصدار 15 من نظام التشغيل Android (المستوى 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 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。
搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。
إمكانية الاتصال
يتضمّن نظام التشغيل Android 16 (المستوى 36 لواجهة برمجة التطبيقات) التغييرات التالية في حزمة بروتوكول البلوتوث لتحسين إمكانية الاتصال بالأجهزة الطرفية.
تحسين معالجة فقدان الاتصال
بدءًا من Android 16، تم تعديل حِزمة البلوتوث لتحسين الأمان وتجربة المستخدم عند رصد فقدان الربط عن بُعد. في السابق، كان النظام يزيل الربط تلقائيًا ويُطلق عملية إقران جديدة، ما قد يؤدي إلى إعادة إقران غير مقصودة. لقد لاحظنا في العديد من الحالات أنّ التطبيقات لا تهتم بحدث فقدان الارتباط بطريقة متّسقة.
لتوحيد التجربة، حسّن نظام التشغيل Android 16 معالجة فقدان الربط في النظام. إذا تعذّر مصادقة جهاز بلوتوث سبق ربطه عند إعادة الربط، سيقطع النظام الرابط ويحتفظ بمعلومات الربط المحلية ويعرض مربّع حوار للنظام يُعلم المستخدمين بفقدان الربط ويوجّههم إلى إعادة الإقران.