原标题:Android外部存储
作者:庄灿杰,腾讯移动客户端开发 工程师
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。
原文链接:http://wetest.qq.com/lab/view/368.html
WeTest 导读
外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更。我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇怪怪的路径:/sdcard、/mnt/sdacrd、/storage/extSdCard、/mnt/shell/emulated/0、/storage/emulated/0、/mnt/shell/runtime/default/emulated/0…其实,这背后代表了一项项技术的成熟与发布:模拟外部存储、多用户、运行时权限…
一、各版本外部存储特性
1、Android 4.0
● 支持模拟外部存储(通过FUSE实现)
● 出现了主外部存储,以及二级外部存储(没有接口对外暴露)
● 支持MTP(Media Transfer Protocol)、PTP协议(Picture Transfer Protocol)
2、Android 4.1
● 开发者选项出现”强制应用声明读权限才可以进行读操作”的开关
3、Android 4.2
● 支持多用户,每个用户拥有独立的外部存储
4、Android 4.4
● 读操作需要声明READ_EXTERNAL_STORAGE权限
● 应用读写在外部存储的应用目录(/sdcard/Android//)不需要声明权限
● 增加了Context.getExternalFilesDirs() 接口,可以获取应用在主外部存储和其他二级外部存储下的files路径
● 引入存储访问框架(SAF,Storage Access Framework)
5、Android 6.0
● 外部存储支持动态权限管理
● Adoptable Storage特性
6、Android 7.0
● 引入作用域目录访问
补充一个点:
如果应用的minSdkVersion和targetSdkVersion设置成<=3,系统会默认授予READ_EXTERNAL_STORAGE权限。
二、部分特性讲解
1.模拟外部存储
a. 必要性
● FAT32 属于微软专利,可能存在许可和法律问题(相关文章);
● 可以定制Android自己的外部存储访问规则;
● 为多用户做铺垫;
b. 实现原理
系统/system/bin/sdcard守护进程,使用FUSE实现类FAT格式SD卡文件系统的模拟,也就是我们经常说的内置SD卡。(详细代码可以参考:/xref/system/core/sdcard/sdcard.c)
用户空间文件系统(Filesystem in
Userspace,简称FUSE)是一个面向类Unix计算机操作系统的软件接口,它使无特权的用户能够无需编辑内核代码而创建自己的文件系统