兼容性框架变更 (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。

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

ALWAYS_SANDBOX_DISPLAY_APIS

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

强制使应用此变更的软件包始终应用 Display API 沙盒(无论采用哪种窗口模式)。Display API 将始终提供应用绑定。

如需详细了解此变更,请参阅 Display#getRealSize 和 getRealMetrics:废弃和沙盒

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

CHANGE_ID_AUTH_STATE_DENIED

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

对于以 Android 12 及更高版本为目标平台的客户端应用,如果它们处于已被拒绝授权状态,并尝试向 nanoapp 发送消息,则系统会抛出 SecurityException

CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION

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

对于以 Android 12 及更高版本为目标平台的应用,如果它们没有 HIGH_SAMPLING_RATE_SENSORS 权限、在调试模式下运行,并且所请求的采样率高于 200 Hz,则系统会抛出 SecurityException

DELIVER_HISTORICAL_LOCATIONS

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

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

DOWNSCALED

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

此变更是所有按应用缩小缓冲区的变更的把关程序。停用此变更会导致以下缩放比例无法发挥作用:

为某个应用软件包启用此变更后,系统会按照已启用的最大缩放比例强制调整该应用的大小。例如,如果同时启用了 80% 和 70%,则系统会使用 80%。

DOWNSCALE_50

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

如果同时还启用了 DOWNSCALED,则为软件包启用此变更便会强制应用假定自己是在一部横向及纵向分辨率为实际显示屏的 50% 的显示屏上运行。

DOWNSCALE_60

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

如果同时还启用了 DOWNSCALED,则为软件包启用此变更便会强制应用假定自己是在一部横向及纵向分辨率为实际显示屏的 60% 的显示屏上运行。

DOWNSCALE_70

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

如果同时还启用了 DOWNSCALED,则为软件包启用此变更便会强制应用假定自己是在一部横向及纵向分辨率为实际显示屏的 70% 的显示屏上运行。

DOWNSCALE_80

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

如果同时还启用了 DOWNSCALED,则为软件包启用此变更便会强制应用假定自己是在一部横向及纵向分辨率为实际显示屏的 80% 的显示屏上运行。

DOWNSCALE_90

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

如果同时还启用了 DOWNSCALED,则为软件包启用此变更便会强制应用假定自己是在一部横向及纵向分辨率为实际显示屏的 90% 的显示屏上运行。

DROP_CLOSE_SYSTEM_DIALOGS

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

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

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

ENABLE_CHECKS_FOR_PRIVATE_FILES

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

以 Android 12 及更高版本为目标平台的应用无法使用媒体提供程序来插入或更新私有文件。

ENABLE_DEFERRED_SCAN

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

启用此选项可延迟作为 MediaProvider#update() 的一部分触发的扫描。

ENABLE_INCLUDE_ALL_VOLUMES

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

启用此选项可在 MediaProvider#query 中包含最近被卸载的卷中的数据库文件行。

ENABLE_RAW_MANAGE_EXTERNAL_STORAGE_ACCESS

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

启用此选项可允许具有 Manifest.permission.MANAGE_EXTERNAL_STORAGE 权限的应用请求原始外部存储空间的访问权限。

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

启用此选项可允许具有 android.app.role#SYSTEM_GALLERY 角色的应用请求原始外部存储空间的访问权限。

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_NON_RESIZE_APP

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

强制使应用此变更的软件包无法调整尺寸。

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_HEAP_ZERO_INIT

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

启用原生堆内存分配的自动零值初始化。

NATIVE_MEMTAG_ASYNC

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

在此过程中启用异步 (ASYNC) 内存标记检查。此标志仅影响支持 ARM 内存标记扩展 (MTE) 的硬件。

NATIVE_MEMTAG_SYNC

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

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

NEVER_SANDBOX_DISPLAY_APIS

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

强制使应用此变更的软件包从不针对信箱或 SCM activity 应用 Display API 沙盒。Display API 将继续提供 DisplayArea 绑定。

如需详细了解此变更,请参阅 Display#getRealSize 和 getRealMetrics:废弃和沙盒

NOTIFICATION_CANCELLATION_REASONS

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

使通知监听器能够了解更加具体的新取消原因。

NOTIFICATION_TRAMPOLINE_BLOCK

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

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

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

NULL_TELEPHONY_THROW_NO_CB

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

用于检查当前进程的目标 SDK 版本是否为 Android 12 或更高版本。

适用于以下方法:

OVERRIDE_MIN_ASPECT_RATIO

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

此变更是所有强制采用指定最小宽高比的变更的把关程序。启用此变更可应用以下最小宽高比:

为应用软件包启用此变更后,系统会将应用清单文件中指定的最小宽高比替换为已启用的最大宽高比(除非应用清单文件中指定的值更高)。

OVERRIDE_MIN_ASPECT_RATIO_LARGE

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

如果同时还启用了 OVERRIDE_MIN_ASPECT_RATIO,则为软件包启用此变更便会将相应 activity 的最小宽高比设为 OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE 定义的较大值。

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

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

如果同时还启用了 OVERRIDE_MIN_ASPECT_RATIO,则为软件包启用此变更便会将相应 activity 的最小宽高比设为 OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE 定义的中等值。

PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED

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

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

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

RATE_LIMIT_TOASTS

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

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

REQUIRE_EXACT_ALARM_PERMISSION

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

对于以 Android 12 及更高版本为目标平台的应用,应用必须具有新的 Manifest.permission.SCHEDULE_EXACT_ALARM 权限才能使用 setExactAndAllowWhileIdle(int, long, PendingIntent)setAlarmClock(AlarmClockInfo, PendingIntent)

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 的应用不起作用。

SELINUX_R_CHANGES

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

此变更可控制应用对 untrusted_app_R-targetSDk SELinux 域的访问权限。这是兼容性框架的其中一项基础变更,可让应用在不更改其 targetSDKVersion 的情况下,切换受 targetSdkVersion 控制的其他变更的状态。因此,对于以 Android 11 为目标平台的应用,您不应停用此变更,否则应用将无法运行。

此变更不会影响使用共享用户 ID 的应用。

SETTINGS_API_V2

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

当前平台预览中尚未实现用于验证在 AndroidManifest.xml intent 过滤器中标记为 android:autoVerify="true" 的网域的新用户偏好设置 API。现在,您可以使用 adb shell pm set-app-links-user-selection 和类似命令启用此变更,以便预览新的用户偏好设置变更。

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。否则,请求将静默失败。在这两种情况下,无论是否启用了此变更,安装程序软件包都会保持不变。