虚拟SD卡在Android系统中的实现
1.引言
我们知道,Android的设计中,SD卡是非常重要的。有些APK在运行中需要SD卡来存储数据,而有些大型游戏需要大量的SD卡空间这样如果系统没有接入SD卡,某些APK就会碰到安装或运行的问题。但是目前的趋势是,手机内部存储空间越来越大,对于很多人来说,如果不需要安装大型软件或游戏数据包,仅仅是安装普通软件,这些空间已经绰绰有余,但是很多程序如拍照、下载等又必须放到外置SD卡上,而不能放到内部存储中,为了使用这些功能,就必须装一个没有太多用处的SD卡,实在是有点浪费。所以要想办法把内置空间用起来,现在主流的做法是怎样的呢?
三星、联想的方案是这样的:把内部flash装载为SDcard,然后把外部SD卡装载到/mnt/SDcard/下面的某个子目录。这种做法的优点是可以有一个一直存在的SD卡,缺点是内置flash要足够大,mediascanner中要增加/mnt/SDcard/externalSDcard的扫描、装载卸载处理,而APK是没有机会安装到实际的外置SD卡上的。
另一种方案是在没有SD卡插入时把内部flash卡除了安装系统、app和数据之外的剩余空间独立做成一个分区,然后用这个分区来模拟SD卡,这就是网上常见的所谓内置SD卡和外置SD卡。而在SD卡插入时把实际SD卡重新装载到mnt/SDcard。此时,实际上对于系统应用和app来说,只有内置SD卡即虚拟SD卡才是真正的SD卡。这种做法的优点是SD卡插入时APK会安装到实际SD卡上,可以把flash上的某个目录作为虚拟SD卡,比较灵活。缺点是因为内置SD卡所对应的路径是默认的SD卡路径,对于应用程序来说是可见的,而外置SD卡只能当作额外存储来用,应用程序基本用不上,而且安装到虚拟SD卡上的APK在第二个SD卡插入时消失所以才出现了为了扩大内置SD卡空间而把内置、外置SD卡进行交换的各种破解方案。
2.思路
以上两种方案都有各自的缺陷,如果能像PC机上的虚拟光驱那样,使得只用内部存储空间就可以模拟出一个SD卡,在无需插入外置SD卡的情况下,就能让所有app都认为已经有SD卡而能正常运行,而且这个方法还应当尽量简单,最好不需要刷机,因为root对于多数人来说还不算太难,也就是下载一个应用运行一下的问题,但刷机毕竟风险较大,对于多数人来说还是有点顾虑的。
下面的方案,可以解决虚拟SD卡的绝大部分问题,且无需刷机,无需修改内核映像文件和启动ramdisk,只需修改一些文件、增加几个脚本即可,可以实现开机自启动,而且虚拟SD卡中的空闲部分也不占用data分区的实际空间。虚拟SD卡还有另一个额外好处,就是省电,毕竟读写外置SD卡还是要费一点电的。能够支持U盘模式。而且还更进了一步,能够支持双重加载,手机和pc能同时访问虚拟SD卡,对于用户和应用程序来说,虚拟SD卡与外置SD卡完全没有区别了。额外的,本方案可以支持三重挂载,在使用手机助手等调试工具的同时,还可以实现U盘模式。
3.方法
现在说一下详细步骤,其实非常简单,只需要执行一下一个安装脚本即可,然后就万事大吉了。下载地址http//url/NXPVqz。本人的手机是长虹zme,所以脚本也是基于zme写的,后面会讲怎么样移植到其他手机。
先说一下前提要求,手机必须是已经root了的,假定玩家已经掌握了root、授权等基本概念和操作,busybox已经安装好,也已经安装并懂得使用RE管理器,如果能懂得一些linuxadb命令那就更好,可以自己去琢磨、试验。另外,玩家应事先备份system/bin/vold/syst
em/etc/vold.fstab这两个文件,因为如果多次执行安装脚本可能造成原始文件被覆盖。
具体安装方法是,创建目录/data/fake-SD,设置权限为全选即所有人可读写,把附件中的几个文件拷贝到/data/fake-SD下面(注意需要修改所有脚本文件的权限为全部可执行,否则不成功,另外安装脚本中用的都是绝对路径,如果想换个路径,修改一下脚本即可),拷贝过程可能需要外置SD卡作为中介,或者用腾讯手机助手直接上传到手机内存,然后用RE管理器进入该目录,执行其中的install-fake-SD.sh脚本即可(注意修改权限)。执行完后立即生效,无需重启动。
以后的使用过程中,执行switch-to-fake-SD.sh就会切换到虚拟的内置android模拟点击SD卡,如果想使用外置SD卡,就执行switch-to-real-SD.sh,执行完后都是立即生效,无需重启动。
目前方案的效果很不错,可以支持三重挂载,即在打开usb调试的情况下还能做到同时支持U盘模式和手机访问SD卡,这个对于虚拟内置SD卡和外置SD卡都支持。另外插入数据线时不会再出现提示画面,自动进入U盘模式。如果使用中出现usb线插拔之后虚拟SD卡挂载不上等等问题,再用RE管理器执行一遍自启动脚本system/etc/intall-recovery.sh往往就能解决。如果还是不行,那就重启动机器。
auto-start-fake-SD.shauto-start-real-SD.sh是安装和切换时要被拷贝到/system/etc下面的自启动脚本,分别对应使用虚拟内置SD卡和外置SD卡的情况,这个自启动脚本将会被改名为system/etc/intall-recovery.sh(之所以用这个文件名,是因为这个文件并不存在,但系统启动时将会自动查并执行有该名字的脚本,而其它.rc自启动文件都在根目录,如果要修改的话就需要修改boot映像文件,需要刷机太麻烦,而system/etc是可写的,所以只是利用这个系统启动自动执行功能而已,并非真要安装什么recovery。其实这也算是个小窍门,可以利用它来执行一些其它需要在系统启动时自启动的功能)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。