欢迎使用 Android 12 开发者预览版!请尽早并且经常向我们提供反馈,帮助我们将 Android 12 打造为最佳版本!

兼容性框架变更 (Android 12)

图 1. 开发者选项中的“应用兼容性变更”屏幕列出了您可以开启或关闭的变更。

本页将介绍 Android 12 的兼容性框架中增加的每项行为变更。在准备支持 Android 12 和以该平台为目标平台时,请将此列表与开发者选项和 ADB 命令结合使用,以测试和调试您的应用。

以下是您可以使用兼容性框架工具进行的操作:

  • 在不实际更改应用的 targetSdkVersion 的情况下测试有针对性的变更。您可以使用切换开关强制启用特定的针对性行为变更,以评估对现有应用的影响。
  • 仅针对特定变更进行测试。您可以使用切换开关停用除要测试的变更之外的所有针对性变更,而不必一次处理所有针对性变更。
  • 通过 adb 管理切换开关。您可以使用 adb 命令在自动测试环境中启用和停用可切换的变更。
  • 使用标准变更 ID 更快地进行调试。每个可切换的变更都具有唯一 ID 和名称,可用于在日志输出中快速调试根本原因。

如需详细了解如何针对每个用例使用相应工具,请参阅兼容性框架工具

兼容性框架中包含的行为变更

此部分的列表中介绍了 Android 12 最新开发者预览版 build 中的兼容性框架中包含的各项行为变更。

您可以按默认状态过滤变更列表。

Android 12 的兼容性框架中增加的行为变更

ALLOW_TEST_API_ACCESS

变更 ID:166236554
默认状态:对所有应用都处于停用状态。

允许应用访问 @TestApi API。

注意:此变更在默认情况下处于停用状态,仅应由平台测试代码使用。

BLOCK_FLAG_SLIPPERY

变更 ID:157929241
默认状态:对所有应用都处于启用状态。

对于在 Android 12 上运行的应用,请检查 FLAG_SLIPPERY 是否与应用中的任何窗口一起使用。我们预计此标志可能仅由系统组件使用,因为它是一个不受支持的字段。如果此标志与任何窗口一起使用,会受到限制。

BLOCK_GPS_STATUS_USAGE

变更 ID:144027538
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,必须将所有 GpsStatus API 用法替换为 GnssStatus API。

BLOCK_IMMUTABLE_PENDING_INTENTS

变更 ID:171317480
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,传递到地理位置 API 的不可变 PendingIntent 对象会生成 IllegalArgumentException.

BLOCK_PENDING_INTENT_SYSTEM_API_USAGE

变更 ID:169887240
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,LocationRequest 系统 API 不能与 PendingIntent 位置信息请求一起使用。

BLOCK_UNTRUSTED_TOUCHES

变更 ID:158002302
默认状态:对所有应用都处于启用状态。

为了维护系统安全并保持良好的用户体验,Android 12 会阻止应用使用触摸事件,使用触摸事件时叠加层会以不安全的方式屏蔽应用。

如需详细了解此变更,请参阅不受信任的触摸事件被屏蔽

CAMERA_MIC_INDICATORS_NOT_PRESENT

变更 ID:162547999
默认状态:对所有应用都处于停用状态。

表示此设备支持摄像头和麦克风指示灯。如果存在该变更 ID,值将为 false,因为如果不存在,CompatChanges#isChangeEnabled 方法会返回 true

DELIVER_HISTORICAL_LOCATIONS

变更 ID:73144566
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

如果应用以 Android 12 及更高版本为目标平台,那么在某些情况下,位置信息客户端可能会收到历史位置信息(当前时间之前)。

DROP_CLOSE_SYSTEM_DIALOGS

变更 ID:174664120
默认状态:对所有应用都处于启用状态。

为了加强用户与应用和系统互动时的控制,从 Android 12 开始,弃用了 ACTION_CLOSE_SYSTEM_DIALOGS intent 操作。

如需详细了解此变更,请参阅应用无法关闭系统对话框

ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES

变更 ID:142191088
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

以 Android 12 及更高版本为目标平台的应用需要在其 AndroidManifest.xml 中使用 uses-native-library 标记声明对由设备制造商定义的公共原生共享库的依赖项。如果应用不满足任何依赖项条件(例如,某个依赖项不存在),软件包管理器将不会安装该应用。可通过标记中的 android:required 属性将依赖项指定为可选项,在这种情况下,即使不满足依赖项条件,系统也不会停止安装应用。

