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 引入了应用被置于受限待机存储桶的新原因。由于 onStartJob
、onStopJob
或 onBind
方法超时,应用的作业多次触发 ANR 错误。(有关 onStartJob
和 onStopJob
的更改,请参阅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(例如服务、JobScheduler
和Jetpack 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 开始,除非满足以下至少一个条件,否则此值将被编辑:
- 存储媒体文件的应用具有始终对其他应用可见的软件包名称。
查询媒体存储的应用请求
QUERY_ALL_PACKAGES
权限。
了解有关 Android 如何出于隐私目的过滤软件包可见性的更多信息。