大部分的 Android 手機可以透過 dd 把 recovery partition dump 出來,比如 PadFone S 可以使用
dd if=/dev/block/platform/msm_sdcc.1/by-name/recovery of=/sdcard/recovery.img
取得 recovery.img。
但像 ZenFone 這種放在隱藏 partition 的該怎麼提取呢?其實可以透過 OTA package 或者原廠 ROM 的幾個檔案還原。
一般來說 recovery.img 不一定會完整包含在 OTA package,因為他的內容與 boot.img 相似,通常只差幾個小檔案,所以廠商大多透過 patch 的方式在升級後寫入新的 recovery。我們可以從 OTA package (或者 ROM) 裡面找到 boot.img、recovery/etc/install-recovery.sh 與 recovery/recovery-from-boot.p,這幾個便是主要產生 recovery 的檔案,透過對 boot.img 的 patch 可以讓 OTA package 省去不少空間。那我們要如何從這兩個檔案與 boot.img 還原 recovery.img 呢?Android 提供了一個工具叫 applypatch,參數如下:
applypatch
origin_image_name 就是準備拿來 patch 的基礎檔案 boot.img,target_image_name 自然是我們想要的 recovery.img,而 target_image_sha1 為 recovery 的 SHA1 值,target_image_size 為 recovery 的大小 (bytes),patch_image_name 即是 recovery-from-boot.p 這份修補檔,而 patch_sha1 就是修補檔的 SHA1 值。而這些數值其實都可以在 install-recovery.sh 裡面找到,以 ZenFone 5 1.17.40.16 WW 版為例:
#!/system/bin/sh
update_recovery --check-sha1 0d46024fcdba65dc82ca5fb568eccf36885de815 \
--src-sha1 d8d2bbfd8dd3eaa648073876a229ac030ebdc802 \
--tgt-sha1 7cf95a376c8d8b0f47a9bd9062851161fac657d2 \
--tgt-size 11332608 \
--patch /system/recovery-from-boot.p
其中 tgt-sha1 為 recovery.img 的 SHA1,tgt-size 為 recovery.img 的大小,而 src-sha1 為 recovery-from-boot.p 的 SHA1,因此我們可以得到產生 ZenFone 5 1.17.40.16 WW 版的 recovery 命令為:
applypatch boot.img recovery.img 7cf95a376c8d8b0f47a9bd9062851161fac657d2 11332608 d8d2bbfd8dd3eaa648073876a229ac030ebdc802:recovery-from-boot.p
所以如果我們把 boot.img,recovery-from-boot.p 放在同個目錄下,那麼我們可以把手機接上,輸入下面的指令取得 recovery.img:
adb push boot.img /data/local/tmp
adb push recovery-from-boot.p /data/local/tmp
adb shell 'cd /data/local/tmp; applypatch boot.img recovery.img 7cf95a376c8d8b0f47a9bd9062851161fac657d2 11332608 d8d2bbfd8dd3eaa648073876a229ac030ebdc802:recovery-from-boot.p'
adb pull /data/local/tmp/recovery.img
至於拿出 recovery.img 可以幹嘛?切換不同區域的 ROM 或者在某些緊急狀況下可以還原原廠的 ROM。