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

#移动开发 #Android

1. app2sd 是什么
app2sd 就是把应用程序放在 SD 卡上。有些 android 手机的用户数据分区 (userdata) 比较小(比如 G1 只有

76M),dalvik 和 cache 和用户数据就占了大半,使得安装了几个软件后就没有空间了。为了安装更多软件,在 SD

卡上划出部分空间用于存在新软件和数据,使我们的手机可以使用更多软件。

2. 原理
一般情况下都 SD 卡都默认分成一个 windows 可识别的分区(FAT)。因为有 linux

系统的权限问题,为了让它可以存放软件,需要把 SD 卡的一部分划分成 Linux 的使用的 ext2

文件系统,然后在开机时把此分区挂载到某处,并通过链接的方法,让系统从 SD 卡中读取软件

3. 实现

  1. SD 卡分区
  1. 使用 Linux 系统中的工具 fdisk,它是命令行工具,很快很简单

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

](http://www.3haoweb.cn/a/digital/mobile/2010/0609/2273.html)

  1. 修改 boot.img 使得新分区在启动时被自动挂载
  1. 说明:
  1. 也可以从网上下载带 app2sd 功能的 update.zip

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

  1. 修改 boot.img 中的 initrc(系统启动时运行的脚本,自动挂载 SD 卡的 ext2 分区)
  1. boot.img 是什么
    boot.img 包括了 2K 的文件头,后面紧跟着是用 gzip 压缩过的内核,再后面是一个 ramdisk

内存盘(系统基本目录结构的镜像档),然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)

  1. 修改本机的 boot.img 包
  1. 使用 nandroid 备份数据
    任何对系统的修改都要先备份系统数据

  2. 从机器中取出当前的 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 _ _ 中 _

  1. 解包
    下载工具 split_boot.img.pl
    [

http://cid-f8aecd2a067a6b17.office.live.com/self.aspx/.Public/android/reference/split^_bootimg.zip

](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 _

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

  2. 重新打包
    _ $ 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 _

_ 在一个目录 _ )

  1. 烧写新包到手机
    _ $ adb push boot_new.img /sdcard
    $ adb shell

cat /dev/zero > /dev/mtd/mtd2 (_ _ 可能找错没空间,没关系 _ _)

flash_image boot /sdcard/boot_new.im _

  1. 验证是否成功
    然后重启手机即可,重启后用以下命令看一下是否分区是否被挂载
    _ $ adb shell
    $ df _ _ 如果看到 _ _ /system/sd1 _ _ 项就成功了 _
  1. 做链接,使系统从 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 _

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

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

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

(转载请注明作者及出处 http://xy0811.spaces.live.com/

)