兼容性框架变更 (Android 14)

图 1. 开发者选项中的应用兼容性变更屏幕列出了您可以切换的变更。

此页面描述了 Android 14(API 级别 34)中兼容性框架的一部分可切换变更。结合使用此列表和开发者选项和 ADB 命令,在准备支持和以 Android 14 为目标时测试和调试您的应用。

以下是一些您可以使用兼容性框架工具执行的操作

  • 在不实际更改应用的 targetSdkVersion 的情况下测试目标变更。您可以使用切换开关强制启用特定的目标行为变更,以评估其对现有应用的影响。
  • 仅专注于测试特定变更。切换开关使您无需一次解决所有目标变更,而是可以禁用所有目标变更,只保留您要针对其进行测试的变更。
  • 通过 adb 管理切换开关。您可以使用 adb 命令在自动化测试环境中启用和禁用可切换变更。
  • 使用标准变更 ID 更快地进行调试。每个可切换变更都有一个唯一的 ID 和名称,您可以使用它们在日志输出中快速调试根本原因。

有关在每个用例中使用这些工具的完整详细信息,请参阅兼容性框架工具

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

本节中的列表描述了 Android 14 中兼容性框架中包含的可切换变更。

您可以按其默认状态筛选变更列表。

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

ACCESS_SHARED_IDENTITY

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

如果应用通过使用 ActivityOptions 的实例启动此活动来选择加入共享其身份,其中 ActivityOptions.setShareIdentityEnabled(boolean) 被调用且值为 true,或者如果启动的活动的 UID 与启动应用的 UID 相同,则授予对启动应用身份的访问权限。当此变更启用且满足这些要求之一时,活动可以使用 Activity.getLaunchedFromUid()Activity.getLaunchedFromPackage() 分别访问启动应用的 UID 和包名称。

ANR_PRE_UDC_APIS_ON_SLOW_RESPONSES

变更 ID: 258236856
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

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

AUTHORITY_ACCESS_CHECK_CHANGE_ID

变更 ID: 207133734
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于以 Android 14(API 级别 34)及更高版本为目标的应用,启用检查所有与同步相关的 API 上调用 UID 的权限访问。

CAMERA_MIC_INDICATORS_NOT_PRESENT

变更 ID: 162547999
默认状态:对所有应用禁用。

指示此设备是否支持相机和麦克风指示灯。如果存在,则值为 false,因为如果变更 ID 不存在,则 CompatChanges#isChangeEnabled 方法将返回 true

DEFAULT_RESCIND_BAL_PRIVILEGES_FROM_PENDING_INTENT_SENDER

变更 ID: 244637991
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

当应用使用 PendingIntent#send() 或类似方法发送 PendingIntent 时,应用现在必须选择加入,如果它希望授予自己的后台活动启动权限以启动挂起的意图。

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

DETACH_THROWS_ISE_ONLY

变更 ID: 236825255
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

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

#detachImage 文档中说明,如果发生错误,将抛出 IllegalStateException;与此相关的原生辅助方法在分离 Image 时,如果界面被放弃,则会抛出 RuntimeException

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

Android 13(API 级别 33)之后,原生辅助方法仅根据文档抛出 IllegalStateExceptions

启用此更改后,#detachImage 仅在分离图像时遇到错误时才会抛出 IllegalStateException。对于目标 API 级别为 33 及以下的 Android 13 的应用,行为保持不变。

DOWNSCALED

变更 ID: 168419799
默认状态:对所有应用禁用。

此更改是所有每个应用缓冲区降尺度更改的闸门。启用此更改后,允许应用以下缩放比例:

为应用包启用此更改时,应用将强制调整为最高启用的缩放比例。例如,如果启用了 80% 和 70%(DOWNSCALE_80DOWNSCALE_70),则使用 80%。当此更改和 DOWNSCALED_INVERSE 都启用时,DOWNSCALED_INVERSE 优先,缩放比例将反向应用。

DOWNSCALED_INVERSE

变更 ID: 273564678
默认状态:对所有应用禁用。

此更改是所有每个应用缓冲区反向降尺度更改的闸门。启用此更改后,允许将以下缩放比例反向应用(即,分辨率将向上扩展)

为应用包启用此更改时,应用将强制调整为最低启用的缩放比例。例如,如果启用了 80% 和 70%(DOWNSCALE_80DOWNSCALE_70),则使用 80%,因为反向应用时,80% 的缩放比例等于 125%,小于反向应用 70% 缩放比例时应用的 142.86% 缩放比例。当此更改和 DOWNSCALED 都启用时,DOWNSCALED_INVERSE 优先,缩放比例将反向应用。

DOWNSCALE_30

变更 ID: 189970040
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 30% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 333.33% 的显示器上。

DOWNSCALE_35

变更 ID: 189969749
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 35% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 285.71% 的显示器上。

DOWNSCALE_40

变更 ID: 189970038
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 40% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 250% 的显示器上。

DOWNSCALE_45

变更 ID: 189969782
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 45% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 222.22% 的显示器上。

DOWNSCALE_50

