文档开发者中心
我的

安卓 Q | 8大场景全面解析应用存储沙箱化

为增强用户隐私与数据安全,加强应用对共享文件访问权限的管理,在Android Q中用户可通过新的运行时权限允许应用访问照片、视频或音频等文件。此外,Android Q规定应用必须通过系统文件选择器才能访问下载文件,这也就意味着,应用的访问权限完全由用户掌控。

接下来,我们将针对Android Q Beta 1测试版本在隐私和安全保护方面新增的特性和变更进行介绍,手把手教您该如何进行适配。由于文章篇幅限制,本文将重点为大家介绍新增特性以及这些变更所带来的兼容性影响。

存储空间的限制

Android Q对应用的设备存储空间进行了限制,针对外部储存空间引入了一些新的变更,主要变更点总结如下:

1、存储沙箱:Android Q为每个应用程序在外部存储设备提供了一个独立的存储沙箱,应用直接通过文件路径保存的文件都会保存在应用的沙箱目录中,另外应用卸载时默认所有应用沙箱目录会同时被删除。

2、共享集合:不希望应用卸载删除的文件,需要应用通过MediaProvider或者SAF的方式保存在公共共享集合目录中,公共集合目录包括:多媒体文件集合(音频、视频和图片)以及下载文件集合。

3、权限变更:应用读写自己沙箱和共享集合目录中应用自己的文件时是不需要申请任何权限的,但是如果应用需要读取其它应用生成的多媒体文件就需要申请权限:

■ 读取其它应用存放在共享集合的图片和视频文件,需要应用分别申请READ_MEDIA_IMAGES和READ_MEDIA_VIDEO权限,具体要申请哪个权限取决于应用需要访问的文件类型;

■ 读取其它应用存放在共享集合的音乐类型文件,需要应用申请READ_MEDIA_AUDIO权限;

■ 读取其它应用生成的多媒体文件,需要通过MediaProvider接口读取,无法直接通过文档路径读取;

■ 系统只提供了多媒体文件的读取权限,没有提供写入权限,应用无法通过申请写入权限修改其它应用生成的文件;

■ 下载目录的文件没有增加对应的权限,读取下载目录的文件需要通过SAF的方式读取;

4、写入 其它应用的多媒体文件:需要通过申请成为默认系统图库和音乐应用,或者让用户主动授权的方式实现。

5、需要读写指定任意目录的文件:只能通过SAF的方式实现。

6、谷歌提供的兼容性方案:

■ 权限兼容方案:应用的TargetSdkVersion<Q,并且申请了老的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE存储权限,会自动转成新增加的三个权限,动态授权弹框提示的也是新的权限弹框;

■ Hota升级兼容性方案:该特性只对新安装的应用生效,对于Android Q之前的手机已经安装的应用,并且授予了老的存储权限,hota升级到Q版本之后,该应用不会受到该特性的影响;

7、目前版本该特性没有默认开启,需要开发者通过命令开启:adb shell sm set-isolated-storage on。

兼容性影响

Android Q针对外部储存空间引入的变更可以说影响很大,只要是涉及到需要读取其它应用文件的场景都可能存在问题,应用现在无法通过路径读写其它应用生成的所有文件,只能通过MediaProvider接口和SAF方式去读写其它应用的文件。

为方便广大应用厂商重点排查应用可能存在的问题,下面列举了一些可能出现问题的场景,供开发者进行参考:

场景一:文件共享

问题1:应用通过其它社交类软件分享文件给好友,提示文件不存在;

问题2:应用使用其它应用打开文件,提示文件不存在;

问题原因分析:

1、分享方使用了file:// URI分享。

从上方日志可以看出QQ分享文件使用的是file URI,该文件保存在应用的沙箱目录,其它应用是没有权限直接通过文件路径访问其它应用的沙箱目录下文件的,所以报错。

2、在实际测试后发现,接收方不支持Content URI的分享场景,也会导致文件分享有问题,需要文件接收方适配支持Content URI。

场景二:读取应用沙箱外非多媒体文件

问题1:文件管理器只能看到应用自己生成的文件,无法查看其它应用的文件;

