作者 / Fred Chung
Android 11 的最终版本已正式发布!该版本延续了之前发行版本里不断改进的隐私策略,为用户提供更加完善的控制机制和透明度,并帮助应用更好地处理自身的数据。
其中很多优化将当前安全策略的最佳实践应用于最近的 Android 发行版本中 (它们并不仅仅针对 Android 11)。在本文中,我们将以下面四个最佳实践作为切入点,助力您的应用设计与时俱进,并计划开始进行兼容性测试。
处理内容 URI 分享
递增式权限申请
在前台访问敏感数据
使用可重置的标识符
为其它应用提供合适的 URI 权限
随着 Android 11 中软件包可见性的策略更新,目标 API 级别为 30 的应用对设备上已安装的其它软件包默认仅拥有受限的可见性。这样的设计旨在为应用 "查看" 设备上的其它已安装软件包时,提供更好的 "问责" 制度。
为了简化迁移,对于常见的应用场景,我们提供了实现指南。通常,应用需要具备对其它已安装软件包的可见性 (通过 PackageManager API 验证) 才可以和其它软件包进行交互。该特性通常应用于诸如: 启动服务,或者访问属于其它应用的 Content Provider。
实现指南
https://developer.android.google.cn/preview/privacy/package-visibility-use-cases
PackageManager
https://developer.android.google.cn/reference/android/content/pm/PackageManager
您访问 Content Provider 的模式可能不是通过发送显式 intent 到某个特定的应用,而是通过发送隐式 intent。这样的话,您无法预判接收端应用 (最终处理这个 intent 的应用) 的目标 API 等级,而这个等级决定了接收端应用是否会受到 Android 11 中引入的应用包可见性限制的影响。
为了保证接收端应用能够 "查看" 您的软件包,从而能够访问任何共享的 URI,您需要在 intent 中添加 FLAG_GRANT_READ_URI_PERMISSION 和/或者 FLAG_GRANT_WRITE_URI_PERMISSION。请注意,写入权限并不包含读取访问权限。当被 intent 触发以后,接收端应用会被授予对相关 URI 的临时访问权限。
val shareIntent = Intent(Intent.ACTION_VIEW).apply {
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
data