Android -- 沙箱适配规则总结

作者:opLW

目录

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

1. 沙箱存储原理
  • 深入理解Android沙箱存储机制

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

3. 权限变化

Android -- 沙箱适配规则总结_第1张图片

  • 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访问分区外内容时,会引发失败或异常。

    受影响接口
    File createNewFile()、delete()、renameTo(File dest)、mkdir()、mkdirs()
    FileInputStream FileInputStream(File file)、FileInputStream(String name)
    FileOutputStream FileOutputStream(File file)、FileOutputStream(File file, boolean append)、FileOutputStream(String name)、FileOutputStream(String name, boolean append)
    BitmapFactory decodeFile(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® 分区存储适配

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

你可能感兴趣的:(Android,android)