兼容性框架变更 (Android 14)

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

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

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

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

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

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

此部分的列表中介绍了 Android 14 中的兼容性框架包含的可切换变更。

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

Android 14 兼容性框架中包含的可切换变更

ACCESS_SHARED_IDENTITY

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

如果应用通过对 ActivityOptions 的实例调用 ActivityOptions.setShareIdentityEnabled(boolean) 且值为 true,启动相应 activity 来选择分享自己的身份,或是被启动 activity 的 uid 与启动应用的 uid 相同,则系统将授予对启动应用的身份进行访问的权限。启用此变更并且满足其中某项要求后,activity 就可以分别通过 Activity.getLaunchedFromUid()Activity.getLaunchedFromPackage() 访问启动应用的 uid 和软件包名称。

ALWAYS_SANDBOX_DISPLAY_APIS

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

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

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

ANR_PRE_UDC_APIS_ON_SLOW_RESPONSES

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

启用后,如果应用在 Android 13(API 级别 33)或更低版本中的 API 和功能上响应缓慢,则会触发“应用无响应”(ANR) 消息。

AUTHORITY_ACCESS_CHECK_CHANGE_ID

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

对于以 Android 14 及更高版本为目标平台的应用,允许在所有与同步相关的 API 上检查发起调用 UID 的访问权限。

CAMERA_MIC_INDICATORS_NOT_PRESENT

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

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

DEFAULT_RESCIND_BAL_FG_PRIVILEGES_BOUND_SERVICE

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

现在,当应用使用 PendingIntent#send() 或类似方法发送 PendingIntent 时,如果它想要授予自己的后台 activity 启动待处理 intent 的启动特权,则必须选择启用。

如需详细了解此变更,请参阅 Android 14 行为变更页面中与从后台启动 activity 有关的其他限制部分。

DETACH_THROWS_ISE_ONLY

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

用于限制 #detachImage 抛出正确异常的标志。

#detachImage 记录为在出现错误时抛出 IllegalStateException;如果 Surface 在分离 Image 时被丢弃,则相应的原生辅助方法会抛出 RuntimeException

这种之前未记录的异常行为会持续到 Android 13(API 级别 33)。

在 Android 13(API 级别 33)之后,原生辅助方法仅会按照文档抛出 IllegalStateExceptions

启用此更改后,#detachImage 仅在分离映像的过程中遇到错误时抛出 IllegalStateException。对于以 Android 13(API 级别 33)及更低版本为目标平台的应用,其行为保持不变。

DOWNSCALED

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

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

为某个应用软件包启用此变更后,系统会按照已启用的最大缩放比例强制调整该应用的大小。例如,如果同时启用了 80% 和 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% 的显示屏上运行。

DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED

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

启用后,在代码中为不受保护的广播注册接收器时,需要应用显式设置 Context.RECEIVER_EXPORTEDContext.RECEIVER_NOT_EXPORTED

如需了解详情,请参阅更安全地导出上下文注册的接收器部分。

ENABLE_PLATFORM_MDNS_BACKEND

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

以 Android 14 或更高版本为目标平台的应用使用平台集成的 mDNS 实现作为后端,而以先前版本为目标平台的应用会继续使用旧版网络服务发现 (NSD) 后端(旧版原生守护程序为 NsdManager 后端)。

ENABLE_SELF_CERTIFIED_CAPABILITIES_DECLARATION

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

以 Android 14 或更高版本为目标平台的应用启用了自行认证功能检查。如需了解详情,请参阅 NetworkCapabilities

ENFORCE_PACKAGE_VISIBILITY_FILTERING

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

对于以 Android 14 及更高版本为目标平台的应用,要求应用在清单中声明软件包可见性需求,以便访问 AccountManager API。

ENFORCE_READ_ONLY_JAVA_DCL

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

对于以 Android 14 及更高版本为目标平台的应用,需要将所有动态加载的文件标记为只读。这可以防止动态加载的文件被恶意操作方意外覆盖。

ENFORCE_STRICT_QUERY_BUILDER

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

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

FGS_TYPE_CHECK_FOR_INSTANT_APPS

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

