http://blog.csdn.net/bpingchang/article/details/8228166
http://www.netfoucs.com/article/Fybon/72468.html: android fuse
http://www.miui.com/thread-863099-1-1.html: 下面的文章android各版本的storage目录的变化:
---- android 4.0 ----
在galaxy nexus(GN)手机上userdata分区很大,被挂在/data目录,用户的数据通常是放在sd卡上,然而gn是没有sd卡的,所以google想了一个办法,就是虚拟一个。
所以,在userdata分区下有个目录叫media,是内置sd卡的数据存储位置,使用fuse技术将/data/media虚拟成为一个叫做/dev/fuse的设备,为了让程序能认出来,被同时挂载在 /mnt/sdcard 目录,
又为了兼容以前的程序,做了一个快捷方式(linux系统里叫软连接) /sdcard 指向的是 /mnt/sdcard .
当然,这些都是4.0的做法。
---- android 4.1 ----
在4.1里,同样也会使用fuse技术,/dev/fuse 会被同时挂载到/storage/sdcard0 目录,这个sdcard0表示第一个sd卡(如果有外置sd卡,那会多一个 /storage/sdcard1,比如我的xoom), /sdcard 软连接会指向 /storage/sdcard0 ,此时/mnt/sdcard 也是个软连接,会指向/storage/sdcard0。
如果你通过otg线接U盘,会被挂载到 /storage/usb0目录,stickmount这个软件为了让图库、快图、mx player等软件,能看到u盘里的数据,又同时挂载到 /storage/sdcard0/usStorage/sda1.
也许你会问,为什么不是usb0,而是sda1,这是linux的对硬盘的命名方式,如果你的u盘有多个分区,就分别是sda1,sda2这样一直排下去了。
---- android 4.2 ----
好了,我们开始说4.2系统。
谷歌是不是没事干啊,非要给android搞个多用户,你想想啊,在中国,可能因为经济问题,家里不是每人一个电脑,在美国,几乎需要用电脑的人,都会自己有一台或多台,一台电脑多人用的情况少之又少,这就是为什么叫PC了,顾名思义,个人电脑。像手机和平板这些东西,更加私人化了,很少公用了吧,我想在中国也是如此吧。
当然,谷歌也不完全是抽风,因为他有更大的战略部署,而且平板也的确有多人用的可能。
所以谷歌搞出来一个多用户,那每个人的应用、数据、个性配置都要分开吧。 应用和个性配置好弄,想想啊,通过权限控制,每人只能看自己的应用就行了,桌面也可以用自己的。
那数据怎么办????
好吧,调整用户数据的挂载结构。android 4.2,同样也会使用fuse技术/dev/fuse 会被挂载到/storage/emulated/0 目录,为什么是0呢,你还记得上边的sdcard0吧,第一个的意思。(如果有第二个,应该就是/storage/emulated/1,我们的三儿子没有外置sd卡,所以没法验证)
为了兼容以前,同时挂载到 /storage/emulated/legacy (故名思议,传统的),还建立三个软连接 /storage/sdcard0 ,/sdcard,/mnt/sdcard ,都指向 /storage/emulated/legacy
还有值得一提的是,4.2刚出来,这块变动又比较大,所以stickmount还没跟上,暂时没法通过otg挂载u盘了。
所以大家不用为0而苦恼了,这是正常的“生理特征”。
也许你会问,这个0和多用户有什么关系呢,那是因为多用户这个新特性,只在平板上才启用,在手机上会被禁用的。但是底层实现是一致的。 /mnt/shell/emulated 目录和 /storage/emulated 下的文件夹是一样的。(注意,这个/mnt/shell/emulated 不是挂载出来的)
由于我没有平板升级到4.2,所以只是推测,/mnt/shell/ 是为了多用户准备的,因为linux的多用户是基于shell实现的。
comments(android 4.2):
用了fuse之后,内置sdcard被mount到/data目录。/data/media又被fuse用来map成了/dev/fuse设备。这个/dev/fuse设备又被挂到/storage/sdcard0. 而外置sdcard则被挂在了/storage/sdcard1. 到了4.2以后, 增加了多用户的概念, 然后就多了一层emulate.本质上仍然是前面的处理。usb会被挂到/stoarge/usb0....什么的下面。
android4.4的新情况:
http://www.iteye.com/news/28768-Android-KitKat
http://bbs.anzhi.com/thread-9149319-1-1.html
http://www.zhihujingxuan.com/17310.html
http://gw-1984.blog.163.com/blog/static/952912892013101582942816/:解释"EMULATED_STORAGE_SOURCE"/"EMULATED_STORAGE_TARGET"
关于primary存储器,一般指内部大容量存储器, 比如sdcard0. android 4.4之后, 第二块外部sdcard(sdcard1),不能在根目录操作,只能使用下面的接口, 操作特定的目录。
android.content.Context#getExternalFilesDir/getExternalCacheDir/(getExternalStoragePublicDirectory(需要android.Manifest.permission#WRITE_EXTERNAL_STORAGE/android.Manifest.permission#READ_EXTERNAL_STORAGE))