变更 ID: 176926741
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 50% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 200% 的显示器上。

DOWNSCALE_55

变更 ID: 189970036
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 55% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 181.82% 的显示器上。

DOWNSCALE_60

变更 ID: 176926771
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 60% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 166.67% 的显示器上。

DOWNSCALE_65

变更 ID: 189969744
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 65% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 153.85% 的显示器上。

DOWNSCALE_70

变更 ID: 176926829
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 70% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 142.86% 的显示器上。

DOWNSCALE_75

变更 ID: 189969779
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 75% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 133.33% 的显示器上。

DOWNSCALE_80

变更 ID: 176926753
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 80% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 125% 的显示器上。

DOWNSCALE_85

变更 ID: 189969734
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 85% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 117.65% 的显示器上。

DOWNSCALE_90

变更 ID: 182811243
默认状态:对所有应用禁用。

如果还启用了 DOWNSCALED,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 90% 的显示器上。如果还启用了 DOWNSCALED_INVERSE,则为某个包启用此更改会强制应用假定它正在运行在垂直和水平分辨率为实际显示器 111.11% 的显示器上。

ENABLE_PLATFORM_MDNS_BACKEND

变更 ID: 270306772
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

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

ENABLE_SELF_CERTIFIED_CAPABILITIES_DECLARATION

变更 ID: 266524688
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

目标 API 级别为 14 或更高的应用启用了自签名功能检查。有关详细信息,请参阅 NetworkCapabilities

ENFORCE_PACKAGE_VISIBILITY_FILTERING

变更 ID: 154726397
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于目标 API 级别为 34 及更高的 Android 14 应用,要求应用在清单中声明包可见性需求才能访问 AccountManager API。

ENFORCE_READ_ONLY_JAVA_DCL

变更 ID: 218865702
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于目标 API 级别为 34 及更高的 Android 14 应用,要求所有动态加载的文件都标记为只读。这可以防止动态加载的文件意外被恶意行为者覆盖。

要了解有关此更改的更多信息,请参阅 Android 14 行为更改页面中有关 更安全的动态代码加载 的部分。

ENFORCE_STRICT_QUERY_BUILDER

变更 ID: 143231523
默认状态:对所有应用禁用。

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

EXACT_LISTENER_ALARMS_DROPPED_ON_CACHED

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

当调用应用进入缓存状态时,期望 AlarmManager.OnAlarmListener 回调的精确闹钟将被丢弃。

要了解有关 Android 14 中对精确闹钟的更改的更多信息,请参阅 默认情况下拒绝安排精确闹钟

FGS_TYPE_CHECK_FOR_INSTANT_APPS

变更 ID: 261055255
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

启用后,即时应用必须为其清单文件中声明的任何服务指定适当的前台服务类型。

要了解有关此更改的更多信息,请参阅描述 前台服务类型更改 的页面。

FGS_TYPE_NONE_DEPRECATION_CHANGE_ID

变更 ID: 255042465
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

启用后,目标 API 级别为 34 及更高的 Android 14 应用,如果使用已弃用的 FOREGROUND_SERVICE_TYPE_NONE 类型启动前台服务,则会在日志中生成警告。

要了解有关此更改的更多信息,请参阅描述 前台服务类型更改 的页面。

FGS_TYPE_NONE_DISABLED_CHANGE_ID

变更 ID: 255038118
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

启用后,面向 Android 14(API 级别 34)及更高版本的应用,如果使用已弃用的 FOREGROUND_SERVICE_TYPE_NONE 类型启动前台服务,将导致异常。

要了解有关此更改的更多信息,请参阅描述 前台服务类型更改 的页面。

FGS_TYPE_PERMISSION_CHANGE_ID

变更 ID: 254662522
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

启用后,面向 Android 14(API 级别 34)及更高版本的应用,如果在启动前台服务时未提供与其类型关联的必需权限,将导致 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
默认状态:对所有应用禁用。

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

要了解有关使用 GWP-ASan 的更多信息,请参阅 GWP-ASan 指南

IMPLICIT_INTENTS_ONLY_MATCH_EXPORTED_COMPONENTS

变更 ID: 229362273
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于面向 Android 14(API 级别 34)及更高版本的应用,组件必须导出才能通过隐式意图调用它们。如果未导出组件并已调用,则将其从接收者列表中删除。这具体适用于活动和广播。

要了解有关此更改的更多信息,请参阅 Android 14 行为更改页面中关于 隐式意图和挂起意图的限制 的部分。

变更 ID: 266201607
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于面向 Android 14(API 级别 34)及更高版本的应用,应用必须在每次 MediaProjection 捕获会话之前请求用户授予同意。

要了解有关此更改的更多信息,请参阅 Android 14 行为更改页面中关于 每次 MediaProjection 捕获会话都需要用户同意 的部分。

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 在 SYNC 模式下启用。

OVERRIDE_ANY_ORIENTATION

变更 ID: 265464455
默认状态:对所有应用禁用。

启用后,此更改允许应用以下方向覆盖,而不管活动请求的方向如何

