在 Android 12 中,通用boot
映像包含通用boot
ramdisk 和通用內核映像 (GKI) 。要構建通用 ramdisk,請將特定於供應商的資源移出 ramdisk,以便通用 ramdisk 僅包含第一階段init
和包含時間戳信息的屬性文件。
在以下設備上:
不要使用專用的
recovery
分區,所有恢復位都從引導 ramdisk 移動到vendor_boot
ramdisk。一定要使用專用的
recovery
分區,因為recovery
ramdisk 是獨立的,所以不需要更改recovery
ramdisk。
建築學
下圖說明了運行 Android 12 的設備的架構。
啟動或升級到 Android 12,沒有專門的恢復
圖 1.使用 GKI 啟動或升級到 Android 12 的設備,沒有專門的恢復
啟動或升級到 Android 12,專用和 A/B 恢復(專用 ramdisk)
圖 2a。使用 GKI、專用和 A/B 恢復啟動或升級到 Android 12 的設備
如果recovery
為 A/B,請參考此圖;即設備有recovery_a
和recovery_b
分區。
啟動或升級到 Android 12,專用和非 A/B 恢復(專用 ramdisk)
圖 2b。使用 GKI、專用和非 A/B 恢復啟動或升級到 Android 12 的設備
如果recovery
不是 A/B,請參考此圖;也就是說,設備有一個名為recovery
的分區,沒有插槽後綴。
升級到 Android 12,recovery-as-boot (recovery-as-ramdisk)
圖 3.升級到 Android 12、無 GKI、恢復即啟動的設備
升級到Android 12,專用恢復(專用ramdisk)
圖 4.升級到 Android 12、無 GKI、專用恢復的設備
引導映像內容
在 Android 12 中,啟動映像包含以下內容。
- 通用
boot
映像 vendor_boot
映像(有關詳細信息,請參閱Vendor Boot Partitions )-
vendor_boot
標頭- 特定於設備的
cmdline
(BOARD_KERNEL_CMDLINE
)
- 特定於設備的
-
vendor_boot
ramdisk 映像lib/modules
- 恢復資源(如果沒有專用恢復)
-
dtb
圖像
-
recovery
圖像- 標頭版本 V2
- 用於恢復的特定於設備的
cmdline
(如有必要) - 對於非 A/B 恢復分區,header 的內容必須是獨立的;請參閱恢復映像。例如:
-
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 被添加到
boot
和vendor_boot
ramdisk,因此它不需要是獨立的。例如: - 除了
vendor_boot
ramdisk 中的內核模塊之外,lib/modules
可能只包含啟動恢復模式所需的其他內核模塊。 -
/init
處的符號鏈接可能存在,但它被引導映像中的第一階段/init
二進製文件所掩蓋。
- 標頭版本 V2
通用引導 ramdisk 映像內容
在 Android 12 中,通用boot
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/
- 掛載點的重複空目錄:
引導映像集成
構建標誌控制如何構建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
。此變量指示板使用 GKI 和通用boot
映像。此變量不影響 sysprops 或PRODUCT_PACKAGES
。這是板級 GKI 開關;下面列出的所有變量都受此變量的限制。
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
。此變量控制是否為vendor_boot
構建 ramdisk 恢復資源。當設置為
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
。其他設備必須將此變量留空。
允許的組合
組件或變量 | 在沒有recovery 分區的情況下更新設備 | 使用recovery 分區更新設備 | 啟動沒有recovery 分區的設備 | 使用 A/B recovery 分區啟動設備 | 使用非 A/B recovery 分區啟動設備 | aosp_arm64 |
---|---|---|---|---|---|---|
包含boot | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
包含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_RESOURCE_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
映像啟用鍊式 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
例如,請參閱此更改。
系統為根
使用 GKI 和通用引導映像的設備不支持 System-as-root,無論設備是否支持可更新的 GKI 模塊。在此類設備上, BOARD_BUILD_SYSTEM_ROOT_IMAGE
必須為空。使用動態分區的設備也不支持 System-as-root,這是使用可更新 GKI 模塊的要求。
產品配置
使用通用 ramdisk 的設備必須安裝允許安裝到 ramdisk 的文件列表。為此,請在device.mk
中指定以下內容:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
generic_ramdisk.mk
文件還可以防止其他 makefile 意外地將其他文件安裝到 ramdisk(將這些文件移動到vendor_ramdisk
)。
設置設備
更新到 Android 12 和啟動 Android 12 的設備之間的設置說明有所不同。
更新至 Android 12 的設備:
可以保留
BOARD_USES_RECOVERY_AS_BOOT
的值。如果他們這樣做,他們使用的是舊配置,並且新的構建變量必須為空。如果此類設備:可以將
BOARD_USES_RECOVERY_AS_BOOT
設置為空。如果他們這樣做,他們正在使用新的配置。如果此類設備:
搭載 Android 12 的設備必須將
BOARD_USES_RECOVERY_AS_BOOT
設置為空並使用新配置。如果此類設備:
因為aosp_arm64
只構建 GKI 和通用boot
映像(而不是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
初始化二進製文件和符號鏈接
vendor_boot
ramdisk 可以包含指向/system/bin/init
符號鏈接的/init
和 /system/bin /system/bin/init
init 中的init_second_stage.recovery
。但是,因為boot
ramdisk 在vendor_boot
ramdisk 之後連接,所以/init
符號鏈接被覆蓋。當設備啟動恢復時,需要/system/bin/init
二進製文件來支持第二階段 init。 vendor_boot
+ boot
ramdisk的內容如下:
-
/init
(來自 ramdisk,由init_first_stage
) -
/system/bin/init
(來自vendor_ramdisk
,由init_second_stage.recovery
)
移動 fstab 文件
將安裝到boot
ramdisk 的任何fstab
文件移動到vendor_ramdisk
。例如,請參閱此更改。
安裝模塊
如果需要,您可以將特定於設備的模塊安裝到vendor_ramdisk
(如果您沒有要安裝的任何特定於設備的模塊,請跳過此步驟)。
當模塊安裝到
/first_stage_ramdisk
時,使用模塊的vendor_ramdisk
變體。該模塊應該在init
將 root 切換到/first_stage_ramdisk
但在init
將 root 切換到/system
之前可用。例如,請參閱元數據校驗和和虛擬 A/B 壓縮。當模塊安裝到
/
時,使用模塊的recovery
變體。在init
將 root 切換到/first_stage_ramdisk
之前,該模塊應該可用。有關將模塊安裝到/
的詳細信息,請參閱第一階段控制台。
一級控制台
由於第一階段控制台在init
將 root 切換到/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
,然後安裝到vendor_ramdisk
下的/system/bin
。
要添加第一階段控制台所需的模塊(例如 adbd),請使用以下命令。
PRODUCT_PACKAGES += adbd.recovery
這確保指定的模塊安裝到$ANDROID_PRODUCT_OUT/recovery/root/system/bin
,然後安裝到vendor_ramdisk
下的/system/bin
。
元數據校驗和
為了在第一階段掛載期間支持元數據校驗和,不支持 GKI 的設備會安裝以下模塊的 ramdisk 變體。要添加對 GKI 的支持,請將模塊移動到$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
例如,請參閱此更改列表。
虛擬 A/B 壓縮
要支持虛擬 A/B 壓縮,必須將snapuserd
安裝到vendor_ramdisk
。該設備應該從virtual_ab_ota/compression.mk
繼承,它安裝了snapuserd
的vendor_ramdisk
變體。
引導過程的變化
啟動進入恢復或進入 Android 的過程不會改變,但以下情況除外:
- Ramdisk
build.prop
移動到/second_stage_resources
以便第二階段init
可以讀取啟動的構建時間戳。
因為資源從boot
ramdisk 移動到vendor_boot
ramdisk,連接boot
到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
將 root 切換到/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
初始化二進製文件和符號鏈接
recovery
ramdisk 可以包含/init -> /system/bin/init
符號鏈接,以及/system/bin/init
中的init_second_stage.recovery
。但是,由於引導 ramdisk 在recovery
ramdisk 之後連接,因此/init
符號鏈接被覆蓋。當設備啟動到恢復模式時,需要/system/bin/init
二進製文件來支持第二階段 init。
當設備啟動進入recovery
時, recovery
+ vendor_boot
+ boot
ramdisks 的內容如下:
-
/init
(來自 ramdisk,由init_first_stage
) -
/system/bin/init
(來自recovery
ramdisk,由init_second_stage.recovery
,並從/init
執行)
設備啟動進入Android時, vendor_boot
+ boot
ramdisk的內容如下:
-
/init
(來自 ramdisk,由init_first_stage
)
移動 fstab 文件
將安裝到boot
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
,然後安裝到vendor_ramdisk
下的/system/bin
。
要添加第一階段控制台所需的模塊(例如 adbd),請通過將相關補丁上傳到 AOSP 來啟用這些模塊的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 \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
例如,請參閱此更改列表。
虛擬 A/B 壓縮
要支持虛擬 A/B 壓縮,必須將snapuserd
安裝到vendor_ramdisk
。該設備應該從virtual_ab_ota/compression.mk
繼承,它安裝了snapuserd
的vendor_ramdisk
變體。
引導過程的變化
啟動到 Android 時,啟動過程不會改變。 vendor_boot
+ boot
ramdisk 類似於現有的引導過程,除了fstab
從vendor_boot
加載。因為system/bin/recovery
不存在, first_stage_init
將其作為正常啟動處理。
啟動進入恢復模式時,啟動過程會發生變化。 recovery + vendor_boot
+ boot
ramdisk 類似於現有的恢復過程,但內核是從boot
映像而不是從recovery
映像加載的。恢復模式的啟動過程如下。
引導加載程序啟動,然後執行以下操作:
- 將 recovery +
vendor_boot
+boot
ramdisk 推送到/
。 (如果 OEM 通過將它們添加到BOARD_RECOVERY_KERNEL_MODULES
來複製恢復 ramdisk 中的內核模塊),vendor_boot
是可選的。) - 從
boot
分區運行內核。
- 將 recovery +
內核將 ramdisk 掛載到
/
然後從boot
ramdisk 執行/init
。第一階段 init 開始,然後執行以下操作:
- 設置
IsRecoveryMode() == true
和ForceNormalBoot() == false
。 - 從
/lib/modules
加載供應商內核模塊。 - 調用
DoFirstStageMount()
但跳過安裝,因為IsRecoveryMode() == true
。 (設備不會釋放 ramdisk(因為/
仍然相同),但會調用SetInitAvbVersionInRecovery()
。) - 從
recovery
ramdisk 的/system/bin/init
啟動第二階段 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 作為符號鏈接
/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
初始化二進製文件和符號鏈接
recovery
ramdisk 必須包含/init -> /system/bin/init
符號鏈接,以及/system/bin/init
中的init_second_stage.recovery
。當設備啟動進入恢復模式時,需要/system/bin/init
二進製文件來支持第一階段和第二階段 init。
當設備啟動進入recovery
時, recovery
ramdisk 的內容如下:
-
/init -> /system/bin/init
(來自recovery
ramdisk) -
/system/bin/init
(來自recovery
ramdisk,由init_second_stage.recovery
,並從/init
執行)
設備啟動進入Android時, vendor_boot
+ boot
ramdisk的內容如下:
-
/init
(來自 ramdisk,由init_first_stage
)
移動 fstab 文件
將安裝到boot
ramdisk 的所有fstab
文件移動到vendor_ramdisk
和recovery
ramdisk。例如,請參閱此更改。
安裝模塊
如果需要,您可以將特定於設備的模塊安裝到vendor_ramdisk
和recovery
ramdisk(如果您沒有要安裝的任何特定於設備的模塊,請跳過此步驟)。 init
不切換根目錄。模塊的vendor_ramdisk
變體安裝到vendor_ramdisk
的根目錄。模塊的recovery
變體安裝到recovery
ramdisk 的根目錄。有關將模塊安裝到vendor_ramdisk
和recovery
ramdisk 的示例,請參閱第一階段控制台和元數據校驗和。
一級控制台
要安裝模塊的vendor_ramdisk
變體,請使用以下命令:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
這可確保linker
、 sh
和toybox
安裝到$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
,然後安裝到vendor_ramdisk
下的/system/bin
。
要添加第一階段控制台所需的模塊(例如 adbd),請通過將相關補丁上傳到 AOSP 來啟用這些模塊的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 \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
要在恢復的第一階段掛載期間支持元數據校驗和,請啟用這些模塊的恢復變體並安裝它們。
引導過程的變化
啟動到 Android 時,啟動過程不會改變。 vendor_boot
+ 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()
。) - 從
recovery
ramdisk 的/system/bin/init
啟動第二階段 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
文件被添加到通用boot
映像 ramdisk。該文件包含構建的時間戳信息。在運行時,第一階段
init
在釋放 ramdisk 之前將文件從 ramdisk複製到tmpfs
,以便第二階段init
可以讀取此文件以設置boot
映像時間戳屬性。