0

    安卓Q | 文件存储沙箱化FAQ,你想知道的这里都有!

    2023.05.21 | admin | 186次围观

    文件存储沙箱化作为Android Q最为重要的变更之一,对应用文件存储、访问、分享等操作都带来重大的影响,被众多开发者关注和讨论。本文邀请华为技术专家对开发者提到的重点问题进行了解答,以帮助大家更好地适配安卓Q!

    -01-

    Q:

    Android Q是否会向OEM厂商系统app开放特殊权限,用于扫描各个沙箱内的文件?比如手机管家的文件清理功能需要的权限。

    A:

    OEM厂商应用在Google有条件的约束下,可以保留系统的WRITE_MEDIA_STORAGE权限,但是用户可以选择关闭或开启该权限。

    -02-

    Q:

    Android Q Beta 1可以使用SAF访问到其他应用沙箱内的数据,这个特性后续版本是否会继续支持?对清理工具类应用有什么建议吗?

    A:

    SAF作为沙箱化特性开启后应用和用户交互获得访问其他应用文件重要的手段,将会继续支持。对于清理类工具应用可以通过SAF去进行访问应用文件,但是后台的全盘扫描功能将不再支持。

    -03-

    Q:

    isolated sandbox 与 privatestorage 有啥区别?

    A:

    isolated sandbox对应/sdcard/Android/sandbox/$(packagename);

    privatestorage对应/sdcard/Android/data/$(packagename)。

    -04-

    Q:

    新的权限系统是不是对图片管理和文件管理类应用不太友好?是否意味着强制用户只能使用系统应用呢?

    A:

    图片管理类应用在用户设置为默认图库应用时可以正常管理所有的图片,在不是默认应用时对其他应用的数据访问需要通过SAF;文件管理类的应用只能采用SAF的方式访问全部存储空间。

    -05-

    Q:

    对于native代码需要java传入fd的限制是针对所有common存储空间的文件都存在么(沙箱,photon/video,download)?

    A:

    1、对于应用产生的音频、视频或下载文件需要程序进行甄别,将需要用户保存的数据通过MediaStore的API进行写入,不需要保存的数据应当放在沙箱内。

    2、呼吁所有开发者按照用户有用数据保存公共集合,用户无用或者临时数据保存在沙盒或者/sdcard/Android/data/$(packagename)/files内。

    3、由于公共集合限制只允许存在原生目录下,且最多两级目录,用户仍然可以通过文件管理器比较容易的管理这些数据。

    -06-

    Q:

    Download目录下的自己app创建的文件,如果app被卸载重装后还能直接访问吗?

    A:

    不可以,将等同其他应用产生的文件。媒体类的文件需要申请动态存储权限,非媒体类的文件则需要使用SAF。

    -07-

    Q:

    如果自己app新版本apk存储在sdcard私有目录下能正常完成app的安装升级吗?

    A:

    Android Q 禁止给安装器传递file://URI, 自升级的apk在私有目录下文件可以通过FileProvider的方式给应用安装器传递Content://URI来实现更新安装。

    -08-

    Q:

    在特殊场景下sd卡上的文件无法删除,我们的一个纯native的APP,没有Java/Kotlin代码,如何访问其它应用在sdcard上分享的文件?

    A:

    需要通过Java层访问上层的Provider接口获得fd传递给native层访问,文件路径将不能直接访问。

    -09-

    Q:

    文件存储沙箱化特性在Android Q之前就有吗?

    A:

    Q之前没有应用外部存储沙箱,Q之前有的是内部存储数据沙箱/data/data/$(packagename) 和外部存储的数据目录/sdcard/Android/data/$(packagename),用来隔离应用之间的数据;但是多数应用为了让自己的数据卸载后存留都不往这两个目录下写自己的文件。

    而且之前外部存储的数据沙箱会被其他应用通过申请动态存储权限穿透,Android Q动态存储权限不再能够访问其他应用沙箱文件,将更好的保护用户隐私。

    -10-

    Q:

    创建删除文件是否也需要java接口,另外使用文件的一些功能,比如内存文件映射是否有变化?

    A:

    存储沙盒仅影响外置存储上的文件访问,不影响内存文件映射。

    -11-

    Q:

    如果在AndroidQ上安装一个TargetSDKversion为26的应用sd卡上的文件无法删除,能否通过原有的方式访问外部存储空间?如果不可以,是不是意味着在将无法访问sd卡上的文件?

    A:

    在设备升级的场景下,已经安装的targetsdk小于等于28的应用会被放到兼容模式,可以继续直接访问sdcard/download,一旦应用卸载,将会进入沙盒,就需要通过SAF来访问。

    -12-

    Q:

    外部存储的文件(非多媒体文件),想在应用卸载以后继续保留,有什么办法?或者有什么替代方案?

    A:

    使用MediaStore.Files接口代替,可以保存到/sdcard/Download目录下,卸载时不会删除。

    -13-

    Q:

    系统升级到Q后,原应用可以通过兼容模式使用,如果后面应用自升级后就不能使用兼容模式了吗?

    A:

    系统升级到Q后,原应用可以通过兼容模式使用,更新版本会继续在兼容模式下,直到应用卸载重新安装。

    -14-

    Q:

    应用存储空间访问限制,像访问相册(头像上传)、保存到相册等功能是否就无法使用,是否只在AndroidQ版本及以上的设备有影响,与target版本有关系吗?

    A:

    1、申请媒体存储权限后,可以通过MediaProvider查询系统的相册文件,获得对应的Content URI来访问,以实现头像的更换。

    2、应用生成的图片可以通过媒体扫描到相册中;也可以通过MediaStore.Images接口保存到公共集合。

    3、只在AndroidQ版本及以上有影响,与target版本无关。

    -15-

    Q:

    应用存储空间限制,如果APP想使用系统相册里的视频或者图片会有影响吗?

    A:

    申请媒体存储权限后,可以通过MediaProvider查询系统的相册文件,获得对应的Content URI来访问。

    -16-

    Q:

    对于存储权限,Android Q有修改应用的存储路径吗,还是/sdcard/android/data/$(packagename) 吗?

    A:

    通过Context.getExternalFilesDir()和Context.getExternalCacheDir()获得的两个文件目录都不会变化(/sdcard/android/data/$(packagename)/files和/sdcard/android/data/$(packagename)/files)。

    -17-

    Q:

    如果需要访问其他应用的私有目录,是不是可以通过不升级targetversion或者通过文件选择器来实现?

    A:

    访问其他应用的私有目录都需要通过文件选择器,升级或者不升级targetversion都不能让应用突破对其他应用私有目录的限制。不过对于升级到Q的设备,应用Targetversion升级到Q不会进入兼容模式。

    -18-

    Q:

    如果在AndroidQ上安装一个TargetSDKversion为26的应用,能否通过原有的方式访问外部存储空间?如果不可以,是不是意味着在将无法访问sd卡上的文件?

    A:

    在设备升级的场景下,已经安装的targetsdk小于等于28的应用会被放到兼容模式,可以继续直接访问sdcard/download,一旦应用卸载,将会进入沙盒,就需要通过SAF来访问。

    -19-

    Q:

    Android Q有无安全存储空间?APP是否有安全的数据共享方案?

    A:

    1、沙盒化特性完全实现后,应用的沙盒目录就是安全的存储空间;

    2、应用间安全的共享方式推荐FileProvider,参考链接:

    -20-

    Q:

    用户卸载安装后再次访问自己原有的公共目录下的下载数据相当于其他应用访问的设定否合理?

    A:

    初衷是安全上的考虑,应用卸载后,如果有仿冒的同包名应用安装,不希望它能够后台能够无权限获取原来应用的数据。

    -21-

    Q:

    一个应用安全沙箱中的文件,另一个应用有办法去做读写操作吗?非系统应用能否移动其它应用沙箱中的文件?仅系统文件管理支持文件移动吗?

    A:

    通过SAF访问,适配参考链接:

    文件移动可以使用SAF,通过用户操作来实现;系统的文件管理器也是需要用户的操作来实现。

    -22-

    Q:

    请问公开存储空间中应用沙箱存储的目录,其他应用只能通过调起系统文件管理器来查看吗?不能通过代码检索公开存储空间内的所有目录吗?(包含应用私有沙箱目录)

    A:

    应用可以使用SAF调用DocumentUI来查看沙箱存储的目录;应用不能直接检索存储空间所有目录,仅能检索自身的沙盒目录。

    -23-

    Q:

    在android Q的沙箱存储机制下,使用LoaderManager扫描出来的文件,包含共享目录里的文件吗?包含其他app沙箱里的文件吗?

    A:

    LoaderManager用来负责管理与Activity或者Fragment联系起来的一个或多个Loaders对象,并不是存储的管理类。任何形式的存储访问都会受到沙盒特性的权限控制,不能直接访问其他app沙箱里的文件。

    - End -

    添加安卓绿色联盟官方助手微信,回复关键词“Q”,立马加入安卓Q适配交流群!与众多开发共同讨论安卓Q的适配与测试!

    更多参考资料:

    Android Q Beta开发者文档链接:

    Android Q Beta镜像下载链接:

    Android Q Beta 发布 blog:

    推荐

    阅读

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论