兼容性框架变更 (Android 12)

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

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

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

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

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

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

此部分的列表中介绍了 Android 12 中的兼容性框架中包含的各项行为变更。

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

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

ALWAYS_SANDBOX_DISPLAY_APIS

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

启用后,无论对于何种窗口模式,都会将 Display API 沙盒应用于软件包。Display API 将始终提供应用边界。

如需详细了解此变更,请参阅 Android 12 行为变更页面中关于 已废弃的 Display 方法的部分。

AUTOFILL_NON_TEXT_REQUIRES_ON_RECEIVE_CONTENT_LISTENER

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

从 Android 12 开始,平台可以使用经过增强的自动填充框架(请参阅自动填充服务)提供非文本建议(例如图片)。应用为了能处理这些建议,通常必须实现 OnReceiveContentListener API。

为了让之前已实现 InputConnection.commitContent(InputContentInfo, int, Bundle) API 的应用更顺利地采用此 API,我们重复使用该 API 作为回退(如果相关应用尚未实现 OnReceiveContentListener)。该回退仅在 Android 12(API 级别 31)上启用。此变更 ID 停用了该回退,因此以 Android 12(API 级别 32)及更高版本为目标平台的应用必须实现 OnReceiveContentListener API 才能接受非文本建议。

BLOCK_FLAG_SLIPPERY

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

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

BLOCK_GPS_STATUS_USAGE

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

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

BLOCK_IMMUTABLE_PENDING_INTENTS

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

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

BLOCK_PENDING_INTENT_SYSTEM_API_USAGE

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

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

BLOCK_UNTRUSTED_TOUCHES

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

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

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

CALL_ACTIVITY_RESULT_BEFORE_RESUME

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

对于以 Android 12(API 级别 32)及更高版本为目标平台的应用,更正了 activity 结果的生命周期,以保证 activity 在恢复前获得 activity 结果。

CAMERA_MIC_INDICATORS_NOT_PRESENT

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

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

CANNOT_INSTALL_WITH_BAD_PERMISSION_GROUPS

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

对于以 Android 12(API 级别 32)及更高版本为目标平台的应用,如果存在格式不正确的权限组,软件包管理器就不会安装软件包。权限组只能在共享证书的应用之间共享。如果权限属于某个权限组,还必须对该权限组进行定义。

CHANGE_ID_AUTH_STATE_DENIED

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

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

CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION

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

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

DELIVER_HISTORICAL_LOCATIONS

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

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

DISPLAY_INFO_NR_ADVANCED_SUPPORTED

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,为 TelephonyDisplayInfo 中的变更提供向后兼容性。

DISPLAY_MODE_RETURNS_PHYSICAL_REFRESH_RATE

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,如果更可取,平台可能会将应用的帧速率限制到刷新频率的除数(例如,如果应用调用了 Surface.setFrameRate(float, int))。应用将在受限的帧速率下经历 Choreographer.postFrameCallback(Choreographer.FrameCallback) 回调和背压。应用使用 Display.getRefreshRate()Display.Mode.getRefreshRate() 了解显示刷新频率是多少。Display.getRefreshRate() 将始终返回应用帧速率,而不是物理显示刷新频率,以使应用正确执行帧同步。如果编译到以前的版本,Display.Mode.getRefreshRate() 将返回应用帧速率,并且从 Android 12(API 级别 31)开始返回物理显示刷新频率。

DOWNSCALED

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

此变更是所有按应用缩小缓冲区的变更的把关程序。启用此变更可应用以下缩放比例:

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

DOWNSCALE_30

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

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

DOWNSCALE_35

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

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

DOWNSCALE_40

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

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

DOWNSCALE_45

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

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

DOWNSCALE_50

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

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

DOWNSCALE_55

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

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

DOWNSCALE_60

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

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

DOWNSCALE_65

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

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

DOWNSCALE_70

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

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

DOWNSCALE_75

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

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

DOWNSCALE_80

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

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

DOWNSCALE_85

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

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

DOWNSCALE_90

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

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

DO_NOT_DOWNSCALE_TO_1080P_ON_TV

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

