在非 A/B 裝置上,復原映像檔應包含來自裝置樹狀結構 Blob (DTB) 或進階設定和電源介面 (ACPI) 疊加映像檔的資訊。這類裝置啟動進入復原模式時,系統啟動載入程式可以載入與復原映像檔相容的疊加層映像檔。支援 A/B (無縫) 更新的裝置應使用復原做為啟動程序,而非使用獨立的復原磁碟分割區 (詳情請參閱「實作 A/B 更新」)。
將復原 DTBO/ACPIO 納入啟動/復原映像檔的選項,會因 Android 版本而異。
發布 | 更新配置 | GKI 法規遵循 | 啟動標頭版本 (啟動裝置) | 啟動標頭版本 (升級裝置) | 必須使用專屬復原映像檔 |
---|---|---|---|---|---|
11 | A/B、 虛擬 A/B 測試 |
是 | 3* | 無 | 否 |
A/B、 虛擬 A/B 測試 |
否 | 2、3 | 0、1、2、3 | 否 | |
非 A/B | 是 | 3 | 無 | 是 | |
非 A/B | 否 | 2、3 | 0、1、2、3 | 是 | |
10 (Q) | A/B | 無 | 2 | 0、1、2 | 否 |
非 A/B | 無 | 2 | 0、1、2 | 是 | |
9 (P) | A/B | 無 | 1 | 0, 1 | 否 |
非 A/B | 無 | 1 | 0, 1 | 是 | |
8 (O) | A/B | 無 | 不適用 (視為 0) | 不適用 (視為 0) | 否 |
非 A/B | 無 | 不適用 (視為 0) | 不適用 (視為 0) | 是 |
* 搭載 Android 11 以上版本並使用通用核心映像檔 (GKI) 的 A/B 裝置,必須使用主要啟動標頭版本 3,才能與供應商啟動磁碟分割區相容。
重點:
A/B 裝置不需要指定復原映像檔,因為 A/B 更新會使用兩組磁碟分割區 (包括
boot
和dtbo
),並在更新期間切換,因此不需要復原映像檔。A/B 裝置仍可使用專屬的復原映像檔。如果非 A/B 裝置搭載 Android 11 以上版本,且使用啟動標頭版本 3,則必須為復原映像檔明確指定啟動標頭版本 2。例如:
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
對於不支援裝置樹狀結構的架構,復原映像檔可以包含 ACPIO 映像檔,而非 DTBO 映像檔。
關於 OTA 失敗和復原映像檔
為避免非 A/B 裝置發生無線更新 (OTA) 失敗情形,復原映像檔應能獨立運作,不依賴其他映像檔。在 OTA 更新期間,如果疊加映像檔更新後發生問題 (但完整更新尚未完成),裝置會嘗試啟動復原模式,完成 OTA 更新。不過,由於疊加分割區已更新,可能會與尚未更新的復原映像檔不符。
為避免更新期間的復原作業依賴 DTBO/ACPIO 分割區,執行 Android 9 以上版本的非 A/B 裝置可以指定復原 DTBO/ACPIO 映像檔,其中包含來自疊加層映像檔的資訊,做為啟動映像檔格式中的獨立區段 (必須使用啟動標頭版本 1 或 2)。
開機映像檔變更
如要讓非 A/B 裝置的復原映像檔包含復原 DTBO 或 ACPIO,請更新開機映像檔結構,方法如下。
開機映像檔部分 | 頁數 |
---|---|
開機標頭 (1 頁) | 1 |
核心 (l 頁) | l = (kernel_size + page_size -
1) / page_size |
Ramdisk (m 頁面) | m = (ramdisk_size + page_size -
1) / page_size |
第二階段啟動載入程式 (n 頁) | n = (second_size + page_size -
1) / page_size |
復原 DTBO 或 ACPIO (o 頁面) | o = (recovery_[dtbo|acpio]_size + page_size -
1) / page_size |
如要進一步瞭解 mkbootimg
工具引數,以便指定開機映像檔標頭版本和疊加映像檔路徑,請參閱「開機映像檔標頭版本管理」。
實作 DTBO
搭載 Android 9 以上版本的非 A/B 裝置,可以填入復原映像檔的 recovery_dtbo
區段。如要在 recovery.img
中加入 recovery_dtbo
圖片,請在裝置 BoardConfig.mk
中執行下列操作:
將設定
BOARD_INCLUDE_RECOVERY_DTBO
設為true
:BOARD_INCLUDE_RECOVERY_DTBO := true
擴充
BOARD_MKBOOTIMG_ARGS
變數,指定開機映像檔標頭版本:BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
確認
BOARD_PREBUILT_DTBOIMAGE
變數已設為 DTBO 映像檔的路徑。Android 建構系統會在建立復原映像檔時,使用這個變數設定mkbootimg
工具的recovery_dtbo
引數。
如果 BOARD_INCLUDE_RECOVERY_DTBO
、BOARD_MKBOOTIMG_ARGS
和 BOARD_PREBUILT_DTBOIMAGE
變數設定正確,Android 建構系統會在 recovery.img
中加入 BOARD_PREBUILT_DTBOIMAGE
變數指定的 DTBO。
導入 ACPIO
搭載 Android 9 以上版本的非 A/B 裝置可以使用 ACPIO 疊加映像檔 (而非 DTBO 映像檔),並填入復原映像檔的 recovery_acpio
區段 (而非 recovery_dtbo
區段)。如要在 recovery.img
中加入 recovery_acpio
圖片,請在裝置 BoardConfig.mk
中執行下列操作:
將設定
BOARD_INCLUDE_RECOVERY_ACPIO
設為true
:BOARD_INCLUDE_RECOVERY_ACPIO := true
擴充
BOARD_MKBOOTIMG_ARGS
變數,指定開機映像檔標頭版本。變數必須大於或等於 1,才能支援復原 ACPIO。BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
確認
BOARD_RECOVERY_ACPIO
變數已設為 ACPIO 映像檔的路徑。Android 建構系統會在建立復原映像檔時,使用這個變數設定mkbootimg
工具的recovery_acpio
引數。
如果 BOARD_INCLUDE_RECOVERY_ACPIO
、BOARD_MKBOOTIMG_ARGS
和 BOARD_RECOVERY_ACPIO
變數設定正確,Android 建構系統會在 recovery.img
中加入 BOARD_RECOVERY_ACPIO
變數指定的 ACPIO。