行為變更:所有應用程式

Android 16 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion 為何,當應用程式在 Android 16 上執行時,下列行為變更將會套用至所有應用程式。您應測試應用程式,並視需要修改,以便在適當情況下支援這些變更。

另請務必查看僅對指定 Android 16 為目標版本的應用程式造成影響的行為變更清單。

核心功能

Android 16 (API 級別 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 裝置上執行,您就可以啟用特定工作配額最佳化設定的覆寫功能。

如要停用「top state will adhere to job runtime quota」的強制執行功能,請執行下列 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 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 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 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.

As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.

Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.

All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our issue tracker.

16 KB 頁面大小相容模式

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.

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. 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.

使用者體驗和系統 UI

Android 16 (API 級別 36) 包含下列變更,旨在打造更一致、直覺的使用者體驗。

淘汰令人混淆的無障礙工具公告

Android 16 已淘汰無障礙公告,這類公告的特色是使用 announceForAccessibility 或調度 TYPE_ANNOUNCEMENT 無障礙事件。這可能會為 TalkBack 和 Android 螢幕閱讀器的使用者帶來不一致的使用者體驗,而替代方案可在各種 Android 輔助技術中,滿足更廣泛的使用者需求。

替代方案範例:

如要進一步瞭解建議的替代方案,請參閱已淘汰的 announceForAccessibility API 參考說明文件。

支援 3 鍵導覽

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

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

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

裝置板型規格

在 Android 16 (API 級別 36) 中,當虛擬裝置擁有者將應用程式投影到螢幕時,應用程式會發生下列變更。

虛擬裝置擁有者覆寫值

虛擬裝置擁有者是指可建立及管理虛擬裝置的可信任或特權應用程式。虛擬裝置擁有者會在虛擬裝置上執行應用程式,然後將應用程式投影到遠端裝置的螢幕,例如個人電腦、虛擬實境裝置或車用資訊娛樂系統。虛擬裝置擁有者使用的是本機裝置,例如手機。

手機上的虛擬裝置擁有者建立虛擬裝置,將應用程式投影到遠端螢幕。

個別應用程式覆寫值

在搭載 Android 16 (API 級別 36) 的裝置上,虛擬裝置擁有者可以覆寫虛擬裝置擁有者管理的特定虛擬裝置上的應用程式設定。舉例來說,為了改善應用程式版面配置,虛擬裝置擁有者可在將應用程式投影到外部螢幕時,忽略方向、顯示比例和可調整大小限制。

常見的破壞性變更

Android 16 的行為可能會影響應用程式在汽車螢幕或 Chromebook 等大螢幕裝置上的 UI,尤其是針對小螢幕的直向版型設計的版面配置。如要瞭解如何讓應用程式可配合所有裝置板型規格調整顯示方式,請參閱「關於自動調整版面配置」。

參考資料

隨附應用程式串流

安全性

Android 16 (API 級別 36) 包含可提升系統安全性的變更,有助於保護應用程式和使用者免受惡意應用程式侵擾。

強化安全性,防範 Intent 重新導向攻擊

Android 16 提供了针对常规 Intent 重定向攻击的默认安全防护,并且所需的兼容性和开发者更改最少。

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

当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,就会出现 Android 中的intent 重定向,而受害应用会在 intent(“顶级”intent)的 extras 字段中启动不可信的子级 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 (API 級別 36) 的藍牙堆疊包含下列變更,可改善與周邊裝置的連線能力。

改善債券損失處理方式

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

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