以 Android 12(API 级别 31)及更高版本为目标平台的 Android TV 应用需要处理任何窗口尺寸,包括大于 1080p 的窗口尺寸。 以更低 Android 版本为目标平台的应用预计不会接收大于 1080p 的窗口,因此必要时它们的窗口会缩小到 1080p。

DROP_CLOSE_SYSTEM_DIALOGS

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

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

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

ENABLE_CHECKS_FOR_PRIVATE_FILES

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

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

ENABLE_DEFERRED_SCAN

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

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

ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,会为查询和通知调用状态(例如 TelecomManager#getCallStateTelephonyManager.getCallStateForSubscription()TelephonyCallback.CallStateListener)的 API 启用 READ_PHONE_STATE 保护。

ENABLE_GET_PHONE_ACCOUNT_PERMISSION_PROTECTION

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,请在 getPhoneAccount(PhoneAccountHandle) 上启用 READ_PHONE_NUMBERSREAD_PRIVILEGED_PHONE_STATE 保护。

ENABLE_INCLUDE_ALL_VOLUMES

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

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

ENABLE_RAW_MANAGE_EXTERNAL_STORAGE_ACCESS

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

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

ENFORCE_MINIMUM_WINDOW_ON_INEXACT_ALARMS

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,所有不精确的闹钟都需要具有最小窗口大小,预计在几分钟左右。实际上,任何需要较短窗口的闹钟都与精确闹钟相同,应该使用提供的相应 API,例如 setExact(int, long, PendingIntent)。指定了较短窗口的不精确闹钟会导致其窗口被系统拉长。

ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES

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

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

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

ENFORCE_STRICT_QUERY_BUILDER

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

启用后,SQLiteQueryBuilder 会根据恶意参数验证所有 CalendarProvider2 查询选择。

FGS_BG_START_RESTRICTION_CHANGE_ID

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,限制应用在后台运行时可以启动前台服务的时间。

FGS_START_EXCEPTION_CHANGE_ID

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,如果应用在后台运行时尝试启动前台服务,系统会抛出 IllegalStateException

FINISH_INPUT_NO_FALLBACK_CONNECTION

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,请在设备变为 non-interactive 时完成 InputConnection

如果由当前的 input method 启用,则每当设备变为非交互状态时,当前输入连接将为 finished

如果未启用,当设备变为非交互式状态时,当前输入连接将被静默停用,并且当设备再次变为交互式状态时,将分派 onFinishInput()onStartInput() 对。

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(API 级别 31)或更高版本为目标平台的应用处于启用状态。

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

IGNORE_ALLOW_BACKUP_IN_D2D

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,在设备到设备 (D2D) 迁移期间应用会忽略 android:allowBackup

IGNORE_FULL_BACKUP_CONTENT_IN_D2D

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,在设备到设备 (D2D) 转移期间会忽略使用 android:fullBackupContent 指定的包含和排除规则。

IME_AUTOFILL_DEFAULT_SUPPORTED_LOCALES_IS_EMPTY

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,getSupportedLocales() 现在会在未设置时返回空的语言区域列表,而不是默认系统语言区域。

IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,在 BackupManagerisBackupServiceActive() 所需的 BACKUP 权限在服务端而非客户端强制执行。

KEYSTORE_OPERATION_CREATION_MAY_FAIL

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

启用后,根据新的剪枝策略,密钥库操作创建可能会失败。过去,密钥库运行时会假定加密操作的创建始终成功。但是,KeyMint 后端的操作槽位数量有限。

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

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

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

LOCK_DOWN_CLOSE_SYSTEM_DIALOGS

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,除非应用还具有 android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS 权限,否则无法发送 Intent.ACTION_CLOSE_SYSTEM_DIALOGS。请注意,这是限制性更高的 #DROP_CLOSE_SYSTEM_DIALOGS 版本,它希望应用以 Android 12(API 级别 31)或更高版本为目标平台后停止发送 Intent.ACTION_CLOSE_SYSTEM_DIALOGS intent。

LOCK_DOWN_COLLAPSE_STATUS_BAR

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,出于安全原因,需要 Manifest.permission.STATUS_BAR 权限才能收起状态栏面板。恶意软件正在利用该漏洞阻止用户访问重要通知。

LOW_POWER_EXCEPTIONS

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

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

MISSING_EXPORTED_FLAG

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

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

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

NATIVE_HEAP_POINTER_TAGGING_APP_ZYGOTE

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

对于以 Android 12(API 级别 32)及更高版本为目标平台的应用,AppZygote 进程及其子进程中的原生堆分配在最高有效字节中使用一个非零标记。

如需详细了解此变更,请参阅已加标记的指针

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
默认状态:对所有应用都处于停用状态。

启用后,可防止将 Display API 沙盒应用于信箱或 SCM activity。Display API 将继续提供 DisplayArea 边界。

如需详细了解此变更,请参阅 Android 12 行为变更页面中关于 已废弃的 Display 方法的部分。

NOTIFICATION_CANCELLATION_REASONS

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

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

NOTIFICATION_TRAMPOLINE_BLOCK

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

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

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

NULL_TELEPHONY_THROW_NO_CB

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

用于检查当前进程的目标 SDK 版本是否为 Android 12(API 级别 31)或更高版本。

适用于以下方法:

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(API 级别 31)或更高版本为目标平台的应用处于启用状态。

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

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

PREVENT_SETTING_PASSWORD_QUALITY_ON_PARENT

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

以 Android 12(API 级别 31)及更高版本为目标平台的管理应用,无法使用 DevicePolicyManager.setPasswordQuality(ComponentName, int) 为通过调用 DevicePolicyManager.getParentProfileInstance(ComponentName) 获得的 DevicePolicyManager 实例设置密码质量。 相反,它们应使用 DevicePolicyManager.setRequiredPasswordComplexity(int) 在设备范围内设置粗略的密码要求。

RATE_LIMIT_TOASTS

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

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

REQUIRE_EXACT_ALARM_PERMISSION

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,应用必须具有 Manifest.permission.SCHEDULE_EXACT_ALARM 权限才能使用任何 API 来设置精确的闹钟,例如 setExactAndAllowWhileIdle(int, long, PendingIntent)setAlarmClock(AlarmClockInfo, PendingIntent)

REQUIRE_READ_PHONE_STATE_PERMISSION_FOR_ACTIVE_DATA_SUB_ID

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,应用必须具有 Manifest.permission.READ_PHONE_STATE 权限才能调用 TelephonyCallback.ActiveDataSubscriptionIdListener

REQUIRE_READ_PHONE_STATE_PERMISSION_FOR_CELL_INFO

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,应用必须具有 Manifest.permission.READ_PHONE_STATE 权限才能调用 TelephonyCallback.CellInfoListener

REQUIRE_READ_PHONE_STATE_PERMISSION_FOR_DISPLAY_INFO

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,应用必须具有 Manifest.permission.READ_PHONE_STATE 权限才能调用 TelephonyCallback.DisplayInfoListener

RESTRICT_ADB_BACKUP

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,adb backup 会为作为可调试应用(android:debuggable 设为 true)运行的应用自动打开,并且不可用于任何其他应用。

RESTRICT_DOMAINS

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,必须使用更新后的应用链接验证 API 格式。此要求意味着,应用必须在包含以下所有项的 intent 过滤器内声明网域:

  • android:autoVerify="true"
  • Intent.ACTION_VIEW
  • Intent.CATEGORY_BROWSABLE
  • Intet.CATEGORY_DEFAULT
  • 只有 IntentFilter.SCHEME_HTTP 和/或 IntentFilter.SCHEME_HTTPS,没有其他方案

在之前的 Android 版本中,Intent.CATEGORY_BROWSABLE 不是必需的,可以使用其他方案,并且在任意 intent 过滤器中将 autoVerify 设置为 true 都会隐式假定所有 intent 过滤器都设置为 autoVerify="true"

SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE

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

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

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

SELINUX_LATEST_CHANGES

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

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

SETTINGS_API_V2

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

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

USE_SHORT_FGS_USAGE_INTERACTION_TIME

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

对于以 Android 12(API 级别 31)及更高版本为目标平台的应用,确定当应用启动前台服务时,是否先使用较小的超时值,然后再将待机模式存储分区提升为 ACTIVE