兼容性框架变更 (Android 11)

本页将介绍 Android 11(API 级别 30)的兼容性框架中增加的每项会影响应用的行为变更。在准备以 Android 11 为目标平台时,请将此列表与开发者选项和 ADB 命令结合使用,以测试和调试您的应用。

ADD_CONTENT_OBSERVER_FLAGS

变更 ID:150939131

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

对于以 Android 11 为目标平台的应用,系统会提供一个包含整数 flags 参数的新的公共 API 重载 onChange(boolean, Uri, int)

对于使用包含整数 userId 参数的非 SDK onChange() 重载方法的应用,该新方法是一种公共 SDK 方法。

ADMIN_APP_PASSWORD_COMPLEXITY

变更 ID:123562444

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

对于以 Android 11 为目标平台的管理应用,每当应用设置的密码要求与当前指定的密码质量不相符时,系统就会抛出错误。例如,当密码质量设置为 DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED 时,应用将无法设置最小密码长度。在这种情况下,在尝试设置最小密码长度之前,应用应首先调用 setPasswordQuality() 方法,然后才能调用 setPasswordMinimumLength() 方法。

此外,如果以 Android 11 为目标平台的管理应用降低密码质量,任何不再适用的现有密码要求都会重置为其默认值。

APP_DATA_DIRECTORY_ISOLATION

变更 ID:143937733

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

以 Android 11 为目标平台的应用不能再访问任何应用的私有数据目录中的文件,而不管其他应用的目标 SDK 版本是什么。

如需了解详情,请参阅访问私有目录

APN_READING_PERMISSION_CHANGE_ID

变更 ID:124107808

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

对于以 Android 11 为目标平台的应用,现在必须具备 Manifest.permission.WRITE_APN_SETTINGS 权限才能访问 APN 数据库。

如需详细了解此变更,请参阅限制对 APN 数据库的读取访问

BACKGROUND_RATIONALE_CHANGE_ID

变更 ID:147316723

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

现在,应用每次在后台请求访问设备的位置信息时,都必须提供有效的理由。

如需详细了解此变更,请参阅有关如何在 Android 11 中访问后台位置信息的指南,该指南介绍了 Android 11 中与位置信息相关的隐私权变更。

CALLBACK_ON_CLEAR_CHANGE

变更 ID:119147584

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

现在每次调用 Editor.clear 时,都会使用 null 键回调 OnSharedPreferenceChangeListener.onSharedPreferenceChanged

如需详细了解此变更,请参阅 OnSharedPreferenceChangeListener 的回调变更

CALLBACK_ON_MORE_ERROR_CODE_CHANGE

变更 ID:130595455

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

错误代码现在针对 updateAvailableNetworks(List, Executor, Consumer)setPreferredOpportunisticDataSubscription(int, boolean, Executor, Consumer) 进行了扩展。

CALL_BACK_ON_CHANGED_LISTENER_WITH_SWITCHED_OP_CHANGE

变更 ID:148180766

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

这是 startWatchingMode(String, String, AppOpsManager.OnOpChangedListener) 的细微行为变更。在进行此变更之前,系统会针对切换的操作回调。在进行此变更之后,系统会针对实际请求的操作回调;如果未指定操作,就会针对所有切换的操作回调。

CAMERA_MICROPHONE_CAPABILITY_CHANGE_ID

变更 ID:136219221

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

对于以 Android 11 为目标平台的应用,只有在清单文件中将 R.attr.foregroundServiceType 分别配置为 ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERAServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE 时,前台服务才会接收正在使用的摄像头和麦克风功能。在较低版本的 Android 系统中,前台服务会自动接收摄像头和麦克风功能。

如需详细了解此变更,请参阅 Android 11 中的前台服务类型

CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK

变更 ID:128611929

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

应用无法再在后台发布自定义消息框。但是,应用在后台仍然可以使用 Toast.makeText(Context, CharSequence, int) 方法及其变体发布消息框。

如需详细了解此变更,请参阅自定义消息框视图被屏蔽

CHANGE_RESTRICT_SAW_INTENT

变更 ID:135920175

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

