تغییرات رفتار: همه برنامه ها

پلتفرم Android 16 شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات رفتاری زیر برای همه برنامه‌ها هنگام اجرا بر روی Android 16 اعمال می‌شود، صرف‌نظر از targetSdkVersion . شما باید برنامه خود را آزمایش کنید و سپس آن را در صورت لزوم برای پشتیبانی از این تغییرات، در صورت لزوم، تغییر دهید.

حتماً فهرستی از تغییرات رفتاری را نیز مرور کنید که فقط بر برنامه‌هایی که Android 16 را هدف قرار می‌دهند تأثیر می‌گذارد .

عملکرد اصلی

اندروید 16 (سطح API 36) شامل تغییرات زیر است که قابلیت‌های هسته‌ای مختلف سیستم اندروید را اصلاح یا گسترش می‌دهد.

بهینه سازی سهمیه JobScheduler

از Android 16 شروع می‌کنیم، ما سهمیه زمان اجرای کار را به طور منظم و سریع بر اساس عوامل زیر تنظیم می‌کنیم:

  • برنامه در کدام سطل آماده به کار برنامه قرار دارد : در Android 16، سطل های آماده به کار فعال با یک سهمیه زمان اجرا سخاوتمندانه شروع به اجرا می کنند.
  • اگر کار در حالی که برنامه در بالاترین وضعیت است اجرا شود : در Android 16، Jobs زمانی که برنامه برای کاربر قابل مشاهده است شروع می شود و پس از نامرئی شدن برنامه ادامه می یابد، به سهمیه زمان اجرای کار پایبند خواهد بود.
  • اگر کار هنگام اجرای یک سرویس پیش‌زمینه اجرا می‌شود : در Android 16، کارهایی که همزمان با یک سرویس پیش‌زمینه اجرا می‌شوند، به سهمیه زمان اجرای کار پایبند هستند. اگر از کارهایی برای انتقال داده توسط کاربر استفاده می کنید، به جای آن از کارهای انتقال داده توسط کاربر استفاده کنید.

این تغییر بر وظایف برنامه ریزی شده با استفاده از WorkManager، JobScheduler و DownloadManager تأثیر می گذارد. برای رفع اشکال چرایی توقف کار، توصیه می‌کنیم با فراخوانی WorkInfo.getStopReason() ثبت کنید که چرا کارتان متوقف شده است (برای کارهای JobScheduler، با JobParameters.getStopReason() ) تماس بگیرید.

برای اطلاعات در مورد اینکه چگونه وضعیت برنامه شما بر منابعی که می‌تواند استفاده کند تأثیر می‌گذارد، به محدودیت‌های منابع مدیریت نیرو مراجعه کنید. برای اطلاعات بیشتر در مورد بهترین شیوه های باتری بهینه، به راهنمای بهینه سازی استفاده از باتری برای API های زمان بندی کار مراجعه کنید.

همچنین توصیه می‌کنیم از API جدید JobScheduler#getPendingJobReasonsHistory که در اندروید 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) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

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

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

دامنه اولویت پخش سفارشی دیگر جهانی نیست

Android apps are allowed to define priorities on broadcast receivers to control the order in which the receivers receive and process the broadcast. For manifest-declared receivers, apps can use the android:priority attribute to define the priority and for context-registered receivers, apps can use the IntentFilter#setPriority() API to define the priority. When a broadcast is sent, the system delivers it to receivers in order of their priority, from highest to lowest.

In Android 16, broadcast delivery order using the android:priority attribute or IntentFilter#setPriority() across different processes will not be guaranteed. Broadcast priorities will only be respected within the same application process rather than across all processes.

Also, broadcast priorities will be automatically confined to the range (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1). Only system components will be allowed to set SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY as broadcast priority.

Your app might be impacted if it does either of the following:

  1. Your application has declared multiple processes with the same broadcast intent, and has expectations around receiving those intents in a certain order based on the priority.
  2. Your application process interacts with other processes and has expectations around receiving a broadcast intent in a certain order.

If the processes need to coordinate with each other, they should communicate using other coordination channels.

تغییرات داخلی 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 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.

When your app is running on a device with Android 16 or higher, if Android detects that your app has 4 KB aligned memory pages, it automatically uses compatibility mode and display a notification dialog to the user. Setting the android:pageSizeCompat property in the AndroidManifest.xml to enable the backwards compatibility mode will prevent the display of the dialog when your app launches. To use the android:pageSizeCompat property, compile your app using the Android 16 SDK.

For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.

The compatibility mode dialog that displays when the system detects that a 4 KB-aligned app could run more optimally if 16 KB aligned.

تجربه کاربری و رابط کاربری سیستم

Android 16 (سطح API 36) شامل تغییرات زیر است که برای ایجاد یک تجربه کاربری سازگارتر و بصری در نظر گرفته شده است.

منسوخ کردن اعلامیه‌های دسترسی مخل

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

替代方案示例:

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

پشتیبانی از ناوبری 3 دکمه

Android 16 پشتیبانی پیش‌بینی‌کننده را برای پیمایش 3 دکمه‌ای برای برنامه‌هایی که به درستی به بازگشت پیش‌بینی مهاجرت کرده‌اند، به ارمغان می‌آورد. با فشار دادن طولانی دکمه برگشت، یک انیمیشن پیش‌بینی‌کننده به عقب آغاز می‌شود و به شما پیش‌نمایشی از جایی که سوایپ به عقب شما را می‌برد می‌دهد.

