簡介
本文適用於刷 Ginger Yoshi ROM 時,啟用了 APP2SD 功能,也就是規劃了 ext partition,並指定將使用者應用程式安裝到 ext partition 的使用者。 本文介紹如何將 davlik-cache、app-private 搬回到 ROM,以充分利用手機的 ROM 空間,提升手機效能。
警告:root 手機或自行修改手機具有一定的風險,如失去保固、損壞手機等。請讀者自行斟酌、謹慎處理。
步驟
- 使用 Root Browser Lite 這類支援 root 的檔案管理程式,進入 /data 目錄。
- 打算搬回到 ROM 的目錄,分別為它們建立一個空檔案,如 .noapp2sd、.noprivate2sd、.nodavlik2sd。
- 刪除打算搬回到 ROM 的目錄的 symbolic link 檔案,如 app、app-private、davlik-cache。
- 進入 /sd-ext 目錄,把對應的 app、app-private、davlik-cache 目錄,搬移到 /data 目錄。
- 重新開機。
Why
已經 root 的 Android 手機,最大的好處,就是使用者可以取得最大的控制權。其中一個好處,就是可以使用 Titanium Backup 這類軟體來備份應用程式及資料,重刷 ROM 之後,可以很快還原安裝的應用程式及資料。
如果使用 Titanium Backup,一定會注意到它的主畫面下方,顯示的系統資訊:
系統 ROM: | 94.3 MB | (1.02 MB 可用) |
---|---|---|
內部記憶體: | 310 MB | (298 MB 可用) |
SD 卡: | 1.46 GB | (321 MB 可用) |
SD 卡 (a2sd): | 479MB | (14 MB 可用) |
- 系統 ROM
- 系統應用程式的容身之處。Magic 總共只有 94.3 MB 可用,夠可憐的!
- 內部記憶體
- 使用者應用程式及資料、系統 Davlik-cache 的容身之處。Magic 總共只有 310 MB 可用。所以我們才需要開啟 APP2SD 功能,把程式裝到 SD 卡上!
- SD 卡
- FAT32 磁碟區,掛載到 PC 時看到的部分。Titanium Backup 會把備份檔案放到這邊。
- SD 卡 (a2sd)
- 刷 Ginger Yoshi 之前規劃的 ext partition,開啟 APP2SD 功能後,安裝的應用程式,系統 Davlik-cache 都會放在這邊。
注意到內部記憶體的部分,雖然只有 310 MB,但是可用竟然高達 298MB!而 a2sd 部分,竟然只剩下 14 MB!
這是因為 APP2SD 的設定的關係,Ginger Yoshi 的做法,是把下列三個目錄,利用 symbolic link ,從 ROM 搬到 SD 卡:
原始位置 | 對應到 | 說明 |
---|---|---|
/data/app | /sd-ext/app | 這是一般使用者應用程式的容身之處。 |
/data/app-private | /sd-ext/app-private | 這是存放受保護的應用程式,沒有 root 的手機,這些程式是無法備份的。 |
/data/davlik-cache | /sd-ext/davlik-cache | 這是存放系統及使用者應用程式執行碼(.dex)快取的地方。 |
理論上當然可以利用相同的方式,把大部分的目錄都搬到 SD 卡,譬如 /data/data,這是存放應用程式資料庫的地方,每個應用程式都有專屬的子目錄。不過應該是考量到效能的關係,應用程式執行過程中,可能不斷存取資料庫,若放在 SD 卡上,多少會影響效能。所以 Ginger Yoshi 選擇不把 data 搬到 SD 卡上。
但是我比較不能認同的是,Ginger Yoshi 把應用程式及快取全部都放到 SD 卡上,卻放著白花花的 ROM 不用,只用來存放少少的 data,這樣真的很浪費。另外,由於經常嘗試各種應用程式,我的手機大約安裝了 170 個使用者應用程式,當初規劃的 512 MB 的 ext partition,扣除 60 MB 的 swapfile.swp,一下子就用完了。所以我決定要把快取和部分程式搬回 ROM。
詳細說明
使用 Root Browser Lite,刪除 /data/davlik-cache 這個 link 檔案,再把 davlik-cache 目錄,由 /sd-ext/davlik-cache 搬到 /data/davlik-cache。(不需要修改權限,我後來發現 /system/bin/fix_permissions 這個 script 會在開機時自動修正。)重新啟動手機,經過非常久的的時間,才開機完成,心裡就知道不妙了。果然,進入 /data 一看,davlik-cache 又變回成 link 了,到 /sd-ext/data 目錄,davlik-cache 目錄又回來了。
我知道這一定是 script 的安全措施在作怪。解開 ginger yoshi 1.5.zip,搜尋 davlik-cache 關鍵字,找到 /system/etc/init.d/10apps2sd,打開來看,其中一段內容如下:
# loop directories to be moved to SD:
for ii in dalvik app private;
do
dir=$ii
if [ "$ii" == "dalvik" ];
then
dir=dalvik-cache
elif [ "$ii" == "private" ];
then
dir=app-private
fi
src=/data/$dir
trg=$SD_EXT_DIRECTORY/$dir
# /data/.noapp2sd (or /data/.nodalvik2sd) disable the appropraite part:
if [ $enable -eq 0 -o -e /data/.no${ii}2sd ];
then
# (略)
else
# (略)
fi
done
果然,是這個 script 在作怪。
還好作者留了後路,讓使用者可以輕輕鬆鬆調整設定,而且不需要手動修改 script。從上面程式碼可以看出,只要在 /data 目錄下,存在有 .no[XXX]2sd 檔案,就不會把該目錄搬到 SD 卡,這裡的 [XXX] 可以是 app、private、dalvik 三個字串。所以只要建立 /data/.nodalvik2sd,空檔案即可,再重複上面手動搬移的動作,就可以順利把 davlik-cache 搬回到 ROM 了。
接下來要搬的是 app-private 目錄,因為作者設定保護的程式不多,所以很適合把它們搬回到 ROM。只要建立 /data/.noprivate2sd 檔案,刪除 /data/app-private 這個 link 檔案,再手動把 /sd-ext/app-private 目錄搬到 /data 下,就搞定了。
結論
經過上述兩個步驟,內部記憶體還剩餘 109 MB,而 a2sd 則變成 174 MB,已經相當滿意了。而且使用上,因為 davlik-cache 放在 ROM 的關係,程式的啟動速度更快了。
失敗筆記
因為 ROM 的速度理論上要比 SD 卡快很多,所以若是能將常用的程式、widget,也放到 ROM,豈不是更好?所以腦筋又動到 /sd-ext/app 上,想手動把程式搬到 /data/app-private,放到 ROM 裡面。
不過,這次就沒那麼幸運了。因為放在 /data/app-private 的應用程式,除了原本的 .apk 檔案放在這裡,還會有一個 .zip 檔案放在 /sd-ext/app 目錄下,裡面放的是 res 目錄 .arsc 檔案以及 AndroidManifest.xml 檔案。看來這個 .zip 檔案放的都是應用程式的資源檔案,應該是讓沒有權限的程式讀取用的。雖然手動將 .apk 多餘的檔案抽掉,改成 .zip 檔案放在 app 目錄下,再把原本的 apk 檔案放到 app-private 目錄下,修正檔案權限,重新開機,雖然程式確實可以執行,但是 icon 無法正常顯示、應用程式名稱都變成 package 名稱,而且有的程式啟動時,畫面會有破碎現象,程式容易意外 FC 等,可以說問題重重。一時還沒辦法理出頭緒,先記錄下來。
歡迎大家的回饋與心得分享。
沒有留言:
張貼留言