兼容性框架变更 (Android 11)

此页面描述了在 Android 11(API 级别 30)中添加到兼容性框架中的每个影响应用的行为变更。将此列表与开发者选项和 ADB 命令结合使用,在准备以 Android 11 为目标时测试和调试您的应用。

ADD_CONTENT_OBSERVER_FLAGS

变更 ID: 150939131

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

对于以 Android 11 为目标的应用,有一个新的公共 API 重载onChange(boolean, Uri, int),其中包含一个整数flags参数。

此新方法是使用包含整数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 的应用,访问 APN 数据库现在需要 Manifest.permission.WRITE_APN_SETTINGS 权限。

要了解有关此更改的更多信息,请参阅 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 时,现在会向 OnSharedPreferenceChangeListener.onSharedPreferenceChanged 回调,键值为 null

要了解有关此更改的更多信息,请参阅 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。但是,应用仍然可以使用 Toast.makeText(Context, CharSequence, int) 方法及其变体在后台发布 Toast。

要了解有关此更改的更多信息,请参阅 自定义 Toast 视图被阻止

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)或更高版本为目标的应用已启用。

文本 Toast 现在由 SystemUI 而不是应用内呈现。这可以防止应用绕过在后台发布自定义 Toast 的限制。

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

默认状态:对所有应用禁用。

启用应用中的采样本地内存错误检测。

要了解有关此更改的更多信息,请参阅 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,可以通过远程设备配置更新来更改。此限制使用 IllegalStateException 强制执行,当违规进程尝试注册过多侦听器时,TelephonyManager.listen(PhoneStateListener, int) 会抛出此异常。

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.runner(因为它依赖于 android.test.base 库中的类),则已删除 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

使用 `setlocationEnabled` (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)