一、隐私设置
1、强制执行分区存储
背景
为了让用户更好地管理自己的文件并减少混乱,以 Android 10(API 级别 29)及更高版本为目标平台的应用在默认情况下被授予了对外部存储空间的分区访问权限(即分区存储)。此类应用只能访问外部存储空间上的应用专属目录,以及本应用所创建的特定类型的媒体文件。
在 Android 11 上运行但以 Android 10(API 级别 29)为目标平台的应用仍可请求 requestLegacyExternalStorage 属性。应用可以利用此标记暂时停用与分区存储相关的变更,例如授予对不同目录和不同类型的媒体文件的访问权限。当您将应用更新为以 Android 11 为目标平台后,系统会忽略 requestLegacyExternalStorage 标记。
兼容影响
当您将应用更新为以 Android 11 为目标平台后,您将无法使用requestLegacyExternalStorage,而且也没有其他标记可以提供停用分区存储。
分区存储对于App访问存储方式、App数据存放以及App间数据共享,都产生很大影响。
而Environment.getExternalStorageDirectory() 在 API Level 29 开始已被弃用,开发者应迁移至 Context#getExternalFilesDir(String), MediaStore, 或Intent#ACTION_OPEN_DOCUMENT。
适配建议
如果您将应用专属文件存储在外部存储空间中,则可以将这些文件存放在外部存储空间中的应用专属目录内,以便更加轻松地采用分区存储。这样,在启用分区存储后,您的应用将可以继续访问这些文件。
如需让您的应用适合分区存储,请参阅存储用例和最佳实践指南。
具体适配参考:
https://developer.android.google.cn/training/data-storage#scoped-storage
https://developer.android.google.cn/preview/privacy/storage
Android存储之分区存储适配:https://blog.csdn.net/unreliable_narrator/article/details/127250034
2、闲置应用权限自动重置
背景
如果应用以 Android 11 或更高版本为目标平台并且数月未使用,系统会通过自动重置用户已授予应用的运行时敏感权限来保护用户数据。此操作与用户在系统设置中查看权限并将应用的访问权限级别更改为拒绝的做法效果一样。
兼容性影响
如果您的应用以Android 11为目标平台,若用户长时间不使用,当用户再次使用时,若应用没有权限校验逻辑则会导致与回收权限相关的业务失效。
适配建议
Goolge适配指导:https://developer.android.google.cn/preview/privacy/permissions#auto-reset
如果应用遵循了有关在运行时请求权限的最佳做法,那么您不必对应用进行任何更改。这是因为,当用户与应用中的功能互动时,您应该会验证相关功能是否具有所需权限。
权限申请的最佳实践:https://developer.android.google.cn/training/permissions/requesting
3、后台位置访问
背景
Google官网特性介绍:
https://developer.android.google.cn/preview/privacy/location#background-location
Android 11移除了来自应用程序中提示允许运行后台定位访问,用户必须转到系统设置,才能向应用授予在后台访问位置信息的权限。
兼容性影响
1. 如果尝试请求ACCESS_BACKGROUND_LOCATION,同时请求任何其他权限,系统会抛出一个异常。(只针对sdk为android 11),具体表现为闪退。
2. 调用requestPermissions请求后台定位权限会跳转至系统设置界面。
适配建议
单独请求在后台访问位置信息:
正如有关如何在运行时请求位置信息访问权限的指南中所述,您应该执行递增位置信息请求。如果您的应用以 Android 11 或更高版本为目标平台,系统会强制执行此最佳做法。如果您同时请求在前台访问位置信息的权限和在后台访问位置信息的权限,系统会忽略该请求,且不会向您的应用授予其中的任一权限。
4、应用包可见性
背景
Google官网特性介绍:
https://developer.android.google.cn/preview/privacy/package-visibility
Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用 <queries> 元素,应用可以定义一组自身可访问的其他软件包。通过告知系统应向您的应用显示哪些其他软件包,此元素有助于鼓励最小权限原则。此外,此元素还可帮助 Google Play 等应用商店评估应用为用户提供的隐私权和安全性。
如果您的应用以 Android 11 或更高版本为目标平台,您可能需要在应用的清单文件中添加 <queries> 元素。在 <queries> 元素中,您可以按软件包名称、intent 签名或提供程序授权指定软件包。
兼容性影响
1. SDK接口行为变更
app默认不再能通过SDK接口获取其他app的信息,例如:
getPackageInfo(getPackageName(), 0) 仍能正常返回应用自身的PackageInfo,但getPackageInfo(“com.another.app”,0)将抛出NameNotFoundException,即使com.another.app已经被安装到设备上。getInstalledPackages(0),只能返回应用自身,以及少数的核心AOSP应用的信息。
2. 其他变更
app不能感知/data/data/com.another.app等目录的存在。即使com.another.app已经被安装到设备上,app尝试访问/data/data/com.another.app也将提示“File not found”,而不是“Permission denied”。
类似的目录还有/data/misc/profiles/cur/${userId}/com.another.app。此变更,可以防止app通过访问目录文件返回的错误不同,来判断特定app是否已被安装。
适配建议
如需测试此行为变更是否已在您的应用中生效,请完成以下步骤:
1、安装 Android Studio 3.6.1 或更高版本。
2、安装 Android Studio 支持的最新版 Gradle。
3、将应用的 targetSdkVersion 设为 30。
4、不要在应用的清单文件中添加 <queries> 元素。
5、调用 getInstalledApplications() 或 getInstalledPackages()。这两种方法都应返回过滤后的列表。
6、查看应用的哪些功能无法正常使用。
7、引入适当的 <queries> 条目来修复这些功能。
Google适配指导: https://developer.android.google.cn/preview/privacy/package-visibility
二、安全
1、堆指针标记
背景
Android 11上,堆指针在最高有效字节 (MSB) 中有一个非零标记。错误地使用指针的应用(包括修改 MSB 的应用)会崩溃或遇到其他问题。这是支持未来启用了ARM内存标记扩展 (MTE) 的硬件所必需的变更。如需了解详情,请参阅已加标记的指针。
兼容性影响
如果您的应用目标Sdk为R则堆指针标记默认开启,目标SDK低于R时,默认关闭。
使用如下命令开启或关闭此特性,查看您的应用是否有错误的使用指针场景。
adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
适配建议
如需停用此功能,请参阅 allowNativeHeapPointerTagging 清单文档。
Google特性介绍和适配指导:
https://source.android.google.cn/devices/tech/debug/tagged-pointers
2、消息框的更新
来自后台的自定义消息框被屏蔽
出于安全方面的考虑,同时也为了保持良好的用户体验,如果包含自定义视图的消息框是以 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 或更高版本为目标平台的应用会发现文本消息框受到以下负面影响:
- getView() 方法返回 null。
- 以下方法的返回值并不反映实际值,因此您不应在应用中依赖于它们:
- 以下方法是空操作,因此您的应用不应使用它们:
三、网络连接
1、限制对 APN 数据库的读取访问
变更详情
以 Android 11 为目标平台的应用现在必须具备 Manifest.permission.WRITE_APN_SETTINGS 特权,才能读取或访问电话提供程序 APN 数据库。如果在不具备此权限的情况下尝试访问 APN 数据库,会生成安全异常。
适配建议
以 Android 11 为目标平台的应用现在必须具备 Manifest.permission.WRITE_APN_SETTINGS 特权,才能读取或访问电话提供程序 APN 数据库。如果在不具备此权限的情况下尝试访问 APN 数据库,会生成安全异常。
四、无障碍服务
1、在清单文件中声明与 TTS 引擎的交互
适配建议
由于软件包可见性发生了变更,因此以 Android 11 为目标平台且与文字转语音 (TTS) 引擎交互的应用需要将以下 <queries> 元素添加到其清单文件中:
<queries>
<intent>
<action
android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
2、在元数据文件中声明“无障碍”按钮使用情况
变更详情
从 Android 11 开始,您的无障碍服务无法在运行时声明与系统的“无障碍”按钮相关联。如果您将 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON 附加到 AccessibilityServiceInfo 对象的 flags 属性,框架就不会将“无障碍”按钮回调事件传递给您的服务。
如需在无障碍服务中收到无障碍回调事件,请使用无障碍服务元数据文件声明您的服务与“无障碍”按钮的关联。在 accessibilityFlags 属性的定义中添加 flagRequestAccessibilityButton 值。无障碍服务元数据文件的常用位置为 res/raw/accessibilityservice.xml。
适配建议
如需在无障碍服务中收到无障碍回调事件,请使用无障碍服务元数据文件声明您的服务与“无障碍”按钮的关联。在 accessibilityFlags 属性的定义中添加 flagRequestAccessibilityButton 值。无障碍服务元数据文件的常用位置为 res/raw/accessibilityservice.xml。
五、相机
1、媒体 intent 操作需要系统默认相机
变更详情
从 Android 11 开始,只有预装的系统相机应用可以响应以下 intent 操作:
- android.media.action.VIDEO_CAPTURE
- android.media.action.IMAGE_CAPTURE
- android.media.action.IMAGE_CAPTURE_SECURE
如果有多个预装的系统相机应用可用,系统会显示一个对话框,供用户选择应用。
适配建议
如果您希望自己的应用使用特定的第三方相机应用来代表其捕获图片或视频,可以通过为 intent 设置软件包名称或组件来使这些 intent 变得明确。
六、应用打包和安装
1、压缩的资源文件
背景
以Android 11 为目标运行平台的应用,如果安装包中的resources.arsc进行了压缩或没有进行4字节对齐,则该应用将无法安装。
上述变更的原因是,压缩或未对齐的resources.arsc文件,系统无法直接通过内存映射(mmap)加载,而只能通过buffer读入内存,这会增加系统内存压力和内存占用。
兼容性影响
如果您的应用targetSdkVersion为30,安装包文件中的resources.arsc文件有压缩或者未进行4字节对齐,则您的应用将无法在运行Android 11设备上进行安装。
适配建议
不对resources.arsc文件压缩,同时检查是否进行了4字节对齐。如果没有,请使用zipalign工具进行对齐:
https://developer.android.google.cn/studio/command-line/zipalign?hl=zh-cn
2、现在需要 APK 签名方案 v2
背景
对于以 Android 11(API 级别 30)为目标平台,且目前仅使用 APK 签名方案 v1 签名的应用,现在还必须使用 APK 签名方案 v2 或更高版本进行签名。用户无法在搭载 Android 11 的设备上安装或更新仅通过 APK 签名方案 v1 签名的应用。
兼容性影响
用户无法在搭载Android 11的设备上安装或更新仅通过APK签名方案v1 签名的应用。
适配建议
1. APK签名方案验证
您可以在命令行中使用Android Studio或 apksigner工具,验证您的应用是否已使用APK签名方案v2或更高版本进行签名。
Apk签名方案v2介绍:
https://source.android.google.cn/security/apksigning/v2
Apksigner工具介绍:
https://developer.android.google.cn/studio/command-line/apksigner
AndroidStudio签名介绍:
https://developer.android.google.cn/studio/publish/app-signing#sign_release
2. Android旧版本兼容
为支持运行旧版Android的设备,除了使用APK签名方案v2或更高版本为您的APK签名之外,您还应继续使用APK签名方案v1进行签名。
七、Firebase
1、Firebase JobDispatcher 和 GCMNetworkManager
背景
如果您的应用以 API 级别 30 或更高级别为目标平台,在搭载 Android 6.0(API 级别 23)或更高版本的设备上会停用 Firebase JobDispatcher 和 GcmNetworkManager API 调用。
兼容性影响
如果应用的目标API级别是R或者更高,以Firebase JobDispatcher和GcmNetworkManager实现的功能将在Android6.0及其后续版本将失效。
适配建议
如需了解迁移,请参阅从 Firebase JobDispatcher 迁移到 WorkManager 和从 GCMNetworkManager 迁移到 WorkManager。
八、非 SDK 接口限制
变更详情
Android 11 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,会尽可能确保有可用的公开替代方案。
如果您的应用并非以 Android 11 为目标平台,那么其中一些变更可能不会立即对您产生影响。不过,虽然您目前可以使用一些非 SDK 接口(具体取决于应用的目标 API 级别),但只要您使用任何非 SDK 方法或字段,应用无法运行的风险终归较高。
适配建议
如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用,进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。如果您无法为应用中的功能找到无需使用非 SDK 接口的替代方案,则应请求添加新的公共 API。
如需详细了解此 Android 版本中的变更,请参阅 Android 11 中有关限制非 SDK 接口的更新。如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制。
九、Google Android 11适配信息汇总
隐私更新:
https://developer.android.google.cn/preview/privacy
行为变更:
https://developer.android.google.cn/preview/behavior-changes-all
https://developer.android.google.cn/about/versions/11/behavior-changes-11
以上文档仅针对于targetSdk 29->30的应用适配,更低版本应用,请参考以下官方链接逐级适配::
targetSdk->29(Android 10):https://developer.android.com/about/versions/10/behavior-changes-10?hl=zh-cn
targetSdk->28(Android 9):https://developer.android.com/about/versions/pie/android-9.0-changes-28?hl=zh-cn
targetSdk->26/27 (Android 8.0/8.1):https://developer.android.com/about/versions/oreo/android-8.0-changes?hl=zh-cn#o-apps