[經驗談]為可憐的16GB G Pro2 (D838)擠出額外的1GB內部儲存空間

前言
先說明這篇不是教學文. 坦白說, 為了增加 1GB 空間要搞這麼複雜, 真的有點無聊, 純粹是為了研究而已. 但如果你覺得內部儲存空間比外加記憶卡方便些, 又有工程技術底及實驗精神, 可以繼續看下去. 此外, 這作法並不限 D838, LG 其他機種甚至其他廠牌, 都有機會試試.

背景
以前就注意到 D838 浪費了不少空間在 system partition 內, 該 partition 固定為 3.25 GB, 但 LG Kitkat 10f 韌體的 system 內容物只有約 2.1GB, 這回推出 Lollipop 20c 韌體, 經分析其 system 內容竟又再縮減了 400MB, 也就是說 system partition 浪費了約 1.4 ~ 1.5 GB. 這兩天有空升級 20c 時, 發現一些不穩定現象, 覺得既然要備份資料並重置手機, 乾脆 repartition 以便將 system partition 挪出 1GB 給 data partition, 這樣手機裡的 internal sdcard 自然就多了 1GB 可用了.

過程
首先, 我以保留 CWM recovery 的方式升級到 Lollipop 20c 韌體, 接著備份好自己 internal sdcard 的資料, 並將 internal sdcard 清出至少 3GB 以上空間, 供後面操作的暫存用途. 然後進入 CWM recovery, 在 PC 上以 adb shell 連上手機, 於 shell 中執行以下命令檢視 partition 狀況:

parted /dev/block/mmcblk0 此命令係針對 mmcblk0 進入 parted 執行後續操作
unit s 此命令係在 parted 中選定顯示的大小以 sector (512 bytes) 為單位
print all 此命令係在 parted 中列出目前所有的 partitions 狀況.
quit 此命令離開 parted, 回到 shell

可以看到如下圖的資料, 其中每筆資料分別是 partition 編號, 起始 sector, 結束 sector, 以 sector 為單位的 partition 大小, partition 類型, 最後是 partition 名稱.

[經驗談]為可憐的16GB G Pro2 (D838)擠出額外的1GB內部儲存空間


以我的 D838 來看, 我有興趣的是編號 34 到 39 的 partition, 目標是將 34 system 縮減 1GB ( 也就是 2097152s ), 將 35 到 38 往前移位, 然後把 39 userdata (對應為系統的 /data) 往前移位並加大 1GB.

接著必須先備份編號 34 和 36 ~ 38 等 partition 內容 (35 cache 不需備份, 反正系統是要重置的). 其中 34 system 最方便的備份方法是在手機端以 CWM 裡面的 custom backup 選擇僅備份 system 即可. 至於 36 到 38 的備份, 必須先在手機 CWM 上確認 data 已 mount, 然後在 PC adb shell 上執行 dd 命令以備份在 /data 上的任何位置, 命令如我的下圖所示 (注意: dd 命令有 if= 和 of= 兩參數, 畫面上有些可能被拆成兩行, 但實際上是一個命令寫過去, 不換行).

[經驗談]為可憐的16GB G Pro2 (D838)擠出額外的1GB內部儲存空間


再來開始最危險的 repartition 動作, 由於剛才的備份動作都是將資料備份在 /data 也就是 userdata partition 中, 所以必須將 repartition 分兩次進行, 首先 repartition 編號 34 到 38, 重新 reboot recovery, 還原或格式化 34 到 38, 再針對 userdata 作 repartition 並 reboot recovery 及格式化.

這裡先說明一下 repartition 所需要的命令, 這些命令是在 parted 中進行, 進入 parted 要指定裝置, 所以命令與前面相同, 並且每次都先執行變更單位的 unit 命令:

parted /dev/block/mmcblk0
unit s

以編號 34 system 為例, 執行以下命令

rm 34 此命令刪除編號 34 的 partition
mkpartfs 此命令以交談式的方式建立一個 partition, 會詢問名稱, 種類 (回答 ext2 沒關係), 起始以及結束位置
name 34 system 此命令是將該 partition 命名