این رفتار در تمام قسمت‌های سیستم که از انیمیشن‌های پیش‌بینی‌کننده پشتیبان پشتیبانی می‌کنند، اعمال می‌شود، از جمله انیمیشن‌های سیستم (بازگشت به خانه، کار متقابل و فعالیت متقابل).

انیمیشن های پشت پیش بینی در حالت ناوبری 3 دکمه.

نمادهای خودکار برنامه

با شروع Android 16 QPR 2، Android به طور خودکار تم ها را روی نمادهای برنامه اعمال می کند تا یک تجربه منسجم از صفحه اصلی ایجاد کند. اگر برنامه ای نماد برنامه مضمون خود را ارائه نکند، این اتفاق می افتد. برنامه‌ها می‌توانند طراحی نماد برنامه مضمون خود را با قرار دادن یک لایه تک رنگ در نماد تطبیقی خود و پیش‌نمایش اینکه نماد برنامه آن‌ها در Android Studio چگونه به نظر می‌رسد، کنترل کنند.

عوامل شکل دستگاه

Android 16 (سطح API 36) شامل تغییرات زیر برای برنامه‌ها است که توسط صاحبان دستگاه‌های مجازی بر روی نمایشگرها نمایش داده می‌شوند.

مالک دستگاه مجازی لغو می شود

A virtual device owner is a trusted or privileged app that creates and manages a virtual device. Virtual device owners run apps on a virtual device and then project the apps to the display of a remote device, such as a personal computer, virtual reality device, or car infotainment system. The virtual device owner is on a local device, such as a mobile phone.

Virtual device owner on phone creates virtual device that projects app to remote display.

Per-app overrides

On devices running Android 16 (API level 36), virtual device owners can override app settings on select virtual devices that the virtual device owners manage. For example, to improve app layout, a virtual device owner can ignore orientation, aspect ratio, and resizability restrictions when projecting apps onto an external display.

Common breaking changes

The Android 16 behavior might impact your app's UI on large screen form factors such as car displays or Chromebooks, especially layouts that were designed for small displays in portrait orientation. To learn how to make your app adaptive for all device form factors, see About adaptive layouts.

References

Companion app streaming

امنیت

Android 16 (سطح API 36) شامل تغییراتی است که امنیت سیستم را ارتقا می‌دهد تا به محافظت از برنامه‌ها و کاربران در برابر برنامه‌های مخرب کمک کند.

امنیت بهبود یافته در برابر حملات Redirection Intent

اندروید 16 با حداقل سازگاری و تغییرات توسعه‌دهنده، امنیت پیش‌فرض در برابر حملات کلی قصد تغییر Intent را فراهم می‌کند.

ما راه‌حل‌های سخت‌سازی امنیتی پیش‌فرض را برای بهره‌برداری‌های تغییر مسیر Intent معرفی می‌کنیم. در بیشتر موارد، برنامه‌هایی که از intent استفاده می‌کنند، معمولاً با مشکل سازگاری مواجه نمی‌شوند. ما معیارهایی را در طول فرآیند توسعه خود جمع‌آوری کرده‌ایم تا نظارت کنیم کدام برنامه‌ها ممکن است دچار شکستگی شوند.

تغییر مسیر قصد در Android زمانی اتفاق می‌افتد که مهاجم بتواند تا حدی یا به طور کامل محتوای یک intent را که برای راه‌اندازی یک مؤلفه جدید در زمینه یک برنامه آسیب‌پذیر استفاده می‌شود، کنترل کند، در حالی که برنامه قربانی یک هدف سطح فرعی غیرقابل اعتماد را در قسمت اضافی یک Intent («سطح بالا») راه‌اندازی می‌کند. این می‌تواند منجر به راه‌اندازی مؤلفه‌های خصوصی در زمینه برنامه قربانی، راه‌اندازی اقدامات ممتاز یا دسترسی URI به داده‌های حساس توسط برنامه مهاجم شود که به طور بالقوه منجر به سرقت داده‌ها و اجرای کد دلخواه می‌شود.

انصراف از مدیریت تغییر مسیر Intent

اندروید 16 یک API جدید معرفی می‌کند که به برنامه‌ها اجازه می‌دهد از حفاظت‌های امنیتی راه‌اندازی منصرف شوند. این ممکن است در موارد خاصی که رفتار امنیتی پیش‌فرض با موارد استفاده قانونی برنامه تداخل می‌کند ضروری باشد.

برای برنامه‌هایی که با Android 16 (سطح API 36) SDK یا بالاتر کامپایل می‌شوند

می‌توانید مستقیماً از متد removeLaunchSecurityProtection() روی شی Intent استفاده کنید.

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 introduces a new behavior during companion device pairing flow to protect the user's location privacy from malicious apps. All companion apps running on Android 16 are no longer directly notified of discovery timeout using RESULT_DISCOVERY_TIMEOUT. Instead, the user is notified of timeout events with a visual dialog. When the user dismisses the dialog, the app is alerted of the association failure with RESULT_USER_REJECTED.

The search duration has also been extended from the original 20 seconds, and the device discovery can be stopped by the user at any point during the search. If at least one device was discovered within the first 20 seconds of starting the search, the CDM stops searching for additional devices.

قابلیت اتصال

اندروید 16 (سطح API 36) شامل تغییرات زیر در پشته بلوتوث برای بهبود اتصال با دستگاه های جانبی است.

بهبود مدیریت از دست دادن اوراق قرضه

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

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