问题2:社交类应用给好友分享本地文件出现本地文件找不到的问题;

问题原因分析:

应用通过路径只能访问应用沙箱目录的文件,其它沙箱外的任意文件是无法直接通过文件路径的方式访问。

场景三:读取应用沙箱外多媒体文件

问题1:读本地多媒体文件为空的问题;

问题2:修改用户头像失败;

问题原因分析:

可能原因1:MediaProvider的“_data”返回值变更导致的问题,Q版本“_data”值不再是多媒体文件的真实路径,应用通过该返回值判断文件是否存在是有问题的;

可能原因2:SAF使用的方式有问题,我们发现有些应用通过SAF的方式更换用户头像失败的问题,具体原因需要进一步分析;

场景四:修改和删除其它应用生成的文件

问题1:一些图库应用无法删除其它应用保存的图片和视频文件。

问题2:手机管家垃圾文件无法删除和清理问题。

问题3:文件管理无法删除其它应用的文件问题。

问题原因分析:

老的存储权READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE废弃,替换成新的存储权限android.permission.READ_MEDIA_AUDIO、android.permission.READ_MEDIA_IMAGES和android.permission.READ_MEDIA_VIDEO,并且只提供了多媒体文件的读取权限,未提供写入权限,现在应用没有权限直接删除其它应用生成的任何文件,包括多媒体文件。

场景五:保存文件

问题1:应用保存文件到公共集合目录,路径变化问题,比如/sdcard/DCIM/。

问题2:应用保存文件到沙箱外任意指定目录,路径变化问题,比如sdcard根目录。

用户通过es文件浏览器在sdcard根目录新建目录“测试路径变化问题”

通过adb查看文件创建的真实路径为:

问题原因分析:

应用通过路径生成的文件默认都保存在应用自己的沙箱目录。

场景六:应用卸载

问题1:应用卸载,用户主动保存的文件被删除问题。

问题原因分析:

目前在实际测试中发现很多应用都会直接通过路径的方式将不希望卸载删除的文件保存在SD卡根目录下面应用自己创建的目录;但在Q版本同样的方式创建的这些文件都会被保存在应用的沙箱目录,这部分文件在Q之前的版本应用卸载的时候是不会删除,但是在Q版本都会被删除,这样就会导致用户主动保存的一些文件全部被删除。

场景七:Hota升级

问题1:Hota升级到Q版本之后,应用卸载重新安装导致应用数据丢失的问题。

问题原因分析:

存储空间限制特性只对新安装的应用生效,对于Android Q之前的手机已经安装的应用,并且授予了老的存储权限,hota升级到Q版本之后,该应用不会受到该特性的影响。如果是hota升级到Q版本的应用,不受影响,应用卸载之后,通过路径的方式保存在SD卡根目录的应用的这些文件不会被删除,和Q版本之前保持一致。但如果应用重新安装这个应用,属于新安装的应用场景,又会受到该特性的影响,之前卸载未删除的这些文件,应用无法直接通过路径访问。

场景八:权限申请

TargetSdkVersion>=Q的应用,需要适配增加新的存储权限申请,否则会报权限问题。


点赞
收藏
回复
4
分享
举报
浏览18220 发布于2019-07-09 12:20未知归属地
全部评论
最多点赞
最新发布
最早发布

谢谢分享!

2楼回复于2019-07-17 02:14 未知归属地

更新(Beta3后版本):

1、去掉了此前版本新增的三个媒体存储动态权限,三个权限合并为一个,权限访问范围仍然仅限媒体文件;为了兼容,权限的名称和传统的动态存储权限的名称是相同的: READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE

2、为了满足三方应用适配前的兼容,给应用提供主动声明是否适配完成的标志,以保证其应用的正常运行。如果应用声明完成沙盒适配,进入沙盒模式;声明未完成适配,进入兼容模式。 如果应用没有声明,target sdk version < Q,会进入兼容模式;target sdk version>=Q进入沙盒模式。


1楼回复于2019-07-15 06:51 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
存储空间的限制
兼容性影响
了解社区公约,与您携手共创和谐专业的开发者社区。