• 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/

  • 相关阅读:
    Git删除本地和远程文件
    MongoDB的安装和环境配置
    Cookie和Session的区别
    如何往npm上上传自定义的模块?
    JS的一些兼容性问题
    【网络流24题】 5. 圆桌问题 题解
    【网络流24题】 6. 最长不下降子序列问题 题解
    【网络流24题】 4. 魔术球问题 题解
    【网络流24题】 3. 最小路径覆盖问题 题解
    【网络流24题】 2. 太空飞行计划问题 题解
  • 原文地址:https://www.cnblogs.com/mahang/p/2166066.html
Copyright © 2020-2023  润新知