安装完成后,应用将仅包含在应用清单中指定的原生共享库。对未出现在应用清单中的原生共享库调用 dlopen 将失败,即使设备上实际存在该共享库也会失败。

ENFORCE_STRICT_QUERY_BUILDER

变更 ID:143231523
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,SQLiteQueryBuilder 现在会针对恶意参数验证所有 CalendarProvider2 查询选择。

FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID

变更 ID:175801883
默认状态:对所有应用均启用。

如果将软件包的该项设置为 false,系统就不会豁免其执行 FGS-BG-start,即使其位于 ActiveServices.sFgsBgStartExemptedPackages 中也是如此。

FORCE_DISABLE_HEVC_SUPPORT

变更 ID:174227820
默认状态:对所有应用都处于停用状态。

强制应用停止支持 HEVC 媒体功能。应用应在其清单中声明支持的媒体功能,但此标志可用于强制应用停止支持 HEVC,从而在访问以 HEVC 编码的媒体时强制执行转码。设置此标志会替换应用的任何操作系统级默认值。该变更默认处于停用状态,这意味着操作系统默认值优先。设置此标志和 FORCE_ENABLE_HEVC_SUPPORT 是未定义的状态,会导致操作系统忽略这两个标志。

FORCE_ENABLE_HEVC_SUPPORT

变更 ID:174228127
默认状态:对所有应用都处于停用状态。

强制应用支持 HEVC 媒体功能。应用应在其清单中声明其支持的媒体功能,但此标志可用于强制应用支持 HEVC,从而在访问以 HEVC 编码的媒体时避免转码。设置此标志会替换应用的任何操作系统级默认值。该变更默认处于停用状态,这意味着操作系统默认值优先。设置此标志和 FORCE_DISABLE_HEVC_SUPPORT 是未定义的状态,会导致操作系统忽略这两个标志。

FORCE_RESIZE_APP

变更 ID:174042936
默认状态:对所有应用都处于停用状态。

强制使应用该变更的软件包可调整显示尺寸。我们只允许在全屏窗口模式下调整显示尺寸,但不强制应用进入可调整显示尺寸的多窗口模式。

HIDE_PROP_ICUBINARY_DATA_PATH

变更 ID:171979766
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,移除了对 android.icu.impl.ICUBinary.dataPath 属性的访问权限。

IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE

变更 ID:158482162
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,系统会在 BackupManager 中的服务端(而非客户端)强制执行 isBackupServiceActive() 所需的 BACKUP 权限。

KEYSTORE_OPERATION_CREATION_MAY_FAIL

变更 ID:169897160
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,密钥库操作创建现在可能会失败。过去,密钥库运行时会假定加密操作的创建始终成功。但是,KeyMint 后端的操作槽位数量有限。

为了保持“无限”操作槽位数顺畅运行,密钥库守护程序会在没有可用操作槽位时修剪近期最少使用的操作。因此,运行正常的操作可能会提前终止。这会导致 AndroidKeystore 容易遭受拒绝服务攻击 (DoS) 和出现意外活锁现象。例如,如果多个应用因电源管理优化而同时唤醒并尝试执行加密操作,这些应用会开始终止彼此的操作,而不会取得任何进展。

为了打破活锁并阻止 DoS 尝试,我们更改了剪枝策略,以便优先处理当前使用很少的操作槽位的客户端。因此,对于处于非活跃状态不超过 5 秒的单个操作,几乎不会受到剪枝策略的影响。仍然有一些与文件系统加密相关的操作可能会被修剪,但这种情况极为罕见。这项新剪枝策略操作带来的负面影响是,如果客户端的修剪动力低于所有现有操作,那么创建就会失败。

剪枝策略:为了找到合适的候选项,我们会计算调用方和每项现有操作的 malus。malus 是修剪动力(调用方)或修剪阻力(现有操作)的逆。为了能够修剪操作,调用方必须找到一个满足以下条件的操作:操作的 malus 要比调用方的 malus 大。如需详细了解剪枝策略,请参阅 operation.rs 的实现。 在 Android 11(API 级别 30)及更低版本中,KeyStore2 会轮询 Keystore 守护程序以获取闲置的操作槽位。对于以 Android 11(API 级别 30)及更低版本为目标平台的应用,加密和签名对象初始化看上去仍始终会成功完成,但获取操作所需的时间可能会更长。所有 Android 版本都会受益于更合理的操作槽位安排,并更有可能成功完成操作。

