Android 10 之前的文件系统 , 内存分为两块 , 应用私有目录 , 和 共享存储空间 ;
私有目录 : 只能保存本应用的数据 , 其它应用无法读写该目录中的数据 , 应用卸载时 , 该目录自动删除 ;
共享存储空间 : 所有的应用都可以随意访问 , 随意读写该区域内的数据 , 数据可以任意放置 , 删除 , 修改 ; 应用卸载时写出到该区域的数据不会被删除 ;
任何目录可以存储任何类型文件 , 可以将图片存储到 Movies , 视频存储到 Music 目录中 ;
共享存储空间 绝对是个 天坑 , 能不用尽量不用 ;
Android 10 及以后的文件系统 :
私有目录 : 与之前保持一致 , 只能保存本应用的数据 , 其它应用无法读写该目录中的数据 , 应用卸载时 , 该目录自动删除 ;
共享存储空间 : Google 官方对该存储区域进行了统一规划 , Android 11 中 , 每个目录存储什么类型的文件 , 都有相应规范 , 文件不能乱放置 ;
文件存储类型限制 : 文件一旦放错位置 , 就会抛异常 ;
Android 10 版本是过渡版本 , 在该版本中可以选择启用分区存储 , 也可以选择不用 , 在清单文件的 application 节点设置 requestLegacyExternalStorage=“true” 属性可以设置 不启用 分区存储 方案 , 但是 在 Android 11 中 必须 启用分区存储 , 否则应用不能兼容 Android 11 系统 ;
Android 10(API 级别 29)及之前的系统版本 , 操作文件时 , 使用的 File 类 , 该类只支持传统的存储方式 , 不支持分区存储 ;
Android 11(API 级别 30)中不能使用 File 进行文件操作 , 只能使用 MediaStore 进行文件操作 ;
参考文档 - 暂时停用分区存储 : https://developer.android.google.cn/training/data-storage/use-cases#opt-out-scoped-storage
Android 11(API 级别 30) 之后的存储机制 : Android 中所有文件存储 , 都会将文件的索引存储在数据库中 , 在 /data/data/com.android.providers.media 目录下的文件就是专门用于管理该数据库的 ;
在 /data/data/com.android.providers.media 目录下有 4 个目录 , cache , code_cache , databases , shared_prefs , 其中 databases 就是存储的上述文件索引数据库 , 有两个数据库文件 : external.db , internal.db ;
查看命令 :
walleye:/ # cd /data/data/com.android.providers.media
walleye:/data/data/com.android.providers.media # ls
cache code_cache databases shared_prefs
walleye:/data/data/com.android.providers.media # cd databases
walleye:/data/data/com.android.providers.media/databases # ls
external.db internal.db
walleye:/data/data/com.android.providers.media/databases #
将 external.db 数据库拷贝出来 , 使用 SQLite 查看工具查看该数据库 , 该数据库中有一张 files 数据表 , 就是存放文件索引的 , 只有开启分区存储时 , 才将所有的文件都保存在该数据库表中 ;
生成文件索引 :
external.db 数据库 files 数据表字段简介 :
Android 文件处理参考文档 :