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 设计为将缓存的应用保留在后台,并在系统需要内存时自动终止它们。如果您的应用不必要地终止其他应用,则会导致系统性能降低,并且由于需要稍后完全重启这些应用而导致电池消耗增加,这比恢复现有的缓存应用需要更多的资源。
第一个 GATT 客户端请求 MTU 时,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 为兼容设备添加了新的 CTS 测试,用于新的mlock()
限制。
系统强制执行缓存应用资源的使用
根据设计,当应用移至后台且没有其他应用进程组件正在运行时,应用的进程处于缓存状态。此类应用进程可能会因系统内存压力而被终止。在此状态下,在调用并返回onStop()
方法后,Activity
实例执行的任何工作都不可靠,并且强烈建议不要执行。
Android 14 为此设计引入了稳定性和强制执行。应用进程进入缓存状态后不久,后台工作将被禁止,直到进程组件重新进入生命周期的活动状态。
使用典型框架支持的生命周期 API(例如服务、JobScheduler
和Jetpack WorkManager)的应用不受这些更改的影响。
用户体验
用户体验不可取消通知的更改
如果您的应用向用户显示不可取消的前台通知,Android 14 已更改行为,允许用户取消此类通知。
此更改适用于通过Notification.FLAG_ONGOING_EVENT
(通过Notification.Builder#setOngoing(true)
或NotificationCompat.Builder#setOngoing(true)
)防止用户取消前台通知的应用。FLAG_ONGOING_EVENT
的行为已更改,使此类通知实际上可以被用户取消。
在以下情况下,此类通知仍不可取消
- 手机已锁定时
- 如果用户选择全部清除通知操作(有助于避免意外取消)
此外,此新行为不适用于以下用例中的通知
CallStyle
通知- 设备策略控制器 (DPC) 和企业支持包
- 媒体通知
- 默认搜索选择器包
数据安全信息更易于查看
为了增强用户隐私,Android 14 增加了系统显示您在 Play Console 表单中声明的信息的位置数量。目前,用户可以在 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 来避免受到 2015 年 Android 6.0 棉花糖(API 级别 23)引入的运行时权限模型的约束。此 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 如何出于隐私目的过滤包可见性。