与早期版本一样,Android 11 包含可能影响您的应用的行为变更。以下行为变更仅适用于以 Android 11 或更高版本为目标平台的应用。如果您的应用将 targetSdkVersion
设置为 30
,您应该修改您的应用以正确支持这些行为(如果适用)。
请务必同时查看影响在 Android 11 上运行的所有应用的行为变更列表。
隐私
Android 11 引入了多项变更和限制以增强用户隐私,包括以下内容:
- 分区存储强制执行:对外部存储目录的访问仅限于应用专用目录和应用创建的特定媒体类型。
- 权限自动重置:如果用户几个月未与应用互动,系统会自动重置应用的敏感权限。
- 后台位置信息访问:用户必须被引导至系统设置才能授予应用后台位置信息权限。
- 软件包可见性:当应用查询设备上已安装应用列表时,返回的列表会被过滤。
要了解更多信息,请参阅隐私页面。
安全
堆指针标记
变更详情
变更名称:NATIVE_HEAP_POINTER_TAGGING
变更 ID:135754954
如何切换
在测试您的应用与 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
清单文档。
Toast 更新
阻止来自后台的自定义 Toast
出于安全原因并为了保持良好的用户体验,如果以 Android 11 或更高版本为目标平台的应用从后台发送包含自定义视图的 Toast,系统会阻止此类 Toast。请注意,文本 Toast 仍然允许;这些 Toast 是使用 Toast.makeText()
创建且未调用 setView()
的 Toast。
如果您的应用无论如何尝试从后台发布包含自定义视图的 Toast,系统不会向用户显示该消息。相反,系统会在 logcat 中记录以下消息:
W/NotificationService: Blocking custom toast from package \ <package> due to package not in the foreground
Toast 回调
如果您希望在 Toast(文本或自定义)显示或消失时收到通知,请使用 Android 11 中添加的 addCallback()
方法。
文本 Toast API 变更
以 Android 11 或更高版本为目标平台的应用会看到文本 Toast 的以下副作用:
getView()
方法返回null
。- 以下方法的返回值不反映实际值,因此您不应在应用中依赖它们:
- 以下方法是空操作,因此您的应用不应使用它们:
连接
APN 数据库的受限读取访问
变更详情
变更名称:APN_READING_PERMISSION_CHANGE_ID
变更 ID:124107808
如何切换
在测试您的应用与 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
特权权限才能读取或访问 Telephony 提供程序 APN 数据库。尝试在没有此权限的情况下访问 APN 数据库会生成安全异常。
无障碍功能
在清单文件中声明与 TTS 引擎的互动
由于软件包可见性的变更,以 Android 11 为目标平台并与文本转语音 (TTS) 引擎互动应用需要向其清单文件添加以下 <queries>
元素:
<queries> <intent> <action android:name="android.intent.action.TTS_SERVICE" /> </intent> </queries>
在元数据文件中声明无障碍功能按钮使用情况
变更详情
变更名称:REQUEST_ACCESSIBILITY_BUTTON_CHANGE
变更 ID:136293963
如何切换
在测试您的应用与 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 操作:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
如果存在多个预安装的系统相机应用,系统会显示一个对话框供用户选择一个应用。如果您的应用希望使用特定的第三方相机应用代表其捕获图像或视频,您可以通过为 Intent 设置软件包名称或组件来使这些 Intent 明确。
应用打包和安装
压缩资源文件
变更详情
变更名称:RESOURCES_ARSC_COMPRESSED
变更 ID:132742131
如何切换
在测试您的应用与 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 Studio,或命令行上的 apksigner
工具。
Firebase
Firebase JobDispatcher 和 GCMNetworkManager
如果您的应用目标 API 级别为 30 或更高,Firebase JobDispatcher 和 GcmNetworkManager API 调用将在运行 Android 6.0 (API 级别 23) 或更高版本的设备上被禁用。有关迁移信息,请参阅从 Firebase JobDispatcher 迁移到 WorkManager 和从 GCMNetworkManager 迁移到 WorkManager。
语音识别
由于软件包可见性的变更,以 Android 11 为目标平台并与语音识别服务互动应用需要向其清单文件添加以下 <queries>
元素:
<queries> <intent> <action android:name="android.speech.RecognitionService" /> </intent> </queries>
OnSharedPreferenceChangeListener 的回调变更
变更详情
变更名称:CALLBACK_ON_CLEAR_CHANGE
变更 ID:119147584
如何切换
在测试您的应用与 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 包含了基于与 Android 开发者协作和最新内部测试的更新的受限非 SDK 接口列表。我们尽可能确保在限制非 SDK 接口之前提供公共替代方案。
如果您的应用不以 Android 11 为目标平台,其中一些变更可能不会立即影响您。然而,虽然您目前可以使用某些非 SDK 接口(取决于您的应用目标 API 级别),但使用任何非 SDK 方法或字段始终存在使您的应用崩溃的高风险。
如果您不确定您的应用是否使用非 SDK 接口,您可以测试您的应用以找出。如果您的应用依赖于非 SDK 接口,您应该开始规划迁移到 SDK 替代方案。尽管如此,我们理解有些应用使用非 SDK 接口有合理的用例。如果您无法为应用中的某个功能找到使用非 SDK 接口的替代方案,您应该请求新的公共 API。
要了解此 Android 版本中的变更,请参阅Android 11 中非 SDK 接口限制的更新。要普遍了解非 SDK 接口,请参阅非 SDK 接口限制。