行为变更:以 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

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试和调试应用中的平台行为变更

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

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

消息框的更新

来自后台的自定义消息框被屏蔽

出于安全方面的考虑,同时也为了保持良好的用户体验,如果包含自定义视图的消息框是以 Android 11 或更高版本为目标平台的应用从后台发送的,系统会屏蔽这些消息框。请注意,仍允许使用文本消息框;此类消息框是使用 Toast.makeText() 创建的,并不调用 setView()

如果您的应用仍尝试从后台发布包含自定义视图的消息框,系统不会向用户显示相应的消息,而是会在 logcat 中记录以下消息:

W/NotificationService: Blocking custom toast from package \
  <package> due to package not in the foreground

消息框回调

如果您希望在消息框(文本消息框或自定义消息框)出现或消失时收到通知,请使用 Android 11 中添加的 addCallback() 方法。

文本消息框 API 变更

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

无障碍服务

在清单文件中声明与 TTS 引擎的交互

由于软件包可见性发生了变更,因此以 Android 11 为目标平台且与文字转语音 (TTS) 引擎交互的应用需要将以下 <queries> 元素添加到其清单文件中:

<queries>
  <intent>
    <action
       android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

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

变更详情

变更名称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 开始,您的无障碍服务无法在运行时声明与系统的“无障碍”按钮相关联。如果您将 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON 附加到 AccessibilityServiceInfo 对象的 flags 属性,框架就不会将“无障碍”按钮回调事件传递给您的服务。

如需在无障碍服务中收到无障碍回调事件,请使用无障碍服务元数据文件声明您的服务与“无障碍”按钮的关联。在 accessibilityFlags 属性的定义中添加 flagRequestAccessibilityButton 值。无障碍服务元数据文件的常用位置为 res/raw/accessibilityservice.xml

摄像头

媒体 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(API 级别 30)或更高版本为目标平台的应用包含压缩的 resources.arsc 文件或者如果此文件未按 4 字节边界对齐,应用将无法安装。如果存在其中任一条件,系统就无法对此文件进行内存映射。无法进行内存映射的资源表必须读入 RAM 中的缓冲区,这会给系统带来不必要的内存压力,并大幅增加设备上的 RAM 使用量。

如果您之前使用的是经过压缩的 resources.arsc 文件,请尝试改用替代策略,例如缩减应用资源或其他方法来缩减、混淆和优化应用

现在需要 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 为目标平台且与语音识别服务交互的应用需要在其清单文件中添加以下 <queries> 元素:

<queries>
  <intent>
    <action
       android:name="android.speech.RecognitionService" />
  </intent>
</queries>

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(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 接口的限制