操作系统, 未分类

Android&Data to SD Card——理论编

相信每个使用Android的用户,都会安装各种APP,随时APP数量的增多,数据量的增加,data分区的可用空间越来越少,到最后安装APP时提示“储存空间不足”……

为了应付此问题,Android增加了APP2SD功能,但此功能是一个鸡肋……

对此,有人开发了LINK2SD,在SD卡上创建EXT分区,把已安装的应用均移动到SD卡的EXT分区中,并在内部储存的/data中创建对应文件的软链接,但LINK2SD依赖于zygote,也就是说需要在Android启动后才能启动LINK2SD挂载EXT分区。当年在联想A790E上使用该程序,每次启动系统,因为EXT分区未被挂载,所有软连接都变成了“坏链接”,导致Android自动重新安装所有APP……

相信各位的SD卡的容量都不会比内部存储小,既然SD卡比内部存储大,我们为何不考虑把整个/data(甚至是整个Android)放到SD卡上?

要知道如何把/data存放到SD卡上,我们首先要了解一下Android是如何挂载分区的:

我们按下电源键后,Android会根据Bootloader,加载内核。

Android内核会把物理内存以RAMDISK的方式,挂载到/,接着,内核会释放已被打包的文件至/,其中包括init, init.rc, init.*.rc, fstab.*等。

Android内核执行init这个二进制文件,init文件会运行init.rc,init.rc会根据fstab.*的内容,挂载system, data分区。

接下来的不在本文讨论范围内,省略……

看了上述的启动步骤,相信你已经大概了解DATA TO SD的方法了,没错,就是从fstab.*下手!

要更改fstab.*,意味着我们需要修改内核释放到RAMDISK的文件。

我们先来了解一下Android内核以及其释放到RAMDISK的文件的存在形式。

解包过Android固件的,相信都会留意到有一个boot.img文件,这个是内核吗?

准确来说不是,这是多个文件打包而成的,这些文件当中,内核,释放到RAMDISK的文件也是属于这些被打包的文件:

 

 

boot.img unpackage

 

boot.img-ramdisk.gz中包含了被释放到RAMDISK当中的文件,这些文件先被cpio打包,再被gzip压缩。

boot.img-zImage就是我们Android的内核,已被gzip压缩。

至于其他文件,我本人也不太了解具体用途,各位可通过搜索引擎了解。

解包RAMDISK,可以查看到类似的文件:

boot.img ramdisk unpackage

 

其中fstab.*就是我们要修改的文件,该文件包含了system, data的挂载信息,以我的华为C8813Q为例:

里面的内容表示把内部存储的第十二个分区挂载到/system,把内部存储的第十三个分区挂载到/data。

我们需在该文件中把内部存储的设备文件改成我们SD卡EXT分区的设备文件(一般是/dev/block/mmcblk1p[0-9]+)。

以为这样就完成了?No!

有些RAMDISK文件并不采用fstab.*的挂载信息,而是通过init.*.rc完成分区的挂载。

华为C8813Q就是这种货,事实上你不需要更改fstab.*当中的内容(我就被华为C8813Q坑了 d22 )。

华为C8813Q,在init.msm7627a.rc的第九行,第四十五行,第六是六行,分别挂载了/cache,/system,/data。

要更改被挂载的设备文件,我们修改init.msm7627a.rc即可。

修改完毕,确认无误后,重新打包为boot.img,并写入相应的分区(华为C8813Q是内部存储的第十二个分区)。

下次启动Android时,init就会根据你的设置,把SD卡的EXT分区挂载到/data,甚至是/system。

下面两张是我在2014年12月07日至2014年12月13日期间把CM 11以及DATA均存放到SD卡的图:

1418363999131 1418364056151

 

各位可以在第二张图查看到,SD卡的第三个,第四个分区分别被挂载到了/system, /data。

2014年12月14日至2014年12月20日期间,也就是使用600X的图:

1419261215032

1419260560984

1419260845074

 

由于本人要上学,高三期间一周仅有周日半天多一点的时间在家,因此不便发完整的教程,先分享理论编,完整教程计划于元旦假期分享。

 

最后来分享一下我的探讨Android&Data to SD Card部分过程,以及体验(要上学,住宿,而且高三,周日才放学,所以七天为一个周期):

2014年12月07日至2014年12月13日:

使用Class 10的SD卡。

研究并尝试DATA TO SD CARD,首先是把Emotion UI的DATA更改为SD卡的EXT分区,Android的启动速度比使用内部存储作为DATA慢了数秒,输入法首次加载需要数秒,但后续的使用影响不大,可以接受。

尝试ANDROID&DATA TO SD CARD,把CM 11安装到了SD卡,并成功启动,至于流畅度嘛,惨不忍睹……

 

2014年12月14日至2014年12月20日:

购买了一张600X,号称90 MB/s的读取速度。

老实说我对dd与hdparm的测试结果有点失望。

再次把CM 11安装到了SD卡(600X的),并成功启动,To my surprise!首次启动居然比使用内部存储还快,使用过程中丝毫没因IO而造成卡顿。

 

Comments are closed.