解决Android系统中虚拟SD卡和真实SD卡二者的矛盾!
因为手机存储理念的进化,现在Android4.1和4.2对虚拟SD卡和真实SD卡的表述有点复杂,如下:
虚拟SD卡,即系统设置中称为手机存储,习惯上称为内置SD卡,系统目录结构中又表述为/sdcard、/mnt/sdcard或/storage/sdcard0三种,有兼容性好,速度快的优势,但空间有限不能任意扩展;
真实SD卡,即系统设置中称为SD卡,习惯上称为外置SD卡,系统目录中又表述为/sdcard、/sdcard-ext、/mnt/sdcard2或/storage/sdcard1几种,容量大可自己选择,但有不兼容老应用,速度略慢的劣势;
而这也导致了种种使用上的问题,典型的如大型游戏数据包因容量大,无法放在虚拟SD卡目录,那放在真实SD卡中,却会造成游戏找不数据包。
而通过修改/system/etc/vold.fstab文件让内外卡互换的做法是修改目录与硬件设备的映射,虽然简单,但让却会存在各种问题,如不兼容某些应用、重刷系统后失效、每次互换都得重启、应用中表述混乱,应用找错合理的存储位置、浪费内置存储空间、降低系统运行速度、不兼容某些机型!
其实,现在很多软件,如高德导航5.X,支持手动或自动指定地图目录,Android4.1的照相机也会把照片存在真实SD卡上,EasyVoiceRecorder、CallRecorder等软件是支持自定义保存目录,而对于大型游戏的数据包和不能自定义存储目录的应用那怎么办呢?
经过再三考虑,为了适应大型游戏应用,不影响读写性能、让虚拟SD卡和真实SD卡优势互补,保证真实SD卡的目录结构整洁、系统运行中随时可变换、避免修改vold.fstab带来的各种问题,我决定回归本源,采用最早的做法,也最符合Linux的习惯——用自启动脚本来映射目录解决这个问题!
方法如下:
(以Android4.1中映射ColorDict的字典文件目录为例)
1.下载Script_Manager并安装;
2.在/storage/sdcard0(虚拟SD卡)和/storage/sdcard1(真实SD卡)两个分区的根目录各新建文件夹dictdata(ColorDict的字典文件目录);
3.打开Script_Manager,进入/storage/sdcard1分区根目录,“menu”-“新建”-“新建脚本”,输入脚本名字如“sdmnt.sh”,弹出“打开方式”界面中以文本编辑器的方式打开;
4.在文本编辑器中输入以下内容并保存:
#!/system/bin/sh
mount -o bind /storage/sdcard1/dictdata /storage/sdcard0/dictdata
5.按“返回”,在文件列表中找到“sdmnt.sh”并单击;
6.在弹出的界面中选择“Su”、“Boot”两个项目,点“保存”,再点“Run”执行,便可立即生效,你会发现虚拟SD卡的/dictdata指向真实SD卡/dictdata,实际上也是使用真实SD卡来进行读写,如果要增加其它目录映射,只需要编辑sdmnt.sh文件即可,编辑完不用重启,执行一下立即生效。