OVERRIDE_CAMERA_RESIZABLE_AND_SDK_CHECK

变更 ID: 191514214
默认状态:对所有应用禁用。

启用后,此更改强制其应用到的软件包忽略 android:resizeableActivity 的当前值以及目标 SDK 等于或低于 M 的值,并将活动视为不可调整大小。在这种情况下,相机旋转和裁剪的值仅取决于考虑当前显示旋转所需的补偿。

OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS

变更 ID: 189229956
默认状态:对所有应用禁用。

启用后,此更改强制其应用到的软件包覆盖默认的相机旋转和裁剪行为,并始终返回 CaptureRequest.SCALER_ROTATE_AND_CROP_NONE

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

变更 ID: 266124927
默认状态:对所有应用禁用。

为其应用到的应用启用 SCREEN_ORIENTATION_REVERSE_LANDSCAPE。除非还启用了 OVERRIDE_ANY_ORIENTATION,否则仅当活动指定横向方向时才使用 SCREEN_ORIENTATION_REVERSE_LANDSCAPE。启用此更改可以帮助您测试应用在横向方向对应于 Surface.ROTATION_90 的设备和对应于 Surface.ROTATION_270 的设备之间的行为差异。

OVERRIDE_MIN_ASPECT_RATIO

变更 ID: 174042980
默认状态:对所有应用禁用。

此更改是强制给定最小纵横比的所有更改的守护程序。启用此更改允许应用以下最小纵横比

如果为应用软件包启用了此更改,则应用清单中给出的最小纵横比将被覆盖为启用的最大纵横比,除非应用清单的值更高。

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

变更 ID: 218959984
默认状态:对所有应用禁用。

启用后,会覆盖纵向全屏中的最小纵横比限制,以使用所有可用的屏幕空间。

OVERRIDE_MIN_ASPECT_RATIO_LARGE

变更 ID: 180326787
默认状态:对所有应用禁用。

如果还启用了 OVERRIDE_MIN_ASPECT_RATIO,则为软件包启用此更改会将活动的最小纵横比设置为由 OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE 定义的大值。

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

变更 ID: 180326845
默认状态:对所有应用禁用。

如果还启用了 OVERRIDE_MIN_ASPECT_RATIO,则为软件包启用此更改会将活动的最小纵横比设置为由 OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE 定义的中值。

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

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

如果还启用了 OVERRIDE_MIN_ASPECT_RATIO,则此更改会将任何其他强制活动最小纵横比为特定值的更改(例如 OVERRIDE_MIN_ASPECT_RATIO_LARGEOVERRIDE_MIN_ASPECT_RATIO_MEDIUM)限制为也具有纵向方向的活动。

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

变更 ID: 236283604
默认状态:对所有应用禁用。

启用后,此更改会将应用到的软件包排除在设备制造商可以设置的忽略方向限制之外。

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

变更 ID: 265451093
默认状态:对所有应用禁用。

为其应用到的应用启用 SCREEN_ORIENTATION_NOSENSOR。除非还启用了 OVERRIDE_ANY_ORIENTATION,否则仅当活动未指定任何其他固定方向时才使用 SCREEN_ORIENTATION_NOSENSOR

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

变更 ID: 265452344
默认状态:对所有应用禁用。

为其应用到的应用启用 SCREEN_ORIENTATION_PORTRAIT。除非还启用了 OVERRIDE_ANY_ORIENTATION,否则仅当活动未指定任何其他固定方向时才使用 SCREEN_ORIENTATION_PORTRAIT

RATE_LIMIT_TOASTS

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

启用对 Toast.show() 调用的数量进行速率限制,以防止在有限的时间内向用户显示过多的吐司而造成负担。任何尝试在某个时间范围内显示超出允许数量的吐司都会导致该吐司被丢弃。

REJECT_NEGATIVE_NETWORK_ESTIMATES

变更 ID: 253665015
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

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

REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS

变更 ID: 241104082
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于面向 Android 14(API 级别 34)及更高版本的应用,如果包含的 JobWorkItem 指示网络使用情况,则要求托管作业指定网络约束。

REQUIRE_NETWORK_PERMISSIONS_FOR_CONNECTIVITY_JOBS

变更 ID: 271850009
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于面向 Android 14(API 级别 34)及更高版本的应用,在计划具有连接约束的作业时,要求应用同时指定 INTERNETACCESS_NETWORK_STATE 权限。

THROW_ON_INVALID_DATA_TRANSFER_IMPLEMENTATION

变更 ID: 255371817
默认状态:对以 Android 14(API 级别 34)或更高版本为目标的应用启用。

对于面向 Android 14(API 级别 34)及更高版本的应用,如果应用在指定用户启动的数据传输作业时未正确实现所有必要的数据传输 API,则系统会抛出异常。

要了解有关此更改的更多信息,请参阅描述如何 将前台服务迁移到用户启动的数据传输作业 的页面。

USE_EXPERIMENTAL_COMPONENT_ALIAS

变更 ID: 196254758
默认状态:对所有应用禁用。

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