External实际上是Internal
很久以前,每台Android设备都使用外插microSD卡用于存储,这是因为内部的storage容量太小了。不过外部SD卡由于速度原因,所以用户体验不是太好。
早期的sd卡是被当做外部storage,这样就有两个目录/scdard和/sdcard1,前者指内部storage,这部分其实就是内部sd或者emmc分出来的一个空间,后者指外部插入的卡。
到后来随着内部存储容量的增大,Google开发了虚拟文件系统来存储application的data已经media文件,挂在点在/sdcard,实际上是在/data/media下,sdcard分区的存在是为了兼容。也就是说,对/sdcard的内容的增加会导致整个data分区空间的减少。
我们现在所说的external storage是只指实际的可插入和移除的microSD或者是内部的sd分区,即/sdcard或者/data/media,更多情况是指后者。
Android虚拟文件系统:
Android2.3之后,Google利用virtual filesystem把sdcard格式化为VFAT,VFAT利于外部设备访问设备,比如pc.但是这也带来了两个问题:
1. 当PC连接Android设备时(作为usb mass storage时),sdcard分区需要先umount, 这时候设备端就无法访问sdcard分区了。
不过此问题后来通过MTP的连接方式解决了,MTP的原理是PC请求文件列表,MTP从设备端返回PC所要的信息。PC发送删除请求时,MTP收到去删除对应的文件。
2. 每个appliction可以访问sdcard分区下的所有目录以及文件,安全性得不到保证。
Fuse:
Fuse(filesystem in userspace)就是为了解决虚拟文件系统的问题而诞生。但是Fuse在使用过程中又出现了问题。
- I/O Overhead
正常的文件读写只要 open -> read/write -> close就可以,而且通过fuse的i/o操作却要多执行多个步骤(如下图),效率低。
以下是例子,明显fuse要慢很多。
- Double Caching
用了Fuse之后,由于Linux有page cache机制,这样Fuse和EXT4 FS都会Cache相同的一份内容。
SDCardFS:
这种情况下,SDCardFS诞生,此机制基于WrapFS,由三星开发(已经用来一段时间),现在Google将它从Android 8.0开始引进。
- SDCardFS的特征:
参考:
Diving into SDCardFS: How Google’s FUSE Replacement Will Reduce I/O Overhead
Why does FUSE on Android suck?
Android O will be bringing the new SDCardFS to replace FUSE