LOW_POWER_EXCEPTIONS

变更 ID:168936375
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,如果调用方没有 LOCATION_HARDWARE 权限,那么所有被标记为低动力的 LocationRequest 对象都会抛出异常,而不是静默地丢弃请求的低动力部分。

MISSING_EXPORTED_FLAG

变更 ID:150232615
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,每定义一个 intent 过滤器都必须为 android:exported 属性指定一个显式值。

如需详细了解此变更,请参阅更安全地导出组件

NATIVE_MEMTAG_ASYNC

变更 ID:135772972
默认状态:对所有应用都处于停用状态。

在非系统应用中启用内存标记检查。此标志仅影响支持 ARM 内存标记扩展 (MTE) 的硬件。

NATIVE_MEMTAG_SYNC

变更 ID:177438394
默认状态:对所有应用都处于停用状态。

在此进程中启用同步 (SYNC) 内存标记检查。此标志仅影响支持 ARM 内存标记扩展 (MTE) 的硬件。如果同时启用 NATIVE_MEMTAG_ASYNC 和此选项,那么此选项优先,并在同步模式下启用 MTE。

NOTIFICATION_TRAMPOLINE_BLOCK

变更 ID:167676448
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

为提升应用性能和用户体验,以 Android 12 为目标平台的应用无法将服务或广播接收器用作通知 trampoline。

如需详细了解此变更,请参阅无法通过服务或广播接收器创建通知 trampoline

PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED

变更 ID:160794467
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,您必须指定应用创建的每个 PendingIntent 对象的可变性。这项额外的要求可提高应用的安全性。

如需详细了解此变更,请参阅待处理 intent 必须声明可变性

RATE_LIMIT_TOASTS

变更 ID:174840628
默认状态:无法切换此变更的状态。它只由兼容性框架记录。

Toast.show() 调用的次数施加调用频率限制,防止在有限时间内向用户显示过多消息框。如果尝试显示的消息框数超出特定时间范围内允许的数量,会导致消息框被丢弃。

RETURN_NULL_HARDWARE_ADDRESS

变更 ID:170188668
默认状态:对以 Android 11(API 级别 30)或更高版本为目标平台的应用处于启用状态。

对于以 Android 11(API 级别 30)及更高版本为目标平台的应用,当硬件地址无法访问时,getHardwareAddress() 会返回 null。如果停用此变更,系统会返回默认 MAC 地址 (02:00:00:00:00:00)。

如需详细了解此变更,请参阅对 Netlink MAC 地址的限制

SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE

变更 ID:151105954
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,强制在指定为方法参数的软件包的清单中定义已发送到 noteOp(String, int, String)noteProxyOp(String, String)startOp(String, int, String) 的所有 attributionTags

如需启用此变更,调用 noteOp(String, int, String) 的软件包和被指定为方法参数的软件包都必须启用此变更。

SELINUX_LATEST_CHANGES

变更 ID:143539591
默认状态:对以 Android 12 或更高版本为目标平台的应用处于启用状态。

对于以 Android 12 及更高版本为目标平台的应用,请选择启用最新的 SELinux 变更。对于以 Android 12 或更高版本为目标平台的应用,关闭此变更是一项空操作。对使用共享用户 ID 的应用不起作用。

THROW_EXCEPTION_ON_REQUIRE_INSTALL_PACKAGES_TO_ADD_INSTALLER_PACKAGE

变更 ID:150857253
默认状态:对以 Android 11(API 级别 30)或更高版本为目标平台的应用处于启用状态。

对于以 Android 11(API 级别 30)及更高版本为目标平台的应用,现在向没有设置任何安装程序软件包名称的软件包添加名称需要 INSTALL_PACKAGES 权限。如果调用方以 Android 11(API 级别 30)为目标平台,系统会抛出 SecurityException。否则,请求将静默失败。在这两种情况下,无论是否启用了此变更,安装程序软件包都会保持不变。