行为变更:所有应用

Android 14 平台包含可能会影响您应用的行为变更。以下行为变更适用于在 Android 14 上运行的所有应用,无论其 targetSdkVersion 是多少。您应测试您的应用,并根据需要进行修改,以妥善支持这些变更(如果适用)。

请务必同时查看仅影响以 Android 14 为目标平台的应用的行为变更列表。

核心功能

默认拒绝精确闹钟的调度

精确闹钟用于用户意图的通知,或需要精确时间发生的操作。从 Android 14 开始,SCHEDULE_EXACT_ALARM 权限不再预先授予大多数新安装的、以 Android 13 及更高版本为目标平台的应用——该权限默认被拒绝。

了解有关调度精确闹钟权限变更的更多信息。

应用缓存时,上下文注册的广播会排队

在 Android 14 上,当应用处于缓存状态时,系统可以将上下文注册的广播放入队列中。这与 Android 12 (API 级别 31) 为异步绑定器事务引入的排队行为类似。清单声明的广播不会排队,应用会因广播分发而脱离缓存状态。

当应用脱离缓存状态时,例如返回到前台,系统会分发任何排队的广播。某些广播的多个实例可能会合并为一个广播。根据其他因素,例如系统健康状况,应用可能会脱离缓存状态,并且任何先前排队的广播都会被分发。

应用只能终止自己的后台进程

从 Android 14 开始,当您的应用调用 killBackgroundProcesses() 时,该 API 只能终止您应用自身的后台进程。

如果您传入另一个应用的软件包名称,此方法对该应用的后台进程无效,并且 Logcat 中会显示以下消息:

Invalid packageName: com.example.anotherapp

您的应用不应使用 killBackgroundProcesses() API 或以其他方式尝试影响其他应用的进程生命周期,即使在旧版操作系统上也是如此。Android 旨在将缓存应用保留在后台,并在系统需要内存时自动终止它们。如果您的应用不必要地终止其他应用,可能会降低系统性能并增加电池消耗,因为它以后需要完全重启这些应用,这比恢复现有缓存应用需要更多的资源。

第一个请求 MTU 的 GATT 客户端的 MTU 设置为 517

从 Android 14 开始,Android 蓝牙堆栈更严格地遵循 蓝牙核心规范 5.2 版,并在第一个 GATT 客户端使用 BluetoothGatt#requestMtu(int) API 请求 MTU 时,将 BLE ATT MTU 请求为 517 字节,并忽略该 ACL 连接上的所有后续 MTU 请求。

为了应对此更改并使您的应用更健壮,请考虑以下选项:

  • 您的外围设备应以外围设备可接受的合理值响应 Android 设备的 MTU 请求。最终协商的值将是 Android 请求值和远程提供值中的最小值(例如,min(517, remoteMtu)
    • 实施此修复可能需要对外围设备进行固件更新
  • 或者,根据您外围设备的已知支持值和收到的 MTU 更改的最小值来限制您的 GATT 特性写入
    • 请注意,您应该从支持的大小中减去 5 字节用于标头
    • 例如:arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5

应用被置于受限待机存储桶的新原因

Android 14 引入了应用被置于受限待机存储桶的新原因。由于 onStartJobonStopJobonBind 方法超时,应用的作业多次触发 ANR 错误。(有关 onStartJobonStopJob 的更改,请参阅JobScheduler 增强回调和网络行为。)

要跟踪应用是否已进入受限待机存储桶,我们建议在作业执行时使用 API UsageStatsManager.getAppStandbyBucket() 进行日志记录,或在应用启动时使用 UsageStatsManager.queryEventsForSelf() 进行日志记录。

mlock 限制为 64 KB

在 Android 14 (API 级别 34) 及更高版本中,平台将使用 mlock() 可锁定的最大内存减少到每个进程 64 KB。在以前的版本中,限制是每个进程 64 MB。此限制促进了应用和系统之间更好的内存管理。为了在设备之间提供更多的一致性,Android 14 为兼容设备上的新 mlock() 限制添加了新的 CTS 测试

系统强制执行缓存应用的资源使用

按设计,当应用进程移至后台且没有其他应用进程组件正在运行时,它处于缓存状态。这样的应用进程可能会因系统内存压力而被终止。在此状态下,Activity 实例在调用并返回 onStop() 方法后执行的任何工作都是不可靠且强烈不建议的。

Android 14 为此设计引入了一致性和强制执行。应用进程进入缓存状态后不久,将不允许后台工作,直到进程组件重新进入生命周期的活动状态。

使用典型框架支持的生命周期 API(例如服务JobSchedulerJetpack WorkManager)的应用不应受到这些更改的影响。

用户体验

用户对不可消除通知的体验变化

如果您的应用向用户显示不可消除的前台通知,Android 14 更改了行为以允许用户消除此类通知。

此更改适用于通过 Notification.Builder#setOngoing(true)NotificationCompat.Builder#setOngoing(true) 设置 Notification.FLAG_ONGOING_EVENT 来阻止用户消除前台通知的应用。FLAG_ONGOING_EVENT 的行为已更改,使此类通知实际上可由用户消除。

在以下情况下,这些通知仍然不可消除:

  • 手机锁定时
  • 如果用户选择清除所有通知操作(这有助于避免意外消除)

此外,此新行为不适用于以下用例中的通知:

  • CallStyle 通知
  • 设备策略控制器 (DPC) 和企业支持包
  • 媒体通知
  • 默认搜索选择器软件包

数据安全信息更可见

为了增强用户隐私,Android 14 增加了系统显示您在 Play 管理中心表单中声明的信息的位置。目前,用户可以在 Google Play 应用详情中的数据安全部分查看此信息。

我们鼓励您查看您应用的地理位置数据共享政策,并花时间对您应用的 Google Play 数据安全部分进行任何适用的更新。

在指南中了解有关 Android 14 上数据安全信息更可见的更多信息。

无障碍功能

非线性字体缩放至 200%

从 Android 14 开始,系统支持字体缩放至 200%,为弱视用户提供额外的无障碍选项,符合Web 内容无障碍指南 (WCAG)

如果您已经使用缩放像素 (sp) 单位来定义文本大小,那么此更改可能对您的应用影响不大。但是,您应该在启用最大字体大小 (200%) 的情况下执行 UI 测试,以确保您的应用可以在不影响可用性的情况下适应更大的字体大小。

安全

最低可安装目标 API 级别

从 Android 14 开始,targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求可以改善用户的安全和隐私。

恶意软件通常以旧的 API 级别为目标,以绕过在新版 Android 中引入的安全和隐私保护。例如,一些恶意软件应用使用 targetSdkVersion 为 22,以避免受到 Android 6.0 Marshmallow (API 级别 23) 于 2015 年引入的运行时权限模型的影响。此 Android 14 更改使得恶意软件更难避免安全和隐私改进。尝试安装目标 API 级别较低的应用将导致安装失败,Logcat 中将显示以下消息:

INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7

在升级到 Android 14 的设备上,任何 targetSdkVersion 低于 23 的应用都将保持安装状态。

如果您需要测试以旧 API 级别为目标的应用,请使用以下 ADB 命令:

adb install --bypass-low-target-sdk-block FILENAME.apk

媒体所有者软件包名称可能会被编辑

媒体存储支持对 OWNER_PACKAGE_NAME 列的查询,该列指示存储特定媒体文件的应用。从 Android 14 开始,除非满足以下至少一个条件,否则此值将被编辑:

了解有关 Android 如何出于隐私目的过滤软件包可见性的更多信息。