虚拟SD卡在Android系统中的实现

时间:2022-10-08 06:56:42

虚拟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:///NXPVqz。本人的手机是长虹zme,所以脚本也是基于zme写的,后面会讲怎么样移植到其他手机。

先说一下前提要求,手机必须是已经root了的,假定玩家已经掌握了root、授权等基本概念和操作,busybox已经安装好,也已经安装并懂得使用RE管理器,如果能懂得一些linux和adb命令那就更好,可以自己去琢磨、试验。另外,玩家应事先备份system/bin/vold和/system/etc/vold.fstab这两个文件,因为如果多次执行安装脚本可能造成原始文件被覆盖。

具体安装方法是,创建目录/data/fake-SD,设置权限为全选即所有人可读写,把附件中的几个文件拷贝到/data/fake-SD下面(注意需要修改所有脚本文件的权限为全部可执行,否则不成功,另外安装脚本中用的都是绝对路径,如果想换个路径,修改一下脚本即可),拷贝过程可能需要外置SD卡作为中介,或者用腾讯手机助手直接上传到手机内存,然后用RE管理器进入该目录,执行其中的install-fake-SD.sh脚本即可(注意修改权限)。执行完后立即生效,无需重启动。

以后的使用过程中,执行switch-to-fake-SD.sh就会切换到虚拟的内置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.sh和auto-start-real-SD.sh是安装和切换时要被拷贝到/system/etc下面的自启动脚本,分别对应使用虚拟内置SD卡和外置SD卡的情况,这个自启动脚本将会被改名为system/etc/intall-recovery.sh(之所以用这个文件名,是因为这个文件并不存在,但系统启动时将会自动查找并执行有该名字的脚本,而其它.rc自启动文件都在根目录,如果要修改的话就需要修改boot映像文件,需要刷机太麻烦,而system/etc是可写的,所以只是利用这个系统启动自动执行功能而已,并非真要安装什么recovery。其实这也算是个小窍门,可以利用它来执行一些其它需要在系统启动时自启动的功能)。

在正常使用虚拟SD卡之后,最好不要再去执行安装脚本install-fake-SD.sh了,因为安装过程中它会删除原来的虚拟映像文件,造成数据丢失。/data/fake-SD/SD.bin映像文件和data/fake-SD目录要小心,千万不要误删了。

4.移植

最后谈一下移植到其他机器的方法。如果想要在其它机型上使用,必须修改以下几项内容:vold.fstab.real-SD文件中的设备路径、每个脚本文件开头的关于设备名称和路径的定义、system分区的设备名和文件系统类型、映像文件的路径、名称和大小。下面以中兴v880为例。虽然V880内置空间很小,但笔者的V880是给家里老人用,只需要电话短信和照相功能就足够,因此额外配一张SD卡还是显得有些浪费,因此想虚拟一个80M的SD卡,也能够存几百张照片了。

下面来说明怎样针对自己的机型修改脚本文件。这里最好需要用到UltraEdit,方便编辑脚本文件。首先将vold.fstab.real-SD文件中的dev_mount sdcard/mnt/sdcard auto/devices/platform/msm_sdcc.4/mmc_host替换,具体的设备名称路径在sys/devices/platform里面找到,v880对应的设备路径改为dev_mount sdcard/mnt/sdcard auto/devices/platform/msm_sdcc.1/mmc_host/mmc0

然后将每个脚本文件中的设备名和路径都修改一遍,这里主要修改:

(1)大容量存储设备文件字段ums_dev,具体在/sys/devices/platform/找到lun0/file,然后填写相应的路径到ums_dev的等号后。

(2)真实SD卡设备字段real_sd_dev,具体在/dev/block/里面找到mmcblk0p1文件的相应路径填入。SD/MMC的驱动通用,进一步的,Linux的设备节点就延续了MMC的这个名字,后面的blk是块设备这个英文的简写,mmcblk也就是“mmc/sd块设备”,0就是这个mmc/sd设备的顺序编号,p1就是第一个分区。如果有多个mmcblk就只能根据名称一个个试了。

(3)如果想修改虚拟SD卡的大小,只需要修改install-fake-SD.sh中的fake_SD_img_sparse_seek参数即可,这个参数是以块大小为单位的,而块大小我用的是2K,因此fake_SD_img_sparse_seek=1048576就相当于2G,如果想更改内置虚拟SD卡大小就修改这个参数即可,修改块大小也可以。经试验,2k的块大小的速度是比较快的,因此不建议修改块大小,只修改seek数就行。80M对应的seek=40960(80M×1024K÷2K)。

(4)虚拟SD卡的路径如果放在/data下就不用改,如果放到自定义的目录下就修改为相应的路径。

需要注意的是,如果选择预占用空间完整文件的方法,执行安装脚本的时候就会当场生成一个2G的大文件,这个过程很漫长,估计会接近10分钟,因此建议开始做试验的时候还是用缺省的稀疏文件方法,初始大小基本为0,生成速度快,便于反复试验。

再次提醒每次改动文件后都要记得修改权限之后才能执行成功。至此,已经完成了的虚拟SD卡脚本的移植,怎么样?快来试试充分利用上你的手机空间吧!

作者简介:马远佳(1984―),男,湖南湘潭人,硕士,广东石油化工学院讲师,研究方向:故障诊断与检测技术。

上一篇:L0范数最小化方法及其在网格光顺算法中的应用 下一篇:浅谈射频电磁场对智能电表的影响