行为变更:以 Android 11 为目标平台的应用

与早期版本一样,Android 11 包含一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影响以 Android 11 或更高版本为目标平台的应用。如果您的应用将 targetSdkVersion 设置为 30,您应酌情修改自己的应用,以便正确支持这些行为。

此外,请务必查看对 Android 11 上运行的所有应用都有影响的行为变更列表。

隐私设置

Android 11 引入了一些变更和限制来加强用户隐私保护,其中包括:

  • 分区存储强制执行:对外部存储目录的访问仅限于应用专属目录,以及应用已创建的特定类型的媒体。
  • 自动重置权限:如果用户几个月未与应用互动,系统会自动重置应用的敏感权限。
  • 后台位置信息访问权限:用户必须转到系统设置,才能向应用授予后台位置信息权限。
  • 软件包可见性:当应用查询设备上已安装应用的列表时,系统会过滤返回的列表。

如需了解详情,请参阅隐私设置页面。

安全

堆指针标记

变更详情

变更名称NATIVE_HEAP_POINTER_TAGGING

变更 ID135754954

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

现在,堆指针在最高有效字节 (MSB) 中有一个非零标记。错误地使用指针的应用(包括修改 MSB 的应用)现在会崩溃或遇到其他问题。这是支持未来启用了 ARM 内存标记扩展 (MTE) 的硬件所必需的变更。如需了解详情,请参阅已加标记的指针

如需停用此功能,请参阅 allowNativeHeapPointerTagging 清单文档。

自定义消息框视图被屏蔽

变更详情

变更名称CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK

变更 ID128611929

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (128611929|CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK) PACKAGE_NAME
adb shell am compat disable (128611929|CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

从 Android 11 开始,已弃用自定义消息框视图。如果您的应用以 Android 11 为目标平台,包含自定义视图的消息框在从后台发布时会被屏蔽。如果您的应用以较低的 Android 版本为目标平台,自定义消息框视图可以继续正常工作,但不建议使用它们。

建议您尽可能改用信息提示控件。如果您的应用的用例阻止您使用信息提示控件(例如,当您需要向用户发送消息而您的应用在后台时),您仍然可以使用文本消息框,因为它们不受这项新行为变更的限制。

如需详细了解这些变更,请参阅 Android 11 中消息框的更新

连接性

限制对 APN 数据库的读取访问

变更详情

变更名称APN_READING_PERMISSION_CHANGE_ID

变更 ID124107808

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

以 Android 11 为目标平台的应用现在必须具备 Manifest.permission.WRITE_APN_SETTINGS 特权,才能读取或访问电话提供程序 APN 数据库。如果在不具备此权限的情况下尝试访问 APN 数据库,会生成安全异常。

无障碍

在元数据文件中声明“无障碍”按钮使用情况

变更详情

变更名称REQUEST_ACCESSIBILITY_BUTTON_CHANGE

变更 ID136293963

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
adb shell am compat disable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

从 Android 11 开始,您的无障碍服务无法在运行时声明与系统的“无障碍”按钮的关联。如果您将 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON 附加到 AccessibilityServiceInfo 对象的 flags 属性,框架就不会将“无障碍”按钮回调事件传递给您的服务。

应在您的无障碍服务元数据文件(通常为 res/raw/accessibilityservice.xml)中使用 flagRequestAccessibilityButton 标记声明您的无障碍服务与“无障碍”按钮的关联。

相机

媒体 intent 操作需要系统默认相机

从 Android 11 开始,只有预装的系统相机应用可以响应以下 intent 操作:

如果有多个预装的系统相机应用可用,系统会显示一个对话框,供用户选择应用。如果您希望自己的应用使用特定的第三方相机应用来代表其捕获图片或视频,可以通过为 intent 设置软件包名称或组件来使这些 intent 变得明确。

应用打包和安装

压缩的资源文件

变更详情

变更名称RESOURCES_ARSC_COMPRESSED

变更 ID132742131

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
adb shell am compat disable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

如果以 Android 11(API 级别 30)或更高版本为目标平台的应用包含压缩的 resources.arsc 文件或者如果此文件未按 4 字节边界对齐,应用将无法安装。如果存在其中任意一种情况,系统将无法对此文件进行内存映射。无法进行内存映射的资源表必须读入 RAM 中的缓冲区,从而给系统造成不必要的内存压力,并大大增加设备的 RAM 使用量。

现在需要 APK 签名方案 v2

对于以 Android 11(API 级别 30)为目标平台,且目前仅使用 APK 签名方案 v1 签名的应用,现在还必须使用 APK 签名方案 v2 或更高版本进行签名。用户无法在搭载 Android 11 的设备上安装或更新仅通过 APK 签名方案 v1 签名的应用。

如需验证您的应用是否已使用 APK 签名方案 v2 或更高版本进行签名,您可以在命令行中使用 Android Studioapksigner 工具。

Firebase

Firebase JobDispatcher 和 GCMNetworkManager

如果您的应用以 API 级别 30 或更高级别为目标平台,在搭载 Android 6.0(API 级别 23)或更高版本的设备上会停用 Firebase JobDispatcher 和 GcmNetworkManager API 调用。如需了解迁移,请参阅从 Firebase JobDispatcher 迁移到 WorkManager从 GCMNetworkManager 迁移到 WorkManager

设备到设备文件传输

如果您的应用以 Android 11 为目标平台,您将无法再使用 allowBackup 属性停用应用文件的设备到设备迁移。系统会自动启用此功能。

不过,即使您的应用以 Android 11 为目标平台,您也可以通过将 allowBackup 属性设置为 false 来停用应用文件的云端备份和恢复。

OnSharedPreferenceChangeListener 的回调变更

变更详情

变更名称CALLBACK_ON_CLEAR_CHANGE

变更 ID119147584

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
adb shell am compat disable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

对于以 Android 11(API 级别 30)为目标平台的应用,现在每次调用 Editor.clear 时,都会使用 null 键回调 OnSharedPreferenceChangeListener.onSharedPreferenceChanged

非 SDK 接口限制

Android 11 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。

如果您的应用并非以 Android 11 为目标平台,那么其中一些变更可能不会立即对您产生影响。不过,虽然您目前可以使用一些非 SDK 接口(具体取决于应用的目标 API 级别),但只要您使用任何非 SDK 方法或字段,应用无法运行的风险终归较高。

如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用,进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API

如需详细了解此 Android 版本中的变更,请参阅 Android 11 中有关限制非 SDK 接口的更新。如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制