论文部分内容阅读
摘 要:App2SD(ApplicationtoSDcard)可以将系统中内部存储的部分文件迁移到外部存储(如SD卡)中,以此来实现内部存储的“扩容”也让外部存储空间得到充分利用,本文通过对基本原理和环境准备的详细说明,将迁移功能在操作系统的层面完成。主要以三星i559手机为例,描述了实现App2SD的具体实现过程,让手机获得真正想要的App2SD功能。
关键词:Android系统;App2SD
中图分类号:TP311.1
1 应用背景
Android从2.2开始已支持App2SD(ApplicationtoSDCARD)的功能,可以将系统中内部存储的部分文件迁移到外部存储(如SD卡)中,以此来实现内部存储的“扩容”也让外部存储空间得到充分利用。当下有很多也称之为App2SD的软件,但这些软件都是在应用层面将已安装在内部存储上的软件移动到外存中去,需要在每次安装新程序后手工进行迁移操作,使用时较为麻烦且受被迁移软件特性(某些软件本身不支持迁移,即便被强制迁移也会让软件运行不正常)的限制。本文所实现的内容则是要将迁移功能在操作系统的层面完成,通过系统层实现App2SD功能具有对上层的Android框架完全透明的优点,让程序安装时将本应放置于内部存储的安装文件自动存放到外存上且不会受安装程序的限制。其实,即便是2.2以上的系统很多手机商家也未将该功能直接加到与手机相配的Android系统中,因此要让手机想要真正获得App2SD的功能就需要在了解其原理的基础上进行手工实现。
2 基本原理
通常手机的存储空间可以分为三个部分:内部RAM、内部ROM和外部ROM。内部RAM即为内存,是CPU运算时数据的重要暂存空间;内部ROM则是存放操作系统Android的内部闪存,如果与一台装有windows系统的电脑进行类比,可认为内部ROM是装有Windows系统的系统盘(通常是C盘),这部分空间由手机自带且容量较小;而外部ROM可看作是除系统盘以外的其他磁盘,由外部存储卡(如SD、TF卡等)组成且容量较大,用于存放照片、音乐等用户自己的文件。Android可以设置系统在安装程序时将程序安装在什么位置,通常会有内部ROM、外部ROM和由程序自己决定三种选择,用户多会选择“由程序自己决定”方式,而较多程序在开发时因结构设计以及考虑到程序的快速稳定运行都需将安装位置放在内部ROM中。但由于内部ROM本身容量较小(通常只有200M),因而会出现在安装多个软件后内部ROM的容量使用就会处于报警状态,而外部ROM的空间却被大量闲置未被使用的情况。由此提出了将部分外部ROM划分出来挂载到内部ROM上供系统使用。
具体在实现中需先将外存卡划分为两个分区:一个为FAT格式仍作为外部ROM使用,另一个则为EXT格式(通常是ext2或ext3,视系统的识别能力而定)作为挂载分区。使用EXT格式的原因是防止出现非预期结果,否则会有被系统启动过程中将其当作外部ROM进行挂载的可能。经过分区并格式化后的外存卡在系统启动后会在/dev/block中的设备列表中有所反映:多出一个mmcblk0p2(mmcblk0是指外存卡设备,而mmcblk0p1和mmcblk0p2则是其上的两个分区)设备文件。此时在系统中(考虑到稳定与安全性通常会选择在/system下)创建目录,将mmcblk0p2以ext格式挂载在该目录上,从此存放在该目录中的任何文件实际上都被存放在了外存卡的第二个EXT分区上。接下来便可把与程序安装有关的多个目录(/data下的app、app-private、dalvik-cache和data)都迁移至EXT分区,当然最后还须考虑成功实现App2SD功能的重要条件:让系统继续使用这些将被迁走的目录,因此需在/data下为被迁走的目录建立指向EXT分区对应目录的链接文件。
上述的EXT分区挂载工作是在系统启动后手动完成的,但Android重启后会因为EXT分区没被挂载使得被迁移的目录不能访问最终造成系统不能成功,因此还需要实现系统启动时自动挂载分区的功能。在系统的根目录下有一个init.rc文件可用来控制Android的初始化进程完成某些初始化工作,在该文件适当的位置加入控制指令便可让系统启动时自动挂载EXT分区。不过直接修改此文件是不可行的,因为此时的init.rc文件只是一副本:手机的内部ROM中留存有一个启动镜像文件boot.img,且此镜像文件中包含有init.rc,系统启动时会把boot.img展开并提取出init.rc并放于根目录下,初始化进程是以这时产生的init.rc文件作为控制依据完成初始化工作的,所以在启动完成后对init.rc文件的编辑操作只是对一个副本进行的,此副本在下次启动时将会被覆盖且不会起到任何作用。然而,boot.img是安装系统(即常说的“刷机”)时被写入手机的,之前该文件是与Android系统的其它重要文件(如内核文件kernel、恢复镜像文件recovery.img、系统结构文件system.rfs等)一并打包作为系统安装所用的rom文件(常说的刷机包)而存在的,所以需要把rom包解开后提取并修改当中的init.rc文件再封装成有效的rom文件且刷入手机才能实现所需要的初始化控制功能。
3 环境准备
3.1 外存分区
将手机的SD卡取出插在读卡器上与电脑相连,通过“AcronisDiskdirectorSuite”软件将sd卡分成两个分区并进行格式化,一个作为常规外部ROM(fat32格式,以下称为FAT分区),另一个则存放被迁移的程序文件(ext2格式,以下称为EXT分区)。EXT分区应根据自己将安装的应用多少和大小而定(一般在400至500兆),剩下的空间可都分配给FAT分区使用。需要注意的是,两个分区在创建时都应设为主分区类型,且FAT分区在EXT分区之前。 3.2 工具软件
在windows下创建adb与bootimg两个文件夹,分别放入adb(AndroidDebugBridge)与bootimg工具软件。adb用于和手机间的通信。除了本文所提到的功能以外,更多的adb功能可通过帮助命令“adb-h”获得;bootimg则用于对boot.img文件进行展开和打包操作。
3.3 操作环境
外存卡插回手机并与电脑本连,在windows下同时开启两个控制终端(“cmd”命令)窗口,一个通过“adbshell”命令与手机的Linux系统相连,实现与手机Linux系统的shell命令交互;另一个则保持在windowsDOS环境下完成与手机间的文件互传以及boot.img文件的解包和打包。在Linuxshell环境中,通过“mkdir”命令在/sdcard上建立rom和ramdisk两个工作目录分别用于存放刷机文件rom.tar和根结构文件ramdisk.gz展开后的文件。
4 实现过程
本节开始将以三星i559手机(Android版本为2.3.5,本身不带有App2SD功能)为例,将实现过程进行详细说明。实现过程主要分为6个步骤,对于命令行的描述除了命令本身内容外,将以“【L】”和“【W】”开头来标注该命令的运行环境是LinuxShell或是WindowsDOS(参见上一节),同时对命令的功能解释说明用分号“;”作为分隔符放于命令行的后段。
4.1 提取ramdisk文件
本步骤把与三星i559相配的刷机包文件rom.tar进行解包,提取出启动镜像文件boot.img,再利用bootimg.exe工具将boot.img文件展开进而得到Android根结构的描述文件ramdisk.gz。值得注意的是,展开boot.img文件时,bootimg会将boot.img中的base、cmdline、page_size和padding_size等用于Android系统运行所需的配置参数值显示于屏幕上,我们可记下这些值以便后面进行再封包步骤,从而省去了单独对boot.img文件的分析工作。
(1)【W】adbpushrom.tar/sdcard/rom.tar;将刷机文件放入sdcard卡;(2)【L】cd/sdcard/rom/;变更当前目录;(3)【L】tarxf../rom.tar;展开刷机文件得到boot.img;(4)【W】cdD:\bootimg\;变更windows下当前工作目录;(5)【W】adbpull/sdcard/rom/boot.img.\boot.img;将boot.img拷到windows中;(6)【W】bootimg--unpack-bootimg;解开boot.img文件,得到ramdisk.gz文件;
说明:第(4)步变换windows下的工作目录是为了第(5)步拷贝出的boot.img文件与bootimg.exe文件在同一目录下以便第(6)步能够正常执行。
4.2 解包ramdisk文件获取init.rc
将上一步骤中得到的ramdisk.gz文件解压会得到一个cpio格式的存档文件,利用cpio命令将存档文件展开即可得到原始的init.rc。
(1)【W】adbpushramdisk.gz/sdcard/;将ramdisk文件放入sdcard卡;(2)【L】gzip-dramdisk.gz;解压ramdisk.gz得到cpio格式文件ramdisk;(3)【L】cd/ramdisk;变更工作目录;(4)【L】cpio-i-F../ramdisk;展开ramdisk文件,得到init.rc文件。
说明:第(2)步在解压ramdisk.gz文件生成cpio格式的ramdisk文件后原有的ramdisk.gz文件会自动被删除;第(3)步的工作目录的目的是为了让第(4)步展开的所有文件(包括init.rc)存放在/ramdisk下。
4.3 修改init.rc文件
Linux环境下用vi编辑上一步得到的init.rc文件,在“onpost-fs”节内开始插入“mountext2/dev/block/mmcblk0p2/system/extrw”并保存文件。
4.4 封装新的rom包并刷入手机
本步骤主要是第2、3步的逆向过程。将修改后的init.rc文件与其他展开自ramdisk.gz的文件一并重新打包并压缩生成新的ramdisk.gz文件,再次利用bootimg工具将ramdisk.gz与其他从原boot.img展开得到的文件一并再封装成新的boot.img文件,最终形成可用于刷机的rom文件。
(1)【L】find.|cpio-o-Hnewc|gzip>../ramdisk.gz;生成新的ramdisk.gz文件;(2)【W】adbpull/sdcard/ramdisk.gz.\;将新ramdisk.gz拷至windows下;(3)【W】bootimg--repack-bootimgxxx“ccc”yyyzzz;生成新的boot.img文件;(4)【W】adbpushboot.img/sdcard/rom;将新生成的boot.img传到sdcard卡;(5)【L】cd/sdcard/rom;变更目录;(6)【L】tarcf../new_rom.tar;在/sdcard下生成新的刷机rom文件;(7)【W】adbpull/sdcard/new_rom.tar.\;将新rom文件传入windows;(8)【W】adbrebootdownload;重启手机并进入刷机模式
说明:第(1)步须在/sdcard/ramdisk下进行;第(2)步拷贝出的ramdisk.gz文件应与bootimg.exe文件放置在同一目录下覆盖原有的ramdisk.gz文件;第(3)步命令中的xxx、ccc、yyy和zzz分别对应于第2步骤中记录的base、cmdline、page_size和padding-size参数值;第(4)步将把/sdcard/rom中原有的boot.img文件覆盖;第(6)步执行后会在/sdcard中看到新生成的刷机包new_rom.tar;在第(8)步后便可利用刷机工具将新的rom包刷入手机。 4.5 Android环境调整
手机在刷机完成并重新启动后,新的init.rc文件将开始被系统使用。接下来的工作是在系统中建立挂载EXT分区用的目录、迁移相关目录以及建立链接文件。本步骤进行前,需先通过mount命令对/system目录进行读写重挂载,否则将不能在/system建立挂载所用的目录,但因各手机机型的不同对/system的挂载点也不同,故此处不作说明。对/system的可写挂载也可利用手机上的某些软件(如RootExplorer)来实现,但无论哪种方法都须先对新装入的Android系统进行“root”(获取root权限)操作。
(1)【L】mkdir/system/ext;创建挂载EXT分区用的目录;(2)【L】chmod775/system/ext;设置目录的访问权限;(3)【L】chownroot/system/ext;设置目录的属主;(4)【L】chgrproot/system/ext;设置目录的属组;(5)【L】mount-r-w-text2/dev/block/mmcblk0p2/system/ext;手工挂载ext2分区到/system/ext上;(6)【L】busyboxcp-a/data/xxx/system/ext/;将被迁移目录拷贝到ext2分区;(7)【L】busyboxrm-rf/data/xxx;删除/data下的被迁移目录(8)【L】busyboxln-s/system/ext/xxx/data/xxx;建立/data下各被迁移的目录相应的软链接并指向/system/ext下对应的目录。
说明:因为最终要将/data中的内容迁移到/system/ext目录中,所以第(2)、(3)、(4)步对ext目录的属性设置都以/data为参照;第(5)步对设备的手工挂载是因为/system/ext是在新rom刷入手机后被建立的,所以新rom中init.rc的自动挂载还不能起作用;第(6)、(7)、(8)步命令中的xxx指代/data目录下app、app-private、dalvik-cache、data等需要被迁移的目录。
5 结论
本文主要以三星i559手机为例,描述了实现App2SD的具体实现过程。但文章所讲述的内容并不可能完全适用于各种型号与系统版本的手机,应用者需根据自己的硬件与软件条件进行调整与优化。同时本文所提出的实现方法还有待改进与完善,比如当系统在运行时如果外存卡有拔插操作(如人为取出并通过读卡器与电脑进行数据交换),而在被Android再识别时外存卡其对应的设备文件可能会发生变化(从mmcblk0变成mmcblk1),从而导致原来挂载于mmcblk0p2上的EXT分区不再可用最终造成系统的不正常运行,所以作为稳定可靠的方法还应加入监测功能,根据外存卡的实际状态动态获取相应的设备文件并自动进行“再”挂载操作。
参考文献:
[1]android系统启动流程分析.http://blog.csdn.net/sincethen/article/details/5942472.
[2]Android启动流程代码分析.http://wenku.baidu.com/view/571d010716fc700abb68fc28.html.
[3]android系统app2sd(修改boot.img).http://www.cnblogs.com/mahang/archive/2011/09/04/2166066.html.
作者单位:中国人民解放军装甲兵工程学院训练部信息管理中心,北京 100072
关键词:Android系统;App2SD
中图分类号:TP311.1
1 应用背景
Android从2.2开始已支持App2SD(ApplicationtoSDCARD)的功能,可以将系统中内部存储的部分文件迁移到外部存储(如SD卡)中,以此来实现内部存储的“扩容”也让外部存储空间得到充分利用。当下有很多也称之为App2SD的软件,但这些软件都是在应用层面将已安装在内部存储上的软件移动到外存中去,需要在每次安装新程序后手工进行迁移操作,使用时较为麻烦且受被迁移软件特性(某些软件本身不支持迁移,即便被强制迁移也会让软件运行不正常)的限制。本文所实现的内容则是要将迁移功能在操作系统的层面完成,通过系统层实现App2SD功能具有对上层的Android框架完全透明的优点,让程序安装时将本应放置于内部存储的安装文件自动存放到外存上且不会受安装程序的限制。其实,即便是2.2以上的系统很多手机商家也未将该功能直接加到与手机相配的Android系统中,因此要让手机想要真正获得App2SD的功能就需要在了解其原理的基础上进行手工实现。
2 基本原理
通常手机的存储空间可以分为三个部分:内部RAM、内部ROM和外部ROM。内部RAM即为内存,是CPU运算时数据的重要暂存空间;内部ROM则是存放操作系统Android的内部闪存,如果与一台装有windows系统的电脑进行类比,可认为内部ROM是装有Windows系统的系统盘(通常是C盘),这部分空间由手机自带且容量较小;而外部ROM可看作是除系统盘以外的其他磁盘,由外部存储卡(如SD、TF卡等)组成且容量较大,用于存放照片、音乐等用户自己的文件。Android可以设置系统在安装程序时将程序安装在什么位置,通常会有内部ROM、外部ROM和由程序自己决定三种选择,用户多会选择“由程序自己决定”方式,而较多程序在开发时因结构设计以及考虑到程序的快速稳定运行都需将安装位置放在内部ROM中。但由于内部ROM本身容量较小(通常只有200M),因而会出现在安装多个软件后内部ROM的容量使用就会处于报警状态,而外部ROM的空间却被大量闲置未被使用的情况。由此提出了将部分外部ROM划分出来挂载到内部ROM上供系统使用。
具体在实现中需先将外存卡划分为两个分区:一个为FAT格式仍作为外部ROM使用,另一个则为EXT格式(通常是ext2或ext3,视系统的识别能力而定)作为挂载分区。使用EXT格式的原因是防止出现非预期结果,否则会有被系统启动过程中将其当作外部ROM进行挂载的可能。经过分区并格式化后的外存卡在系统启动后会在/dev/block中的设备列表中有所反映:多出一个mmcblk0p2(mmcblk0是指外存卡设备,而mmcblk0p1和mmcblk0p2则是其上的两个分区)设备文件。此时在系统中(考虑到稳定与安全性通常会选择在/system下)创建目录,将mmcblk0p2以ext格式挂载在该目录上,从此存放在该目录中的任何文件实际上都被存放在了外存卡的第二个EXT分区上。接下来便可把与程序安装有关的多个目录(/data下的app、app-private、dalvik-cache和data)都迁移至EXT分区,当然最后还须考虑成功实现App2SD功能的重要条件:让系统继续使用这些将被迁走的目录,因此需在/data下为被迁走的目录建立指向EXT分区对应目录的链接文件。
上述的EXT分区挂载工作是在系统启动后手动完成的,但Android重启后会因为EXT分区没被挂载使得被迁移的目录不能访问最终造成系统不能成功,因此还需要实现系统启动时自动挂载分区的功能。在系统的根目录下有一个init.rc文件可用来控制Android的初始化进程完成某些初始化工作,在该文件适当的位置加入控制指令便可让系统启动时自动挂载EXT分区。不过直接修改此文件是不可行的,因为此时的init.rc文件只是一副本:手机的内部ROM中留存有一个启动镜像文件boot.img,且此镜像文件中包含有init.rc,系统启动时会把boot.img展开并提取出init.rc并放于根目录下,初始化进程是以这时产生的init.rc文件作为控制依据完成初始化工作的,所以在启动完成后对init.rc文件的编辑操作只是对一个副本进行的,此副本在下次启动时将会被覆盖且不会起到任何作用。然而,boot.img是安装系统(即常说的“刷机”)时被写入手机的,之前该文件是与Android系统的其它重要文件(如内核文件kernel、恢复镜像文件recovery.img、系统结构文件system.rfs等)一并打包作为系统安装所用的rom文件(常说的刷机包)而存在的,所以需要把rom包解开后提取并修改当中的init.rc文件再封装成有效的rom文件且刷入手机才能实现所需要的初始化控制功能。
3 环境准备
3.1 外存分区
将手机的SD卡取出插在读卡器上与电脑相连,通过“AcronisDiskdirectorSuite”软件将sd卡分成两个分区并进行格式化,一个作为常规外部ROM(fat32格式,以下称为FAT分区),另一个则存放被迁移的程序文件(ext2格式,以下称为EXT分区)。EXT分区应根据自己将安装的应用多少和大小而定(一般在400至500兆),剩下的空间可都分配给FAT分区使用。需要注意的是,两个分区在创建时都应设为主分区类型,且FAT分区在EXT分区之前。 3.2 工具软件
在windows下创建adb与bootimg两个文件夹,分别放入adb(AndroidDebugBridge)与bootimg工具软件。adb用于和手机间的通信。除了本文所提到的功能以外,更多的adb功能可通过帮助命令“adb-h”获得;bootimg则用于对boot.img文件进行展开和打包操作。
3.3 操作环境
外存卡插回手机并与电脑本连,在windows下同时开启两个控制终端(“cmd”命令)窗口,一个通过“adbshell”命令与手机的Linux系统相连,实现与手机Linux系统的shell命令交互;另一个则保持在windowsDOS环境下完成与手机间的文件互传以及boot.img文件的解包和打包。在Linuxshell环境中,通过“mkdir”命令在/sdcard上建立rom和ramdisk两个工作目录分别用于存放刷机文件rom.tar和根结构文件ramdisk.gz展开后的文件。
4 实现过程
本节开始将以三星i559手机(Android版本为2.3.5,本身不带有App2SD功能)为例,将实现过程进行详细说明。实现过程主要分为6个步骤,对于命令行的描述除了命令本身内容外,将以“【L】”和“【W】”开头来标注该命令的运行环境是LinuxShell或是WindowsDOS(参见上一节),同时对命令的功能解释说明用分号“;”作为分隔符放于命令行的后段。
4.1 提取ramdisk文件
本步骤把与三星i559相配的刷机包文件rom.tar进行解包,提取出启动镜像文件boot.img,再利用bootimg.exe工具将boot.img文件展开进而得到Android根结构的描述文件ramdisk.gz。值得注意的是,展开boot.img文件时,bootimg会将boot.img中的base、cmdline、page_size和padding_size等用于Android系统运行所需的配置参数值显示于屏幕上,我们可记下这些值以便后面进行再封包步骤,从而省去了单独对boot.img文件的分析工作。
(1)【W】adbpushrom.tar/sdcard/rom.tar;将刷机文件放入sdcard卡;(2)【L】cd/sdcard/rom/;变更当前目录;(3)【L】tarxf../rom.tar;展开刷机文件得到boot.img;(4)【W】cdD:\bootimg\;变更windows下当前工作目录;(5)【W】adbpull/sdcard/rom/boot.img.\boot.img;将boot.img拷到windows中;(6)【W】bootimg--unpack-bootimg;解开boot.img文件,得到ramdisk.gz文件;
说明:第(4)步变换windows下的工作目录是为了第(5)步拷贝出的boot.img文件与bootimg.exe文件在同一目录下以便第(6)步能够正常执行。
4.2 解包ramdisk文件获取init.rc
将上一步骤中得到的ramdisk.gz文件解压会得到一个cpio格式的存档文件,利用cpio命令将存档文件展开即可得到原始的init.rc。
(1)【W】adbpushramdisk.gz/sdcard/;将ramdisk文件放入sdcard卡;(2)【L】gzip-dramdisk.gz;解压ramdisk.gz得到cpio格式文件ramdisk;(3)【L】cd/ramdisk;变更工作目录;(4)【L】cpio-i-F../ramdisk;展开ramdisk文件,得到init.rc文件。
说明:第(2)步在解压ramdisk.gz文件生成cpio格式的ramdisk文件后原有的ramdisk.gz文件会自动被删除;第(3)步的工作目录的目的是为了让第(4)步展开的所有文件(包括init.rc)存放在/ramdisk下。
4.3 修改init.rc文件
Linux环境下用vi编辑上一步得到的init.rc文件,在“onpost-fs”节内开始插入“mountext2/dev/block/mmcblk0p2/system/extrw”并保存文件。
4.4 封装新的rom包并刷入手机
本步骤主要是第2、3步的逆向过程。将修改后的init.rc文件与其他展开自ramdisk.gz的文件一并重新打包并压缩生成新的ramdisk.gz文件,再次利用bootimg工具将ramdisk.gz与其他从原boot.img展开得到的文件一并再封装成新的boot.img文件,最终形成可用于刷机的rom文件。
(1)【L】find.|cpio-o-Hnewc|gzip>../ramdisk.gz;生成新的ramdisk.gz文件;(2)【W】adbpull/sdcard/ramdisk.gz.\;将新ramdisk.gz拷至windows下;(3)【W】bootimg--repack-bootimgxxx“ccc”yyyzzz;生成新的boot.img文件;(4)【W】adbpushboot.img/sdcard/rom;将新生成的boot.img传到sdcard卡;(5)【L】cd/sdcard/rom;变更目录;(6)【L】tarcf../new_rom.tar;在/sdcard下生成新的刷机rom文件;(7)【W】adbpull/sdcard/new_rom.tar.\;将新rom文件传入windows;(8)【W】adbrebootdownload;重启手机并进入刷机模式
说明:第(1)步须在/sdcard/ramdisk下进行;第(2)步拷贝出的ramdisk.gz文件应与bootimg.exe文件放置在同一目录下覆盖原有的ramdisk.gz文件;第(3)步命令中的xxx、ccc、yyy和zzz分别对应于第2步骤中记录的base、cmdline、page_size和padding-size参数值;第(4)步将把/sdcard/rom中原有的boot.img文件覆盖;第(6)步执行后会在/sdcard中看到新生成的刷机包new_rom.tar;在第(8)步后便可利用刷机工具将新的rom包刷入手机。 4.5 Android环境调整
手机在刷机完成并重新启动后,新的init.rc文件将开始被系统使用。接下来的工作是在系统中建立挂载EXT分区用的目录、迁移相关目录以及建立链接文件。本步骤进行前,需先通过mount命令对/system目录进行读写重挂载,否则将不能在/system建立挂载所用的目录,但因各手机机型的不同对/system的挂载点也不同,故此处不作说明。对/system的可写挂载也可利用手机上的某些软件(如RootExplorer)来实现,但无论哪种方法都须先对新装入的Android系统进行“root”(获取root权限)操作。
(1)【L】mkdir/system/ext;创建挂载EXT分区用的目录;(2)【L】chmod775/system/ext;设置目录的访问权限;(3)【L】chownroot/system/ext;设置目录的属主;(4)【L】chgrproot/system/ext;设置目录的属组;(5)【L】mount-r-w-text2/dev/block/mmcblk0p2/system/ext;手工挂载ext2分区到/system/ext上;(6)【L】busyboxcp-a/data/xxx/system/ext/;将被迁移目录拷贝到ext2分区;(7)【L】busyboxrm-rf/data/xxx;删除/data下的被迁移目录(8)【L】busyboxln-s/system/ext/xxx/data/xxx;建立/data下各被迁移的目录相应的软链接并指向/system/ext下对应的目录。
说明:因为最终要将/data中的内容迁移到/system/ext目录中,所以第(2)、(3)、(4)步对ext目录的属性设置都以/data为参照;第(5)步对设备的手工挂载是因为/system/ext是在新rom刷入手机后被建立的,所以新rom中init.rc的自动挂载还不能起作用;第(6)、(7)、(8)步命令中的xxx指代/data目录下app、app-private、dalvik-cache、data等需要被迁移的目录。
5 结论
本文主要以三星i559手机为例,描述了实现App2SD的具体实现过程。但文章所讲述的内容并不可能完全适用于各种型号与系统版本的手机,应用者需根据自己的硬件与软件条件进行调整与优化。同时本文所提出的实现方法还有待改进与完善,比如当系统在运行时如果外存卡有拔插操作(如人为取出并通过读卡器与电脑进行数据交换),而在被Android再识别时外存卡其对应的设备文件可能会发生变化(从mmcblk0变成mmcblk1),从而导致原来挂载于mmcblk0p2上的EXT分区不再可用最终造成系统的不正常运行,所以作为稳定可靠的方法还应加入监测功能,根据外存卡的实际状态动态获取相应的设备文件并自动进行“再”挂载操作。
参考文献:
[1]android系统启动流程分析.http://blog.csdn.net/sincethen/article/details/5942472.
[2]Android启动流程代码分析.http://wenku.baidu.com/view/571d010716fc700abb68fc28.html.
[3]android系统app2sd(修改boot.img).http://www.cnblogs.com/mahang/archive/2011/09/04/2166066.html.
作者单位:中国人民解放军装甲兵工程学院训练部信息管理中心,北京 100072