1. app2sd是什么
app2sd就是把應(yīng)用程序放在SD卡上。有些android手機(jī)的用戶數(shù)據(jù)分區(qū)(userdata)比較小(比如G1只有76M),dalvik和cache和用戶數(shù)據(jù)就占了大半,使得安裝了幾個軟件后就沒有空間了。為了安裝更多軟件,在SD卡上劃出部分空間用于存在新軟件和數(shù)據(jù),使我們的手機(jī)可以使用更多軟件。
2. 原理
一般情況下都SD卡都默認(rèn)分成一個windows可識別的分區(qū)(FAT)。因?yàn)橛?/span>linux系統(tǒng)的權(quán)限問題,為了讓它可以存放軟件,需要把SD卡的一部分劃分成Linux的使用的ext2文件系統(tǒng),然后在開機(jī)時(shí)把此分區(qū)掛載到某處,并通過鏈接的方法,讓系統(tǒng)從SD卡中讀取軟件
3. 實(shí)現(xiàn)
1) SD卡分區(qū)
a) 使用Linux系統(tǒng)中的工具fdisk,它是命令行工具,很快很簡單
b) Windows下的圖形化工具
具體步驟見http://www.3haoweb.cn/a/digital/mobile/2010/0609/2273.html
2) 修改boot.img使得新分區(qū)在啟動時(shí)被自動掛載
a) 說明:
i. 也可以從網(wǎng)上下載帶app2sd功能的update.zip包,升級整個系統(tǒng),但是那樣的話還要備份設(shè)置、數(shù)據(jù)、軟件太麻煩,所以我選擇修改我手機(jī)中自帶的boot.img,以最小的修改來實(shí)現(xiàn)功能
ii. 修改boot.img中的initrc(系統(tǒng)啟動時(shí)運(yùn)行的腳本,自動掛載SD卡的ext2分區(qū))
b) boot.img是什么
boot.img包括了2K的文件頭,后面緊跟著是用gzip壓縮過的內(nèi)核,再后面是一個ramdisk內(nèi)存盤(系統(tǒng)基本目錄結(jié)構(gòu)的鏡像檔),然后緊跟著第二階段的載入器程序(這個載入器程序是可選的,在某些映像中或許沒有這部分)
c) 修改本機(jī)的boot.img包
i. 使用nandroid備份數(shù)據(jù)
任何對系統(tǒng)的修改都要先備份系統(tǒng)數(shù)據(jù)
ii. 從機(jī)器中取出當(dāng)前的boot.img
$ export PATH=$PATH:$ANDROID_DIR/out/host/linux-x86/bin/
$ adb shell
# cat /proc/mtd/ 查看boot對應(yīng)的mtdx,一般是mtd2
# cat /dev/mtd/mtd2 > /sdcard/boot.img 假設(shè)boot對應(yīng)mtd2
# mkdir /system/sd1 建立目錄以掛載分區(qū)
# exit
$ adb pull /sdcard/boot.img ./ 復(fù)制到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 解包,解出內(nèi)核和ramdisk包兩部分
$ mkdir ramdisk; cd ramdisk
$ gzip -dc ../boot.img-ramdisk.gz |cpio -i
iv. 修改啟動腳本
$ vi init.rc 如果是亂碼,請使用reset命令恢復(fù)一下
在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. 燒寫新包到手機(jī)
$ adb push boot_new.img /sdcard
$ adb shell
# cat /dev/zero > /dev/mtd/mtd2 (可能找錯沒空間,沒關(guān)系)
# flash_image boot /sdcard/boot_new.im
vii. 驗(yàn)證是否成功
然后重啟手機(jī)即可,重啟后用以下命令看一下是否分區(qū)是否被掛載
$ adb shell
$ df 如果看到/system/sd1項(xiàng)就成功了
3) 做鏈接,使系統(tǒng)從SD卡讀取軟件
建立只對軟件安裝目錄做修改(/data/app),這樣撥出SD后除了后來安裝的軟件不能使用之外,不影響手機(jī)基本功能的使用
$ 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
……
其它目錄以此類推
然后重啟手機(jī)即可
4) 注意
由于launcher數(shù)據(jù)庫的關(guān)系,可能桌面上看不到原來的那些應(yīng)用了,不過主菜單里是有的,再建一遍快捷方式即可