在 Android 12 中,一般的 boot
映像檔,稱為
通用核心映像檔 (GKI)、
包含一般 ramdisk 和 GKI 核心。
針對搭載 Android 13 的裝置,
ramdisk 會從 boot
映像檔中移除,並放置在另外的 init_boot
中
圖片。這項變更會保留 boot
圖片,只有
GKI 核心。
適用於升級仍使用 Android 12 的裝置
或更舊版本的核心版本
一般的 RAM 仍會保留在原處
不必使用新的 init_boot
映像檔。
如要建構一般 ramdisk,請將供應商專屬資源移出 ramdisk 中
讓一般 ramdisk 只包含第一階段 init
和屬性
該檔案含有時間戳記資訊。
使用以下裝置的裝置:
請勿使用專屬的
recovery
分區,那麼所有復原位元都會從 一般 ramdisk 到vendor_boot
ramdisk。請使用專屬的
recovery
分區,不要變更recovery
ramdiskrecovery
ramdisk 本身是獨立項目,因此必須使用。
建築
下圖說明搭載 Android 的裝置架構
12 以及更高版本。
搭載 Android 13 的裝置推出全新
init_boot
映像檔,包含一般 ramdisk。
從 Android 12 升級至 Android 的裝置
13 層採用的架構和
Android 12。
推出時搭載 Android 13,無專屬救援方式
圖 1. 搭載 Android 13 或升級至 Android 13 的裝置未具備專屬復原機制。
啟動後搭載 Android 13,專屬和 A/B 復原功能 (專屬 ramdisk)
圖 2. 推出或升級至 Android 13 的裝置,搭載 GKI 和專屬 A/B 復原功能。
請參考此圖表,瞭解裝置是否有 recovery_a
和 recovery_b
分區。
啟動時搭載 Android 13,專用和非 A/B 復原功能 (專屬 ramdisk)
圖 3. 推出或升級至 Android 13 的裝置,搭載 GKI 和非 A/B 復原功能。
如果裝置有名為 recovery
的分區,但沒有
字尾。
推出或升級至 Android 12,不需專用復原程序
圖 4. 搭載 Android 12 或升級至 Android 12 的裝置 (GKI 無專用復原機制)。
啟動或升級至 Android 12,專屬的 A/B 復原功能 (專屬 ramdisk)
圖 5. 搭載 Android 12 或升級至 Android 12 的裝置,搭載 GKI 和專屬 A/B 復原功能。
請參考此圖表,瞭解裝置是否有 recovery_a
和 recovery_b
分區。
啟動或升級至 Android 12,專屬的非 A/B 復原功能 (專屬 ramdisk)
圖 6. 推出或升級至 Android 12 的裝置,搭載 GKI 和非 A/B 復原功能。
如果裝置有名為 recovery
的分區,但沒有
字尾。
升級至 Android 12 (復原即啟動 (recovery-as-ramdisk)
圖 7. 升級至 Android 12、無 GKI、復原即啟動的裝置。
升級至 Android 12,專屬復原功能 (專屬 ramdisk)
圖 8. 升級至 Android 12 、無 GKI、專屬復原裝置。
開機映像檔內容
Android 開機映像檔包含下列內容。
為搭載 Android 13 的裝置新增
init_boot
圖片- 標頭版本 V4
- 一般 ramdisk 映像檔
通用
boot
圖片vendor_boot
映像檔 (詳情請參閱廠商啟動程序) 分區)vendor_boot
個標題- 裝置專屬
cmdline
(BOARD_KERNEL_CMDLINE
)
- 裝置專屬
vendor_boot
個 ramdisk 映像檔lib/modules
- 復原資源 (如果沒有專屬復原作業)
dtb
的圖片
recovery
的圖片- 標頭版本 V2
- 用於復原的裝置專屬
cmdline
(如有需要) - 如為非 A/B 復原分區,標頭內容必須 獨立的內容看 復原映像檔。 例如:
cmdline
未串連至boot
和vendor_boot
cmdline
。- 標頭會視需要指定復原 DTBO。
- 如果是 A/B 復原分區,可串連或推論內容
來自
boot
和vendor_boot
。例如: cmdline
會串連為boot
和vendor_boot
cmdline
。- DTBO 可從
vendor_boot
標頭推斷。
- 用於復原的裝置專屬
recovery
個 ramdisk 映像檔- 復原資源
- 針對非 A/B 復原分區,ramdisk 的內容必須是 獨立的內容看 復原映像檔。 例如:
lib/modules
必須包含啟動所需的所有核心模組 復原模式- 復原 ramdisk 必須包含
init
。 - 如果是 A/B 復原分區,復原 ramdisk 會在
泛型和
vendor_boot
ramdisk,因此可以 例如: lib/modules
可能只包含 啟動復原模式 (vendor_boot
ramdisk 中的核心模組除外)。/init
的符號連結可能存在,但受其保護 啟動映像檔的第一階段/init
二進位檔
- 標頭版本 V2
一般 ramdisk 映像檔內容
一般 ramdisk 包含以下元件。
init
system/etc/ramdisk/build.prop
ro.PRODUCT.bootimg.* build
個道具- 掛接點的目錄為空白:
debug_ramdisk/
、mnt/
、dev/
、sys/
、proc/
、metadata/
first_stage_ramdisk/
- 與掛接點的空白目錄重複:
debug_ramdisk/
、mnt/
、dev/
、sys/
、proc/
、metadata/
- 與掛接點的空白目錄重複:
開機映像檔整合
建構旗標可控管 init_boot
、boot
、recovery
和 vendor_boot
的方式
建構映像檔布林板變數的值必須是字串
true
或空白 (預設值)。
TARGET_NO_KERNEL
。這個變數指出建構作業是否使用預先建構的開機程序 圖片。如果此變數設為true
,請設定BOARD_PREBUILT_BOOTIMAGE
預先建構的開機映像檔位置 (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img
)。BOARD_USES_RECOVERY_AS_BOOT
。這個變數可指出裝置是否使用recovery
圖片做為boot
圖片。使用 GKI 時,這個變數是 空白和復原資源應移至vendor_boot
。BOARD_USES_GENERIC_KERNEL_IMAGE
。這個變數表示主機板採用 你好,這個變數不會影響 sysprops 或PRODUCT_PACKAGES
。這是董事會層級的 GKI 開關;以下所有的變數 受此變數限制
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
。這個變數可控制 ramdisk 復原資源是以vendor_boot
為基礎。設為
true
時,復原資源只會建構於vendor-ramdisk/
且不是以recovery/root/
為基礎。如果為空白,復原資源只會建構於
recovery/root/
,不會 建立於vendor-ramdisk/
。
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
。這個變數可控制 GSI AVB 金鑰建構於vendor_boot
。設為
true
時,如果BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
:已設定,GSI AVB 金鑰的建構基礎
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
。未設定,GSI AVB 金鑰的建構條件是
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
。
如果
BOARD_RECOVERY_AS_ROOT
為空白:已設定,GSI AVB 金鑰的建構基礎
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
。未設定,GSI AVB 金鑰的建構條件是
$ANDROID_PRODUCT_OUT/ramdisk/avb
。
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
。這個變數可控制recovery
映像檔包含或未包含核心。啟動 Android 的裝置 12 且使用 A/Brecovery
分區必須設定這個值 變更為true
。搭載 Android 12 的裝置 如果使用非 A/B 版本,必須將這個變數設為false
,以保留復原映像檔 獨立作業BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
。這個變數可控制 已將$OUT/boot*.img
複製到目標檔案的IMAGES/
中。aosp_arm64
必須將這個變數設為true
。其他裝置必須將這個變數留空。
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
。這個變數可控制 系統隨即會產生init_boot.img
並設定大小。設定後,一般 ramdisk 伺服器 會新增至init_boot.img
(而不是boot.img
),而且需要 要設定BOARD_AVB_INIT_BOOT*
個變數 鏈結 vbmeta。
允許的組合
元件或變數 | 升級沒有復原分區的裝置 | 升級含有復原分區的裝置 | 在沒有復原分區的情況下啟動裝置 | 啟動具備 A/B 復原分區的裝置 | 使用非 A/B 復原分區啟動裝置 | aosp_arm64 |
---|---|---|---|---|---|---|
含boot |
是 | 是 | 是 | 是 | 是 | 是 |
包含「init_boot 」(Android 13) |
不 | 不 | 是 | 是 | 是 | 是 |
含vendor_boot |
選用 | 選用 | 是 | 是 | 是 | 不 |
含recovery |
不 | 是 | 不 | 是 | 是 | 不 |
BOARD_USES_RECOVERY_AS_BOOT |
true |
未連接裝置 | 未連接裝置 | 未連接裝置 | 未連接裝置 | 未連接裝置 |
BOARD_USES_GENERIC_KERNEL_IMAGE |
未連接裝置 | 未連接裝置 | true |
true |
true |
true |
PRODUCT_BUILD_RECOVERY_IMAGE |
未連接裝置 | true 或空白 |
未連接裝置 | true 或空白 |
true 或空白 |
未連接裝置 |
BOARD_RECOVERYIMAGE_PARTITION_SIZE |
未連接裝置 | >0 分 | 未連接裝置 | >0 分 | >0 分 | 未連接裝置 |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT |
未連接裝置 | 未連接裝置 | true |
未連接裝置 | 未連接裝置 | 未連接裝置 |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT |
未連接裝置 | 未連接裝置 | true |
true |
true |
未連接裝置 |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE |
未連接裝置 | 未連接裝置 | 未連接裝置 | true |
未連接裝置 | 未連接裝置 |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES |
未連接裝置 | 未連接裝置 | 未連接裝置 | 未連接裝置 | 未連接裝置 | true |
具有專屬 recovery
分區的裝置可以設定
PRODUCT_BUILD_RECOVERY_IMAGE
到 true
或空白。對於這些裝置
已設定 BOARD_RECOVERYIMAGE_PARTITION_SIZE
,建構 recovery
映像檔。
為開機程序啟用鏈結 vbmeta
必須為 boot
和 init_boot
映像檔啟用鏈結 vbmeta。請說明
包括:
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
如需範例,請參閱 變更。
系統即根層級
「系統式根層級」不支援使用 GKI 的裝置。啟用
此類裝置,BOARD_BUILD_SYSTEM_ROOT_IMAGE
必須空白。系統即根層級
也不適用於使用動態分區的裝置
產品設定
使用一般 ramdisk 的裝置時,必須安裝
即可安裝至 ramdisk。方法是在容器中指定以下項目:
device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
generic_ramdisk.mk
檔案也會防止其他 make 檔案意外
正在將其他檔案安裝至 ramdisk (將這類檔案移至 vendor_ramdisk
)
)。
設定裝置
設定操作說明會因推出 Android 的裝置而異 13,升級至 Android 12,並以 Android 12 啟動。 Android 13 的設定與 Android 12 類似
升級至 Android 12 的裝置:
可以保留
BOARD_USES_RECOVERY_AS_BOOT
的值。如果有的話 他們使用的是舊版設定,且新的建構變數必須留空。如果有 裝置:可將
BOARD_USES_RECOVERY_AS_BOOT
設為空白。然後採用 新的設定如果這類裝置:
搭載 Android 12 的裝置必須設定
BOARD_USES_RECOVERY_AS_BOOT
設為空白並使用新設定。如果有 裝置:
因為 aosp_arm64
只會建構 GKI (而非 vendor_boot
或復原),
瀏覽體驗也不是完整的目標如要瞭解 aosp_arm64
建構設定,請參閱
generic_arm64
。
選項 1:沒有專用復原分區
沒有 recovery
分區的裝置會包含一般 boot
映像檔
boot
個分區。vendor_boot
ramdisk 包含所有復原資源,
包括 lib/modules
(含廠商核心模組)。在這些裝置上,
產品設定沿用:
generic_ramdisk.mk
。
設定 BOARD 值
設定下列值:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Init 二進位檔和符號連結
vendor_boot
ramdisk 包含 /init
到 /system/bin/init
的符號連結,
和init_second_stage.recovery
(/system/bin/init
)。不過,由於
一般 ramdisk 連結 vendor_boot
ramdisk,/init
符號連結。當裝置開機的修復程序時,
需要 /system/bin/init
二進位檔才能支援第二階段初始化。內容
vendor_boot
+ 一般 RAM 磁碟如下:
/init
(從init_first_stage
建立的一般 ramdisk)/system/bin/init
(透過vendor_ramdisk
,建構自init_second_stage.recovery
)
移動 fstab 檔案
將安裝到一般 ramdisk 的所有 fstab
檔案移至
vendor_ramdisk
。如需範例,請參閱
變更。
安裝模組
您可以將裝置專屬模組安裝至「vendor_ramdisk
」(略過)
。
當模組安裝目標時,請使用該模組的
vendor_ramdisk
變化版本/first_stage_ramdisk
。這個模組應於init
後使用 把根切換至/first_stage_ramdisk
,但在init
之前/system
。如需範例,請參閱「中繼資料檢查碼」和 虛擬 A/B 壓縮。當模組安裝至
/
時,請使用模組的recovery
變化版本。 這個模組應可在init
切換至 Root 權限之前使用/first_stage_ramdisk
。如要進一步瞭解如何將模組安裝至/
,請參閱第一 階段控制台
第一階段控制台
因為第一個階段控制台是在 init
將根層級切換至 之前啟動
/first_stage_ramdisk
,您需要安裝 recovery
的模組變化版本。
根據預設,兩個模組變化版本都會安裝至
build/make/target/product/base_vendor.mk
,因此如果裝置 makefile 沿用
不必明確安裝 recovery
變化版本。
如要明確安裝復原模組,請使用下列指令。
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
這能確保 linker
、sh
和 toybox
能夠安裝到
$ANDROID_PRODUCT_OUT/recovery/root/system/bin
,之後會安裝至
/system/bin
,vendor_ramdisk
。
如要新增第一個階段主控台所需的模組 (例如 ADB),請使用 追蹤。
PRODUCT_PACKAGES += adbd.recovery
這可確保將指定的模組安裝到
$ANDROID_PRODUCT_OUT/recovery/root/system/bin
,然後安裝到
/system/bin
(位於 vendor_ramdisk
下)。
中繼資料核對和
支援中繼資料
核對和
進行這項操作時,不支援 GKI 的裝置就會安裝 ramdisk
包含下列模組的變化版本。如要新增 GKI 支援功能,請將模組移至
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
如需範例,請參閱 變更清單
虛擬 A/B 壓縮
如要支援虛擬 A/B 壓縮功能,必須在以下位置安裝 snapuserd
:
vendor_ramdisk
。裝置應繼承自
virtual_ab_ota/compression.mk
、
這個指令會安裝 snapuserd
的 vendor_ramdisk
變化版本。
對啟動程序所做的變更
啟動還原程序或 Android 裝置的程序並未改變。 例外狀況:
- RAM
build.prop
會移至/second_stage_resources
,因此第二個階段init
可以讀取啟動的建構時間戳記。
由於資源會從一般 ramdisk 移至 vendor_boot
ramdisk,因此結果
將一般 ramdisk 串連至 vendor_boot
ramdisk 不受影響。
提供 e2fsck
裝置 Makefile 可沿用自:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
(如果裝置支援虛擬服務專員) A/B,但未壓縮。virtual_ab_ota/compression.mk
(如果裝置支援虛擬 A/B) 。
安裝產品 makefile
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
。在
執行階段,第一個階段 init
會將根層級切換為 /first_stage_ramdisk
,然後
執行 /system/bin/e2fsck
。
選項 2a:專屬和 A/B 復原分區
這個選項適用於含有 A/B recovery
分區的裝置;也就是
裝置有 recovery_a
和 recovery_b partition
。這類裝置包括
復原分區可更新的 A/B 和虛擬 A/B 裝置,
下列設定:
AB_OTA_PARTITIONS += recovery
vendor_boot
ramdisk 包含 ramdisk 和供應商的供應商位元
核心模組,包括:
裝置專屬的
fstab
檔案lib/modules
(包含供應商核心模組)
recovery
ramdisk 包含所有復原資源。在這些裝置上,
產品設定沿用:
generic_ramdisk.mk
。
設定 BOARD 值
針對使用 A/B recovery
分區的裝置設定下列值:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Init 二進位檔和符號連結
recovery
ramdisk 包含 /init -> /system/bin/init
符號連結,且
init_second_stage.recovery
/system/bin/init
。不過,因為啟動程序
ramdisk 連結了 recovery
ramdisk,/init
符號連結為
覆寫。裝置啟動進入復原模式時,系統會/system/bin/init
二進位檔才能支援第二階段 init
當裝置開機recovery
時,recovery
+
vendor_boot
+ 一般 RAM 磁碟如下:
/init
(從 ramdisk,透過init_first_stage
建構)/system/bin/init
(從recovery
ramdisk,建構自init_second_stage.recovery
,並以/init
執行)
裝置啟動 Android 時,vendor_boot
的內容 + 一般內容
ramdisks 如下:
/init
(從init_first_stage
建立的一般 ramdisk)
移動 fstab 檔案
將安裝到一般 ramdisk 的所有 fstab
檔案移至
vendor_ramdisk
。如需範例,請參閱
變更。
安裝模組
您也可以選擇將裝置專屬模組安裝至 vendor_ramdisk
(略過)
。Init
並未切換根目錄系統會將模組的 vendor_ramdisk
變化版本安裝至
vendor_ramdisk
的根。如需查看如何將模組安裝至
vendor_ramdisk
,請參閱第一階段控制台、中繼資料
總和檢查碼和虛擬 A/B
壓縮。
第一階段控制台
如要安裝模組的 vendor_ramdisk
變化版本,請使用下列指令:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
這能確保 linker
、sh
和 toybox
能夠安裝到
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
,之後會安裝至
/system/bin
,vendor_ramdisk
。
如要新增第一階段控制台 (例如 ADB) 所需的模組,請啟用
這些模組的 vendor_ramdisk
變體,方法是將相關修補程式上傳至
然後使用下列指令
PRODUCT_PACKAGES += adbd.vendor_ramdisk
這可確保將指定的模組安裝到
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
。如果 vendor_boot
ramdisk
會在復原模式中載入,而該模組也可在 recovery
中使用。如果
復原模式下未載入 vendor_boot
ramdisk,裝置可選擇是否載入
請同時安裝 adbd.recovery
。
中繼資料核對和
支援中繼資料
核對和
進行這項操作時,不支援 GKI 的裝置就會安裝 ramdisk
包含下列模組的變化版本。如要新增 GKI 支援功能,請將模組移至
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
如需範例,請參閱 變更清單
虛擬 A/B 壓縮
如要支援虛擬 A/B 壓縮功能,必須在以下位置安裝 snapuserd
:
vendor_ramdisk
。裝置應繼承自
virtual_ab_ota/compression.mk
、
這個指令會安裝 snapuserd
的 vendor_ramdisk
變化版本。
對啟動程序所做的變更
啟動 Android 裝置時,啟動程序不會變更。vendor_boot
+
一般 ramdisk 和現有的開機程序類似,只是 fstab
會從 vendor_boot
載入。由於 system/bin/recovery
不存在,
first_stage_init
將其視為一般啟動程序進行處理。
啟動進入復原模式時,啟動程序會變更。復原 +
vendor_boot
+ 一般 ramdisk 與現有的復原程序類似,但
核心是從 boot
映像檔載入,而不是從 recovery
映像檔載入。
復原模式的啟動程序如下所示。
系統啟動載入程式會啟動,並執行以下操作:
- 將復原 +
vendor_boot
+ 一般 ramdisk 推送至/
。(如果原始設備製造商 (OEM)) 將復原 ramdisk 中的重複核心模組新增至BOARD_RECOVERY_KERNEL_MODULES
) 和vendor_boot
為選用項目)。 - 從
boot
分區執行核心。
- 將復原 +
核心會將 ramdisk 掛接至
/
,然後從一般 ramdisk 執行/init
。第一個階段 init 會啟動,然後執行以下操作:
- 可設定
IsRecoveryMode() == true
和ForceNormalBoot() == false
。 - 從
/lib/modules
載入供應商核心模組。 - 呼叫
DoFirstStageMount()
,但略過掛接程序,原因如下:IsRecoveryMode() == true
。(裝置不會釋出 ramdisk,因為/
仍相同),但會呼叫SetInitAvbVersionInRecovery()
)。 - 從
/system/bin/init
從recovery
ramdisk 啟動第二階段 init。
- 可設定
提供 e2fsck
裝置 Makefile 可沿用自:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
(如果裝置支援虛擬服務專員) A/B,但未壓縮。virtual_ab_ota/compression.mk
(如果裝置支援虛擬 A/B) 。
安裝產品 makefile
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
。在
執行階段,第一個階段 init
會執行 /system/bin/e2fsck
。
選項 2b:專屬和非 A/B 的復原分區
這個選項適用於含有非 A/B recovery
分區的裝置;也就是
裝置有名為 recovery
的分區,但沒有運算單元後置字串。這類裝置
包括:
- 非 A/B 裝置;
- 不是復原分區的 A/B 和虛擬 A/B 裝置 可更新。(此為異常現象)。
vendor_boot
ramdisk 包含 ramdisk 和供應商的供應商位元
核心模組,包括:
- 裝置專屬的
fstab
檔案 lib/modules
(包含供應商核心模組)
recovery
圖片必須獨立。必須包含
啟動復原模式的所有必要資源,包括:
- 核心映像檔
- DTBO 圖片
- 「
lib/modules
」中的核心模組 - 第一階段啟動 (以符號連結形式)
/init -> /system/bin/init
- 第二階段初始化二進位檔
/system/bin/init
- 裝置專屬的
fstab
檔案 - 所有其他復原資源,包括
recovery
二進位檔
在這些裝置上,產品設定會沿用
出發地:generic_ramdisk.mk
。
設定 BOARD 值
針對非 A/B 裝置設定下列值:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Init 二進位檔和符號連結
recovery
ramdisk 必須包含 /init -> /system/bin/init
符號連結,且
init_second_stage.recovery
/system/bin/init
。裝置開機時
復原模式,需要 /system/bin/init
二進位檔才能先支援兩者
第二階段和第二階段初始化
當裝置開機至 recovery
時,recovery
ramdisks 的內容會
如下所示:
/init -> /system/bin/init
(來自recovery
ramdisk)/system/bin/init
(從recovery
ramdisk,建構自init_second_stage.recovery
,並以/init
執行)
裝置啟動 Android 時,vendor_boot
的內容 + 一般內容
ramdisks 如下:
/init
(從 ramdisk,透過init_first_stage
建構)
移動 fstab 檔案
將安裝到一般 ramdisk 的所有 fstab
檔案移至
vendor_ramdisk
和 recovery
ramdisk。如需範例,請參閱
變更。
安裝模組
您可以將裝置專屬模組安裝至「vendor_ramdisk
」並
recovery
ramdisk (略過)
。init
並未切換根目錄系統會將模組的 vendor_ramdisk
變化版本安裝至
vendor_ramdisk
的根。系統會將模組的 recovery
變化版本安裝至
recovery
ramdisk 的根。如需查看如何將模組安裝至
vendor_ramdisk
和 recovery
ramdisk,se
第一階段控制台和中繼資料
核對和。
第一階段控制台
如要安裝模組的 vendor_ramdisk
變化版本,請使用下列指令:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
這能確保 linker
、sh
和 toybox
能夠安裝到
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
,之後會安裝至
/system/bin
,vendor_ramdisk
。
如要新增第一階段控制台 (例如 ADB) 所需的模組,請啟用
這些模組的 vendor_ramdisk
變體,方法是將相關修補程式上傳至
然後使用下列指令
PRODUCT_PACKAGES += adbd.vendor_ramdisk
這可確保將指定的模組安裝到
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
。
如要安裝模組的 recovery
變化版本,請將 vendor_ramdisk
替換為
recovery
:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
中繼資料核對和
支援中繼資料
核對和
進行這項操作時,不支援 GKI 的裝置就會安裝 ramdisk
包含下列模組的變化版本。如要新增 GKI 支援功能,請將模組移至
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
如要在復原程序的第一個階段支援中繼資料核對和,請啟用 這些模組的復原變化版本,並一併安裝。
對啟動程序所做的變更
啟動 Android 裝置時,啟動程序不會變更。vendor_boot
+
一般 ramdisk 和現有的開機程序類似,只是 fstab
會從 vendor_boot
載入。由於 system/bin/recovery
不存在,
first_stage_init
將其視為一般啟動程序進行處理。
啟動進入復原模式時,啟動程序不會變更。恢復
ramdisk 的載入方式與現有的復原程序相同。
系統會從 recovery
映像檔載入核心。
復原模式的啟動程序如下所示。
系統啟動載入程式會啟動,並執行以下操作:
- 將復原 ramdisk 推送至
/
。 - 從
recovery
分區執行核心。
- 將復原 ramdisk 推送至
核心會將 ramdisk 掛接至
/
,然後執行/init
,這是以下的符號連結:recovery
ramdisk 中的/system/bin/init
。第一個階段 init 會啟動,然後執行以下操作:
- 可設定
IsRecoveryMode() == true
和ForceNormalBoot() == false
。 - 從
/lib/modules
載入供應商核心模組。 - 呼叫
DoFirstStageMount()
,但略過掛接程序,原因如下:IsRecoveryMode() == true
。(裝置不會釋出 ramdisk,因為/
仍相同),但會呼叫SetInitAvbVersionInRecovery()
)。 - 從
/system/bin/init
從recovery
ramdisk 啟動第二階段 init。
- 可設定
啟動映像檔時間戳記
下列程式碼是 boot
圖片時間戳記檔案範例:
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
在建構期間,系統會將
system/etc/ramdisk/build.prop
檔案新增至一般類別 ramdisk。此檔案包含建構作業的時間戳記資訊。在執行階段,第一個階段
init
副本 將 ramdisk 從 ramdisk 到tmpfs
的檔案,然後釋出 ramdisk 的容量, 階段「init
」可讀取 這個檔案來設定boot
圖片時間戳記屬性。