posts - 33, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

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

          Posted on 2011-09-04 11:15 馬航 閱讀(1028) 評論(0)  編輯  收藏

          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/


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 黄大仙区| 墨竹工卡县| 高青县| 广灵县| 盐津县| 常德市| 车险| 苍溪县| 泊头市| 重庆市| 慈溪市| 宣恩县| 商丘市| 布拖县| 威信县| 沙田区| 那坡县| 梁河县| 高雄县| 隆子县| 宕昌县| 南涧| 佛教| 德江县| 盐边县| 卢氏县| 武川县| 沙湾县| 普安县| 辰溪县| 林口县| 富宁县| 招远市| 周至县| 巩义市| 六枝特区| 宁国市| 昭通市| 海淀区| 汤原县| 保山市|