android系统支持app2sd(修改boot.img)

1.          app2sd是什么
app2sd
就是把应用程序放在SD卡上。有些android手机的用户数据分区(userdata)比较小(比如G1只有76M),dalvikcache和用户数据就占了大半,使得安装了几个软件后就没有空间了。为了安装更多软件,在SD卡上划出部分空间用于存在新软件和数据,使我们的手机可以使用更多软件。

2.          原理
一般情况下都SD卡都默认分成一个windows可识别的分区(FAT)。因为有linux系统的权限问题,为了让它可以存放软件,需要把SD卡的一部分划分成Linux的使用的ext2文件系统,然后在开机时把此分区挂载到某处,并通过链接的方法,让系统从SD卡中读取软件

3.          实现

1)         SD卡分区

a)          使用Linux系统中的工具fdisk,它是命令行工具,很快很简单

b)         Windows下的图形化工具
具体步骤见http://www.3haoweb.cn/a/digital/mobile/2010/0609/2273.html

2)         修改boot.img使得新分区在启动时被自动挂载

a)          说明:

                                       i.              也可以从网上下载带app2sd功能的update.zip包,升级整个系统,但是那样的话还要备份设置、数据、软件太麻烦,所以我选择修改我手机中自带的boot.img,以最小的修改来实现功能

                                      ii.              修改boot.img中的initrc(系统启动时运行的脚本,自动挂载SD卡的ext2分区)

b)         boot.img是什么
boot.img
包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘(系统基本目录结构的镜像档),然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)

c)          修改本机的boot.img

                                       i.              使用nandroid备份数据
任何对系统的修改都要先备份系统数据

                                      ii.              从机器中取出当前的boot.img
$ export PATH=$PATH:$ANDROID_DIR/out/host/linux-x86/bin/
$ adb shell
# cat /proc/mtd/
查看boot对应的mtdx,一般是mtd2
# cat /dev/mtd/mtd2 > /sdcard/boot.img
假设boot对应mtd2
# mkdir /system/sd1
建立目录以挂载分区
# exit
$ adb pull /sdcard/boot.img ./                 
复制到PC

                                    iii.              解包
下载工具split_boot.img.pl
http://cid-f8aecd2a067a6b17.office.live.com/self.aspx/.Public/android/reference/split^_bootimg.zip
$ ./split_boot.img.pl boot.img                  
解包,解出内核和ramdisk包两部分
$ mkdir ramdisk; cd ramdisk
$ gzip -dc ../boot.img-ramdisk.gz |cpio -i

                                    iv.              修改启动脚本
$ vi init.rc 
如果是乱码,请使用reset命令恢复一下
mount 最后加入
mount ext2 /dev/block/mmcblk0p2 /system/sd1 rw

                                      v.              重新打包
$ cd ../
$ mkbootfs ramdisk |gzip > ramdisk-new.gz
$ mkbooting --cmdline ‘no_console_suspend=1 console=null’ --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot_new.img
(mkbootfs
mkbootimg可以android源码包中取得,和adb在一个目录)

                                    vi.              烧写新包到手机
$ adb push boot_new.img /sdcard
$ adb shell
# cat /dev/zero > /dev/mtd/mtd2 (
可能找错没空间,没关系)
# flash_image boot /sdcard/boot_new.im

                                   vii.              验证是否成功
然后重启手机即可,重启后用以下命令看一下是否分区是否被挂载
$ adb shell
$ df 
如果看到/system/sd1项就成功了

3)         做链接,使系统从SD卡读取软件
建立只对软件安装目录做修改(/data/app),这样拨出SD后除了后来安装的软件不能使用之外,不影响手机基本功能的使用
$ adb shell
# mkdir /system/sd1/data/
# cd /system/sd1/data/

# busybox cp -a /data/app ./  
建议做
# busybox cp -a /data/app-private ./        
不建议做
# busybox cp -a /data/dalvik-cache ./
不建议做
# busybox cp -a /data/data ./ 
不建议做
# rm -r /data/app
# ln -s /system/sd1/data/app /data/app

……
其它目录以此类推
然后重启手机即可

4)         注意
由于launcher数据库的关系,可能桌面上看不到原来的那些应用了,不过主菜单里是有的,再建一遍快捷方式即可

4.          参考
http://kb.cnblogs.com/a/1743704/

posted @ 2011-09-04 11:15  mac的学习笔记  阅读(2415)  评论(0编辑  收藏  举报