使用 android.settings.MANAGE_APP_OVERLAY_PERMISSION 操作和 package 数据 URI 架构的 intent 不再将用户引导至应用专用屏幕以管理相关权限。相反,用户会被引导至另一个屏幕,在该屏幕中,用户可以管理所有已请求该权限的应用。

CHANGE_TEXT_TOASTS_IN_THE_SYSTEM

变更 ID:147798919

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

文本消息框现在由 SystemUI 呈现,而不是在应用内呈现。这样可防止应用规避对在后台发布自定义消息框的限制。

DEFAULT_SCOPED_STORAGE

变更 ID:149924527

默认状态:对于所有应用处于启用状态。

以 Android 11 为目标平台的所有应用现在都默认使用分区存储,并且不能再停用分区存储

不过,无论您应用的目标 SDK 版本和清单标记值是什么,您都可以在不使用分区存储的情况下测试应用,只需关闭此变更即可。

如需详细了解 Android 11 中分区存储的变更,请转到关于 Android 11 中 Android 存储变更的页面,请参阅分区存储部分。

EMPTY_INTENT_ACTION_CATEGORY

变更 ID:151163173

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

对于以 Android 11 为目标平台的应用,如果 intent 过滤器的 actioncategory 为空字符串,系统现在会抛出错误。Android 11 之前的平台中有一个错误,允许系统在这种情况下继续运行,而不抛出错误。请注意,这不包括相应属性为 null 或缺失的情况,因为在此类情况下始终都会抛出错误。

FILTER_APPLICATION_QUERY

变更 ID:135549675

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

应用现在需要先声明想要使用的软件包和 intent,然后才能获取有关设备上其他应用的详细信息。应用必须在其清单中使用 <queries> 标记进行声明。

如需详细了解如何在 Android 11 中查询安装的其他应用并与之交互,请参阅软件包可见性隐私权页面。

FORCE_ENABLE_SCOPED_STORAGE

变更 ID:值 - 132649864

默认状态:对于所有应用处于停用状态。

以 Android 11 为目标平台的所有应用现在都默认使用分区存储,并且不能再停用分区存储

但是,如果您的应用仍以 Android 10(API 级别 29)或更低版本为目标平台,无论应用的目标 SDK 版本和清单标记值是什么,您都可以在使用分区存储的情况下测试应用,只需开启此变更即可。

如需详细了解 Android 11 中分区存储的变更,请转到关于 Android 11 中 Android 存储变更的页面,请参阅分区存储部分。

GET_DATA_CONNECTION_STATE_R_VERSION

变更 ID:148535736

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

检查 PreciseDataConnectionState#getDataConnectionState 的 SDK 版本。

GET_DATA_STATE_R_VERSION

变更 ID:148534348

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

检查 getDataState() 的 SDK 版本。

GET_PROVIDER_SECURITY_EXCEPTIONS

变更 ID:150935354

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

对于以 Android 11(API 级别 30)或更高版本为目标平台的应用,getProvider(String) 不再抛出任何安全异常。

GET_TARGET_SDK_VERSION_CODE_CHANGE

变更 ID:145147528

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

检查 SmsManager.sendResolverResult() 方法的 SDK 版本。

GWP_ASAN

变更 ID:135634846

默认状态:对于所有应用处于停用状态。

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

如需详细了解此变更,请参阅 GWP-ASan 指南

HIDE_MAXTARGETSDK_P_HIDDEN_APIS

变更 ID:149997251

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

对于以 Android 10(API 级别 29)或更高版本为目标平台的应用,移除了对 Android 10(API 级别 29)的 max-target-p (greylist-max-p) 列表中所有非 SDK 接口的访问权限。

HIDE_MAXTARGETSDK_Q_HIDDEN_APIS

变更 ID:149994052

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

对于以 Android 11(API 级别 30)或更高版本为目标平台的应用,移除了对 Android 11(API 级别 30)的 max-target-q (greylist-max-q) 列表中所有非 SDK 接口的访问权限。

如需详细了解此变更,请参阅 Android 11 中现在被屏蔽的非 SDK 接口

