上期重点:Android 11 中的前台服务类型
—— 点击查看
本期重点:Android分区存储
Android分区存储是从Android 10开始的重要行为变更,分区存储改变了应用访问外部存储的方式、并对媒体数据进行分类以改变外部存储数据混乱的情况,同时限制对隐私数据访问限制保护用户隐私。
Android 11 对分区存储功能进行了更加严格的限制。
● 在Android 10上,无法兼容分区存储的应用可以使用 requestLegacyExternalStorage 来规避分区存储的限制。而当你的应用升级 targetSdkVersion 到 Android 11 (API 等级 30) 之后,这个标志将不再生效。
● 系统允许应用选择是否开启分区存储模型,Android 11上,将会根据应用TargetSDK来决定应用的存储模型:`应用TargetSDK >= 30,将强制打开分区存储模型。
● 当应用运行在 Android 11 系统上时,无论应用 targetSdkVersion 是什么都将无法访问其他应用的专属存储空间,例如 getExternalFilesDir() API 返回的路径。
1. 分区存储如何工作

上图是分区存储的总体结构。在Android 11,分区存储被分为了两大部分:共享存储空间、应用专属存储空间(Android/data、Android/obb)。存放到共享存储空间的数据可以与其他应用共享;而存放到应用专属存储空间的数据则是应用的私有数据,其他应用无法访问。
并且Google重新引入了对使用直接文件路径方式访问媒体文件的支持,用于管控共享存储空间内容,能够更加精细化的管理共享存储空间里面的数据。通过支持文件路径方式访问,能够兼容一些三方库文件和原生代码库。而应用专属存储空间,应用则无需权限即可访问自己沙盒化的应用空间,而其他应用无法访问。
2. 分区存储新权限以及新API
另外,相较于 Android 10,Android 11 在有关存储的权限和接口方面也作出了如下改进:相应的也提供了一些权限以及功能:
● MANAGE_EXTERNAL_STORAGE为类似文件管理、手机管家等应用,提供了能访问所有共享存储空间的能力,但是依然无法访问其他应用专属存储空间。
● 根据开发者的需求反馈,新增了MediaStore的批量处理多媒体文件接口:
○ createWriteRequest
○ createFavoriteRequest
○ createTrashRequest
○ createDeleteRequest
3. 分区存储带来什么问题
正是因为分区存储带来的这些变化,给应用适配以及应用兼容性带来了一些问题。
● 访问其他应用应用专属存储空间
在Android 11上,所有应用都无法访问其他应用专属存储空间,三方SDK分享访问其他应用专属存储空间,将会导致分享功能失效。建议分享使用FileProvider而不是直接使用路径进行分享。
● 直接路径访问共享存储空间新能问题
在直接路径访问带给Android更加精细化管控的同时,也带来了一个性能问题。直接路径访问共享存储空间,会带来一些性能问题。建议是通过MediaStore接口来访问共享存储空间数据。
● SAF API限制
○ SAF将无法选择各个Volume的根目录
○ SAF将无法选择Downloads目录
○ SAF将无法访问应用专属存储空间
4. 结束语
分区存储功能,从Android 10开始实施,但仍允许少部分无法兼容的应用选择豁免此项政策的限制,而Android 11则会根据 targetSdkVersion 来决定是否打开,且所有应用都不可访问其他应用的私有存储空间。通过对存储空间管理的加强,在安全性、隐私性和存储空间归属上都会有很大的改进。
5. 参考文档
Android 11 中的存储机制更新:
https://developer.android.google.cn/preview/privacy/storage
使用OPPO远程真机进行Android 11兼容测试
OPPO开放平台远程真机现已上线了搭载有Android 11 开发者预览版的测试机型——OPPO Find X2,欢迎开发者前来使用。
OPPO远程真机官网链接:
https://open.oppomobile.com/newservice/capability?pagename=cloudmachine

An
droid 11 开发者测试版适配指引