与早期版本一样,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
出于安全原因并为了维护良好的用户体验,如果这些 Toast 由针对 Android 11 或更高版本的应用从后台发送,则系统会阻止包含自定义视图的 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
。
相机
媒体意图操作需要系统默认相机
从 Android 11 开始,只有预安装的系统相机应用才能响应以下意图操作
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
如果有多个预安装的系统相机应用可用,系统会显示一个对话框供用户选择应用。如果您希望您的应用代表其使用特定的第三方相机应用来捕获图像或视频,您可以通过为意图设置包名或组件来使这些意图明确。
应用打包和安装
压缩资源文件
更改详细信息
更改名称: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
有关兼容性框架和切换更改的更多信息,请参阅 在应用中测试和调试平台行为更改。
如果应用包含压缩的 resources.arsc
文件或此文件未对齐到 4 字节边界,则无法安装针对 Android 11(API 级别 30)或更高版本的应用。如果存在这些条件中的任何一个,则系统无法将此文件内存映射。无法内存映射的资源表必须读取到 RAM 中的缓冲区,这会导致系统不必要的内存压力,并大大增加设备上的 RAM 使用量。
如果您之前使用的是压缩的 resources.arsc
文件,请尝试使用其他策略,例如 缩减应用资源 或其他方法来 缩减、混淆和优化您的应用。
现在需要 APK 签名方案 v2
目前仅使用 APK 签名方案 v1 签名的针对 Android 11(API 级别 30)的应用现在还必须使用 APK 签名方案 v2 或更高版本进行签名。在运行 Android 11 的设备上,用户无法安装或更新仅使用 APK 签名方案 v1 签名的应用。
要验证您的应用是否正在使用 APK 签名方案 v2 或更高版本进行签名,您可以使用 Android Studio 或命令行上的 apksigner
工具。
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
更改 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
时,现在都会向 OnSharedPreferenceChangeListener.onSharedPreferenceChanged
发出回调,并使用 null
键。
非 SDK 接口限制
Android 11 包含基于与 Android 开发人员的协作以及最新的内部测试更新的受限非 SDK 接口列表。在限制非 SDK 接口之前,我们会尽可能确保提供公共替代方案。
如果您的应用未针对 Android 11,则其中一些更改可能不会立即影响您。但是,虽然您目前可以使用某些非 SDK 接口(取决于您应用的目标 API 级别),但使用任何非 SDK 方法或字段始终存在使应用崩溃的高风险。
如果您不确定您的应用是否使用了非 SDK 接口,您可以 测试您的应用 以了解情况。如果您的应用依赖于非 SDK 接口,则应开始计划迁移到 SDK 替代方案。但是,我们了解某些应用在使用非 SDK 接口方面有有效的用例。如果您找不到应用中某个功能的非 SDK 接口的替代方案,则应 请求新的公共 API。
要详细了解此 Android 版本中的更改,请参阅 Android 11 中对非 SDK 接口限制的更新。要详细了解非 SDK 接口,请参阅 非 SDK 接口的限制。