android系统支持app2sd(修改boot
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. 实现
- SD 卡分区
使用 Linux 系统中的工具 fdisk,它是命令行工具,很快很简单
Windows 下的图形化工具
具体步骤见 [http://www.3haoweb.cn/a/digital/mobile/2010/0609/2273.html
](http://www.3haoweb.cn/a/digital/mobile/2010/0609/2273.html)
- 修改 boot.img 使得新分区在启动时被自动挂载
- 说明:
- 也可以从网上下载带 app2sd 功能的 update.zip
包,升级整个系统,但是那样的话还要备份设置、数据、软件太麻烦,所以我选择修改我手机中自带的 boot.img,以最小的修改来实现功能
- 修改 boot.img 中的 initrc(系统启动时运行的脚本,自动挂载 SD 卡的 ext2 分区)
- boot.img 是什么
boot.img 包括了 2K 的文件头,后面紧跟着是用 gzip 压缩过的内核,再后面是一个 ramdisk
内存盘(系统基本目录结构的镜像档),然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)
- 修改本机的 boot.img 包
使用 nandroid 备份数据
任何对系统的修改都要先备份系统数据从机器中取出当前的 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 _ _ 中 _
- 解包
下载工具 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 _
修改启动脚本 _
$ vi init.rc _ _ 如果是乱码,请使用 _ _ reset _ _ 命令恢复一下 _ _
_ _ 在 _ _ mount _ _ 最后加入 _ _
mount ext2 /dev/block/mmcblk0p2 /system/sd1 rw _重新打包
_ $ 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 _
_ 在一个目录 _ )
- 烧写新包到手机
_ $ adb push boot_new.img /sdcard
$ adb shell
cat /dev/zero > /dev/mtd/mtd2 (_ _ 可能找错没空间,没关系 _ _)
flash_image boot /sdcard/boot_new.im _
- 验证是否成功
然后重启手机即可,重启后用以下命令看一下是否分区是否被挂载
_ $ adb shell
$ df _ _ 如果看到 _ _ /system/sd1 _ _ 项就成功了 _
- 做链接,使系统从 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 _
……
其它目录以此类推
然后重启手机即可
- 注意
由于 launcher 数据库的关系,可能桌面上看不到原来的那些应用了,不过主菜单里是有的,再建一遍快捷方式即可
4. 参考
http://kb.cnblogs.com/a/1743704/
(转载请注明作者及出处 http://xy0811.spaces.live.com/
)