Android -- 沙箱适配规则总结

作者:opLW

目录

1. 沙箱存储原理
2. 存储目录概况
3. 权限变化
4. 分区存储对API的影响
5. 应用旧数据迁移
6. 访问其他应用的数据

1. 沙箱存储原理

2. 存储目录概况
  • 私有存储: 每个应用在都拥有自己的私有目录:
    内部存储 (/data/data/packageName)
    外部存储 (/sdcard/Android/data/packageName)
  • 共享存储: 存储其他应用可访问文件, 包含媒体文件、文档文件以及其他文件,对应设备DCIM、Pictures、Alarms、Music、Notifications、Podcasts、Ringtones、Movies、Download等目录。

3. 权限变化

在这里插入图片描述

  • Enviroment.getExternalStorageDirectory:返回的路径是sdcrad/
  • Storage Access Framework (SAF):SAF是一个文件(图片、文档等)提供程序。用户可通过易用的标准UI,跨所有应用和提供程序以统一的方式浏览文件并访问最近用过的文件。
  • MediaStore API:MediaStore API提供一套统一的URI和参数,建立起应用和媒体提供程序的沟通桥梁。与SAF相比,SAF更偏向用户侧,MediaStore API更便向开发侧。用户通过SAF取得文件的Uri后,需要通过MediaStore API访问数据源。

4.分区存储对API的影响
  • 部分API仍可正常使用,如File的exists()、isDirectory()等。

  • 使用下述API访问分区外内容时,会引发失败或异常。

    受影响接口
    FilecreateNewFile()、delete()、renameTo(File dest)、mkdir()、mkdirs()
    FileInputStreamFileInputStream(File file)、FileInputStream(String name)
    FileOutputStreamFileOutputStream(File file)、FileOutputStream(File file, boolean append)、FileOutputStream(String name)、FileOutputStream(String name, boolean append)
    BitmapFactorydecodeFile(String pathName)、decodeFile(String pathName, Options options)

5.应用旧数据迁移
  • 5.1 分区存储相关属性
    • “requestLegacyExternalStorage“ 请求使用旧版的分区存储,仅在SDK=29时有效。
    • “preserveLegacyExternalStorage”继续保持旧版的分区存储,仅在SDK>=30时有效。
  • 5.2 确保旧数据完全迁移
    • targetSdkVersion=29。

      情况由29以下升至29直接安装29
      能使用旧版存储模型i. 不能使用旧版存储模型 ii. 为application设置“requestLegacyExternalStorage=true“标签,允许暂时允许使用旧版存储模式。
    • targetSdkVersion=30,强制实行分区存储。

      情况由29以下升至29再升至30 / 由29以下直接升至30由29升至30直接安装30
      需设置”preserveLegacyExternalStorage=true”才能使用旧版存储模型需设置”preserveLegacyExternalStorage=true”,且应用的29版本具有“requestLegacyExternalStorage=true“属性,才能继续使用旧版存储模型不能使用旧版存储模型
    • 总结:targetSdkVersion升至30前,必须完成代码的适配;targetSdkVersion升至30时,需要设置”preserveLegacyExternalStorage=true”。

6.访问其他应用的数据
  • SDK=29。不管其他应用是否开启分区存储,只要本应用不开启分区存储,仍可以访问第三方应用的外部存储。

  • SDK>=30。无论应用的targetSdkVersion是什么,都无法再访问第三方应用的外部存储 (/sdcard/Android/data/packageName),主要影响到分享图片功能。

    情况第三方应用支持FileProvider第三方应用不支持FileProvider
    通过Uri进行分享无法分享,只能对方提供适配的SDK。
参考文章

官方文档—版本适配
官方文档—分区存储最佳实践
沙箱机制理解&代码样例
Android 10(Q)/11® 分区存储适配

万水千山总是情,麻烦手下别留情。
如若讲得有不妥,文末留言告知我,
如若觉得还可以,收藏点赞要一起。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值