启用后,免安装应用必须为应用清单文件中声明的所有服务指定适当的前台服务类型。

如需详细了解此变更,请参阅介绍前台服务类型变更页面。

FGS_TYPE_NONE_DEPRECATION_CHANGE_ID

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

启用后,以 Android 14 及更高版本为目标平台且使用已废弃的 FOREGROUND_SERVICE_TYPE_NONE 类型启动前台服务的应用会导致日志中显示警告。

如需详细了解此变更,请参阅介绍前台服务类型变更页面。

FGS_TYPE_NONE_DISABLED_CHANGE_ID

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

启用后,以 Android 14 及更高版本为目标平台且使用已废弃的 FOREGROUND_SERVICE_TYPE_NONE 类型启动前台服务的应用会导致异常。

如需详细了解此变更,请参阅介绍前台服务类型变更页面。

FGS_TYPE_PERMISSION_CHANGE_ID

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

启用后,如果应用以 Android 14 及更高版本为目标平台,且在启动前台服务时没有与该前台服务类型相关联的必要权限,则会导致 SecurityException

如需详细了解此变更,请参阅介绍前台服务类型变更页面。

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

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

FORCE_RESIZE_APP

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

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

GWP_ASAN

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

在应用中启用采样原生内存 bug 检测。

如需详细了解如何使用 GWP-ASan,请参阅 GWP-ASan 指南

IMPLICIT_INTENTS_ONLY_MATCH_EXPORTED_COMPONENTS

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

对于以 Android 14 及更高版本为目标平台的应用,必须导出组件,才能通过隐式 intent 调用这些组件。如果某个组件未导出和调用,则将从接收器列表中被移除。这专门适用于 activity 和广播。

KEYSTORE_OPERATION_CREATION_MAY_FAIL

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

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

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

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

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

NATIVE_HEAP_ZERO_INIT

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

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

NATIVE_MEMTAG_ASYNC

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

在此过程中启用异步 (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 方法的部分。

OVERRIDE_CAMERA_RESIZABLE_AND_SDK_CHECK

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

启用后,此变更 ID 会强制使应用该变更的软件包:忽略 android:resizeableActivity 的当前值,以 Android M SDK 或更低版本为目标,并将该 activity 视为无法调整尺寸。在这种情况下,鉴于当前显示屏旋转情况,摄像头画面旋转和剪裁的值仅取决于所需的补偿值。

OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS

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

启用后,此变更 ID 会强制使应用该变更的软件包替换默认的摄像头画面旋转和剪裁行为,并始终返回 CaptureRequest.SCALER_ROTATE_AND_CROP_NONE。下表讨论了默认行为以及所有可能的替换组合。

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 定义的中等值。

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

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

如果同时还启用了 OVERRIDE_MIN_ASPECT_RATIO,则为软件包启用此变更便会限制有以下作用的任何其他变更:强制将相应 activity 的最小宽高比设为某个值(例如 OVERRIDE_MIN_ASPECT_RATIO_LARGEOVERRIDE_MIN_ASPECT_RATIO_MEDIUM),而让这些变更仅作用于还包含纵向屏幕方向的 activity。

RATE_LIMIT_TOASTS

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

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

REJECT_NEGATIVE_NETWORK_ESTIMATES

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

启用后,会要求估算的网络字节数为非负数。

REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS

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

对于以 Android 14 及更高版本为目标平台的应用,如果所包含的 JobWorkItem 指示网络使用情况,则要求托管作业指定网络约束条件。

REQUIRE_NETWORK_PERMISSIONS_FOR_CONNECTIVITY_JOBS

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

对于以 Android 14 及更高版本为目标平台的应用,要求应用同时指定 INTERNETACCESS_NETWORK_STATE 权限。

THROW_ON_INVALID_DATA_TRANSFER_IMPLEMENTATION

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

对于以 Android 14 及更高版本为目标平台的应用,如果应用未正确实现所有必要的数据传输 API,系统会抛出异常。

USE_EXPERIMENTAL_COMPONENT_ALIAS

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

启用后,系统将允许“android”软件包使用组件别名。