在非 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(問) | A/B | 不適用 | 2 | 0, 1, 2 | 不 |
非A/B | 不適用 | 2 | 0, 1, 2 | 是的 | |
9(頁) | A/B | 不適用 | 1 | 0, 1 | 不 |
非A/B | 不適用 | 1 | 0, 1 | 是的 | |
8(奧) | A/B | 不適用 | 不適用(視為 0) | 不適用(視為 0) | 不 |
非A/B | 不適用 | 不適用(視為 0) | 不適用(視為 0) | 是的 |
*運行 Android 11 或更高版本並使用通用核心映像 (GKI) 的A/B 裝置必須使用主啟動頭版本 3才能與供應商啟動分割區相容。
關鍵點:
A/B 裝置不需要指定恢復映像,因為 A/B 更新使用兩組分割區(包括
boot
和dtbo
)並在更新期間在它們之間切換,因此無需恢復映像。如果需要,A/B 裝置仍然可以使用專用的恢復映像。使用 Android 11 或更高版本啟動並使用啟動標頭版本 3 的非 A/B 裝置必須單獨為復原映像明確指定啟動標頭版本 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)。
啟動映像更改
若要允許復原映像在執行 Android 9 或更高版本的非 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
執行 9 或更高版本的非 A/B 裝置可以填入復原映像的recovery_dtbo
部分。若要將recovery_dtbo
映像包含在recovery.img
中,請在裝置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_acpio
映像包含在recovery.img
中,請在裝置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。