在非 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 的 A/B 裝置 11 以上版本並使用一般核心映像檔 (GKI) 必須使用 主要開機標頭版本的 3 可與廠商開機 分區。
重點:
A/B 裝置不需要指定復原映像檔,因為 A/B 更新會使用兩組更新 部分分區 (包括
boot
和dtbo
) 並在維護期間切換 移除需要還原映像檔的需求A/B 裝置 仍會使用專屬的復原映像檔搭載 Android 11 以上版本的非 A/B 裝置 並使用 3 的開機標頭版本明確指定 boot 標頭 版本 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 搭載 Android 9 以上版本的裝置,請更新開機程序 映像檔結構
「開機映像檔」區段 | 頁數 |
---|---|
開機標頭 (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 = (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 建構系統
包含由 BOARD_PREBUILT_DTBOIMAGE
變數指定的 DTBO。
recovery.img
。
導入 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 建構系統
包含由 BOARD_RECOVERY_ACPIO
變數指定的 ACPIO
recovery.img
。