LISTEN_CODE_CHANGE

变更 ID:147600208

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

检查 TelephonyManager.listen(PhoneStateListener, int) 的 SDK 版本。

MISSING_APP_TAG

变更 ID:150776642

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

对于以 Android 11 为目标平台的应用,如果应用的清单文件缺少 applicationinstrumentation 标记,系统现在会抛出错误。

NATIVE_HEAP_POINTER_TAGGING

变更 ID:135754954

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

对于以 Android 11 为目标平台的应用,现在原生堆分配在最高有效字节中有一个非零标记。

如需了解详情,请参阅堆指针标记

PHONE_STATE_LISTENER_LIMIT_CHANGE_ID

变更 ID:150880553

默认状态:对于所有应用处于启用状态。

对于以 Android 11 为目标平台的应用,现在对任何进程可通过 TelephonyManager.listen(PhoneStateListener, int) 注册的 PhoneStateListener 对象数量施加了限制。默认限制为 50,该值可能会因远程设备配置更新而发生变化。当违规进程试图注册过多的监听器时,TelephonyManager.listen(PhoneStateListener, int) 会抛出 IllegalStateException,从而强制执行此限制。

PREVENT_META_REFLECTION_BLACKLIST_ACCESS

变更 ID:142365358

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

以 Android 11 为目标平台的应用不能再使用额外的反射层访问受限制的非 SDK 接口。

PROCESS_CAPABILITY_CHANGE_ID

变更 ID:136274596

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

对于以 Android 11 为目标平台的应用,现在可以使用 Context.BIND_INCLUDE_CAPABILITIES 标记将正在使用的功能从客户端进程传递到绑定服务。

REMOVE_ANDROID_TEST_BASE

变更 ID:133396946

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

对于以 Android 11 为目标平台的应用,已将 android.test.base 库移除,前提是应用不依赖于 android.test.runner(因为它依赖于 android.test.base 库中的类)。

REQUEST_ACCESSIBILITY_BUTTON_CHANGE

变更 ID:136293963

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

对于以 Android 11 为目标平台的无障碍服务,现在必须在无障碍服务元数据文件中指定 FLAG_REQUEST_ACCESSIBILITY_BUTTON 标记。否则,该标记会被忽略。

如需详细了解此变更,请参阅在元数据文件中声明“无障碍”按钮使用情况

RESOURCES_ARSC_COMPRESSED

变更 ID:132742131

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

如果以 Android 11(API 级别 30)为目标平台的应用包含压缩的 resources.arsc 文件或者如果此文件未按 4 字节边界对齐,应用将无法安装。

如需详细了解此变更,请参阅压缩的资源文件

RESTRICT_STORAGE_ACCESS_FRAMEWORK

变更 ID:141600225

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

如果您的应用以 Android 11 为目标平台并使用存储访问框架 (SAF),您就无法再使用 ACTION_OPEN_DOCUMENTACTION_OPEN_DOCUMENT_TREE intent 操作访问某些目录。如需详细了解这些变更,请转到介绍 Android 11 中与存储相关的隐私权更新的页面,请参阅文档访问限制部分

SELINUX_LATEST_CHANGES

变更 ID:143539591

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

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

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

THROW_SECURITY_EXCEPTIONS

变更 ID:147340954

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

在 Android 11 之前,SecurityException 只会因权限错误而被 setEnabled API 抛出。在 Android 11 中,情况不再如此,SecurityException 可以因多种原因而被抛出,并且这些原因不会为调用方所知晓。

为了维持现有的 API 行为,如果不是以 Android 11 为目标平台的应用发生原来的权限失败或操作方强制执行失败,该异常会被强制转换为存在于 Android 11 之前的源代码中的 IllegalStateException

USE_SET_LOCATION_ENABLED

变更 ID:117835097

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

以 Android 11 为目标平台的管理应用不能再使用 DevicePolicyManager.setSecureSetting(ComponentName, String, String) 更改已弃用的 Settings.Secure.LOCATION_MODE 设置,而应改用 DevicePolicyManager.setLocationEnabled(ComponentName, boolean)