我使用的 CWM 內附的 parted 有瑕疵, mkpartfs 不接受正常參數在命令列, 只好以交談式回答之, 且輸入名稱無用, 故後面必須再下 name 命名, 此外種類不接受 ext4, 只能先輸入 ext2, 再於 CWM 上格式化自然就變成 ext4. 另外對於以 dd 方式備份的 36 到 38, 可以使用 mkpart 取代 mkpartfs, 但我使用的 parted 仍然會詢問 ext2 的問題, 不過並未作用.

大致上的 repartition 及還原過程是:
1. 先將 34 到 38 依序 repartition, 其中 34 system 的起點 start 不動, 終點則減 2097152s, 其他 35 到 38 則起點和終點都減去 2097152s.
2. reboot recovery 以便重新載入 partition 資訊.
3. 在 CWM 端格式化 system 和 cache, 並以 custom restore 選單來回復先前備份的 system nandroid backup.
4. 確認 /data 為 mounted 狀態, 然後在 PC 以 adb shell 下 dd 命令還原 36 到 38 的資料. 以 cust partition 為例, 命令是 "dd if=cust of=/dev/block/platform/msm_sdcc.1/by-name/cust"
5. Repartition 39 userdata partition, 其中起點減 2097152s, 終點則不動.
6. reboot recovery 以便重新載入 partition 資訊.
7. 在 CWM 端格式化 /data.
8. 到此也等同於重置過手機, 重開機開始恢復正軌.

可以收工開始享受多了很微小 1GB 容量的手機了, 以我的 D838 16 GB 為例, 內部儲存空間由 9.8 GB 變成 10.8 GB.

[經驗談]為可憐的16GB G Pro2 (D838)擠出額外的1GB內部儲存空間


後記
1. 這樣處理完, 還能不能重燒 KDZ 或 TOT 回復? 我 "猜測" "有可能" 可以, 每個 KDZ 和 TOT 都內附 partition table, 如果整個燒錄 KDZ 或 TOT 的動作是連 partition table 一起重燒就 OK.
2. 現在 system partition 只剩下 2.2 GB 左右, 以後會不會不夠? 有可能不夠, 但似乎機會不大, 目前的 KK 10f 或 Lollipop 20c 都夠, 尤其 20c 還有 500MB 以上空間, 未來的 5.x 升級, 要塞爆似乎機會不大.
3. 未來升級怎麼辦, 官方 KDZ 取出的 system.img 都是 3.x GB ?! 答案是... 找一台 Linux 系統, 把 system.img 利用 resize2fs 縮小 1GB 即可.

新增
4. 若還想要額外的 data 空間, 有沒有機會? 可以參考我在 #4 樓的想法, 由 cache partition 下手.
2015-02-28 21:30 發佈
真的是高手
我就沒信心去動分割表...
畢竟有SD卡可擴充就太不在意了

System本身會再縮減400MB
沒搞錯的話大半原因是先前Art/Dalvik共存可切換
同時有.odex但APK內也保有.dex
現在Lollipop只有ART就消滅了.odex所致吧?
看不懂,但是可以感覺好厲害的樣子。


nick2009 wrote:
沒搞錯的話大半原因是先前Art/Dalvik共存可切換...(恕刪)


沒錯, 能縮減 400MB, 和 Lollipop 只保留 ART 有絕對的關係.

以前使用 KK 的經驗, 由 Dalvik 切換為 ART 後, 視 system 和 user 應用程式數量而定, 產生的中介資料會在 /data 空間多佔用數百 MB 以上空間. 所以這次由 system 擠出 1GB, 正好可以補此需求.

另外, 若想再擠出額外空間, 可以關注一下 /cache partition, LG 為 cache 保留了 8百多 MB, 但這個空間總是空空如也, 最多只有幾十 MB 資料, 原因是該空間並非 user app cache, 似乎只用在 OTA 升級的暫存空間, 以及 recovery 使用. 手機若像我整到這個樣子, 已經不考慮 OTA 升級了, 應該可以擠出 6 到 7 百 MB 給 /data 使用!
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?