Trong Android 12, hình ảnh boot
chung, được gọi là Hình ảnh hạt nhân chung (GKI) , chứa đĩa ram chung và nhân GKI.
Đối với các thiết bị chạy Android 13, đĩa ram chung sẽ bị xóa khỏi ảnh boot
và được đặt trong một ảnh init_boot
riêng. Thay đổi này để lại hình ảnh boot
chỉ với hạt nhân GKI.
Đối với các thiết bị nâng cấp tiếp tục sử dụng các phiên bản nhân Android 12 trở lên, đĩa ram chung vẫn giữ nguyên vị trí mà không yêu cầu hình ảnh init_boot
mới.
Để xây dựng một đĩa ram chung, hãy di chuyển các tài nguyên dành riêng cho nhà cung cấp ra khỏi đĩa ram sao cho đĩa ram chung chỉ chứa init
giai đoạn đầu tiên và một tệp thuộc tính chứa thông tin dấu thời gian.
Trên các thiết bị:
Không sử dụng phân vùng
recovery
chuyên dụng, tất cả các bit khôi phục sẽ chuyển từ đĩa ram chung sang đĩa ramvendor_boot
.Sử dụng phân vùng
recovery
chuyên dụng, không cần thay đổi đĩa ramrecovery
vì đĩa ramrecovery
là độc lập.
Ngành kiến trúc
Các sơ đồ sau đây minh họa kiến trúc cho các thiết bị chạy Android 12 trở lên. Thiết bị khởi chạy với Android 13 có hình ảnh init_boot
mới chứa đĩa ram chung. Các thiết bị nâng cấp từ Android 12 lên Android 13 sử dụng cùng một kiến trúc như đã làm với Android 12.
Khởi chạy với Android 13, không có phục hồi chuyên dụng
Hình 1. Các thiết bị khởi chạy hoặc nâng cấp lên Android 13, với GKI, không có phục hồi chuyên dụng
Khởi chạy với Android 13, phục hồi A/B chuyên dụng và chuyên dụng (đĩa ram chuyên dụng)
Hình 2. Các thiết bị khởi chạy hoặc nâng cấp lên Android 13, với GKI, chuyên dụng và phục hồi A/B
Tham khảo hình này nếu thiết bị có phân vùng recovery_a
và recovery_b
.
Ra mắt với Android 13, phục hồi chuyên dụng và không A/B (đĩa ram chuyên dụng)
Hình 3. Các thiết bị khởi chạy hoặc nâng cấp lên Android 13, với GKI, phục hồi chuyên dụng và không phải A/B
Tham khảo hình này nếu thiết bị có phân vùng có tên recovery
không có hậu tố vị trí.
Khởi chạy hoặc nâng cấp lên Android 12, không có phục hồi chuyên dụng
Hình 4. Các thiết bị khởi chạy hoặc nâng cấp lên Android 12, với GKI, không có phục hồi chuyên dụng
Chạy hoặc nâng cấp lên Android 12, chuyên dụng và phục hồi A/B (đĩa ram chuyên dụng)
Hình 5. Các thiết bị khởi chạy hoặc nâng cấp lên Android 12, với GKI, chuyên dụng và phục hồi A/B
Tham khảo hình này nếu thiết bị có phân vùng recovery_a
và recovery_b
.
Khởi chạy hoặc nâng cấp lên Android 12, phục hồi chuyên dụng và không phải A/B (đĩa ram chuyên dụng)
Hình 6. Các thiết bị khởi chạy hoặc nâng cấp lên Android 12, với GKI, khôi phục chuyên dụng và không A/B
Tham khảo hình này nếu thiết bị có phân vùng có tên recovery
không có hậu tố vị trí.
Nâng cấp lên Android 12, recovery-as-boot (recovery-as-ramdisk)
Hình 7. Các thiết bị nâng cấp lên Android 12, không có GKI, recovery-as-boot
Nâng cấp lên Android 12, phục hồi chuyên dụng (đĩa ram chuyên dụng)
Hình 8. Các thiết bị nâng cấp lên Android 12, không có GKI, phục hồi chuyên dụng
Nội dung hình ảnh khởi động
Các hình ảnh khởi động Android chứa những điều sau đây.
đã thêm hình ảnh
init_boot
cho các thiết bị khởi chạy với Android 13- Phiên bản tiêu đề V4
- Hình ảnh đĩa ram chung
Hình ảnh
boot
chung- Phiên bản tiêu đề V3 hoặc V4
- Một
boot_signature
cho chứng chỉ GKI boot.img (chỉ v4). GKIboot.img
được chứng nhận chưa được ký cho khởi động đã xác minh. Các OEM vẫn phải kýboot.img
dựng sẵn bằng khóa AVB dành riêng cho thiết bị. - Dòng
cmdline
chung (GENERIC_KERNEL_CMDLINE
) - hạt nhân GKI
- Một
- Hình ảnh đĩa ram chung
- Chỉ có trong hình ảnh
boot
từ Android 12 trở về trước
- Chỉ có trong hình ảnh
- Phiên bản tiêu đề V3 hoặc V4
hình ảnh
vendor_boot
(để biết chi tiết, xem Phân vùng khởi động nhà cung cấp )- tiêu đề
vendor_boot
-
cmdline
dành riêng cho thiết bị (BOARD_KERNEL_CMDLINE
)
-
- hình ảnh đĩa ram
vendor_boot
-
lib/modules
- Tài nguyên phục hồi (nếu không có phục hồi chuyên dụng)
-
- hình ảnh
dtb
- tiêu đề
hình ảnh
recovery
- Phiên bản tiêu đề V2
-
cmdline
dành riêng cho thiết bị để khôi phục, nếu cần - Đối với phân vùng khôi phục không phải A/B, nội dung của tiêu đề phải độc lập; xem Hình ảnh khôi phục . Ví dụ:
-
cmdline
không được nối vớiboot
vàvendor_boot
cmdline
. - Tiêu đề chỉ định khôi phục DTBO, nếu cần.
- Đối với phân vùng khôi phục A/B, nội dung có thể được nối hoặc suy ra từ
boot
vàvendor_boot
. Ví dụ: -
cmdline
được nối vớiboot
vàvendor_boot
cmdline
. - DTBO có thể được suy ra từ tiêu đề
vendor_boot
.
-
-
recovery
hình ảnh đĩa ram- tài nguyên phục hồi
- Đối với phân vùng khôi phục không phải A/B, nội dung của đĩa ram phải độc lập; xem Hình ảnh khôi phục . Ví dụ:
-
lib/modules
đun phải chứa tất cả các mô-đun hạt nhân cần thiết để khởi động chế độ khôi phục - Ramdisk phục hồi phải chứa
init
. - Đối với phân vùng khôi phục A/B, đĩa ram phục hồi được thêm vào trước đĩa ram chung và đĩa ram
vendor_boot
, do đó không cần phải độc lập. Ví dụ: -
lib/modules
chỉ có thể chứa các mô-đun hạt nhân bổ sung cần thiết để khởi động chế độ khôi phục bên cạnh các mô-đun hạt nhân trong đĩa ramvendor_boot
. - Liên kết tượng trưng tại
/init
có thể tồn tại, nhưng nó bị lu mờ bởi nhị phân/init
giai đoạn đầu trong ảnh khởi động.
- Phiên bản tiêu đề V2
Nội dung hình ảnh ramdisk chung
Ramdisk chung chứa các thành phần sau.
-
init
- Đã thêm
system/etc/ramdisk/build.prop
-
ro. PRODUCT .bootimg.* build
- Các thư mục trống cho các điểm gắn kết:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
-
first_stage_ramdisk/
- Sao chép các thư mục trống cho các điểm gắn kết:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- Sao chép các thư mục trống cho các điểm gắn kết:
Tích hợp hình ảnh khởi động
Cờ xây dựng kiểm soát cách hình ảnh init_boot
, boot
, recovery
và vendor_boot
được tạo. Giá trị của biến bảng boolean phải là chuỗi true
hoặc để trống (là giá trị mặc định).
TARGET_NO_KERNEL
. Biến này cho biết liệu bản dựng có sử dụng hình ảnh khởi động dựng sẵn hay không. Nếu biến này được đặt thànhtrue
, thì hãy đặtBOARD_PREBUILT_BOOTIMAGE
thành vị trí của hình ảnh khởi động dựng sẵn (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img
)BOARD_USES_RECOVERY_AS_BOOT
. Biến này cho biết liệu thiết bị có sử dụng hình ảnhrecovery
làm hình ảnhboot
hay không. Khi sử dụng GKI, biến này trống và tài nguyên khôi phục sẽ được chuyển đếnvendor_boot
.BOARD_USES_GENERIC_KERNEL_IMAGE
. Biến này chỉ ra rằng bảng sử dụng GKI. Biến này không ảnh hưởng đến sysprops hoặcPRODUCT_PACKAGES
.Đây là công tắc GKI cấp bảng; tất cả các biến được liệt kê bên dưới đều bị hạn chế bởi biến này.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. Biến này kiểm soát xem tài nguyên phục hồi ramdisk có được xây dựng thànhvendor_boot
hay không.Khi được đặt thành
true
, các tài nguyên khôi phục chỉ được tạo chovendor-ramdisk/
và không được tạo chorecovery/root/
.Khi trống, tài nguyên khôi phục chỉ được xây dựng cho
recovery/root/
và không được xây dựng chovendor-ramdisk/
.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
. Biến này kiểm soát xem các khóa GSI AVB có được tạo thànhvendor_boot
không.Khi được đặt thành
true
, nếuBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
:Được đặt, các khóa GSI AVB được tạo thành
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
.Không được đặt, khóa GSI AVB được tạo thành
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
.
Khi trống, nếu
BOARD_RECOVERY_AS_ROOT
:Được đặt, các khóa GSI AVB được tạo thành
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
.Không được đặt, khóa GSI AVB được tạo thành
$ANDROID_PRODUCT_OUT/ramdisk/avb
.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
. Biến này kiểm soát xem hình ảnhrecovery
có chứa hạt nhân hay không. Các thiết bị khởi chạy với Android 12 và sử dụng phân vùngrecovery
A/B phải đặt biến này thànhtrue
. Các thiết bị khởi chạy với Android 12 và sử dụng non-A/B phải đặt biến này thànhfalse
để giữ hình ảnh khôi phục độc lập.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. Biến này kiểm soát xem$OUT/boot*.img
có được sao chép vàoIMAGES/
dưới các tệp đích hay không.aosp_arm64
phải đặt biến này thànhtrue
.Các thiết bị khác phải để trống biến này.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. Biến này kiểm soát xeminit_boot.img
có được tạo hay không và đặt kích thước. Khi được đặt, đĩa ram chung sẽ được thêm vàoinit_boot.img
thay vìboot.img
và yêu cầu đặt các biếnBOARD_AVB_INIT_BOOT*
cho chuỗi vbmeta
kết hợp được phép
Thành phần hoặc biến | Nâng cấp thiết bị không có phân vùng recovery | Nâng cấp thiết bị với phân vùng recovery | Khởi chạy thiết bị không có phân vùng recovery | Khởi chạy thiết bị có phân vùng recovery A/B | Khởi chạy thiết bị có phân vùng recovery không phải A/B | aosp_arm64 |
---|---|---|---|---|---|---|
Chứa boot | Đúng | Đúng | Đúng | Đúng | Đúng | Đúng |
Chứa init_boot (Android 13) | KHÔNG | KHÔNG | Đúng | Đúng | Đúng | Đúng |
Chứa vendor_boot | không bắt buộc | không bắt buộc | Đúng | Đúng | Đúng | KHÔNG |
Chứa phục recovery | KHÔNG | Đúng | KHÔNG | Đúng | Đúng | KHÔNG |
BOARD_USES_RECOVERY_AS_BOOT | true | trống | trống | trống | trống | trống |
BOARD_USES_GENERIC_KERNEL_IMAGE | trống | trống | true | true | true | true |
PRODUCT_BUILD_RECOVERY_IMAGE | trống | true hoặc trống | trống | true hoặc trống | true hoặc trống | trống |
BOARD_RECOVERYIMAGE_PARTITION_SIZE | trống | > 0 | trống | > 0 | > 0 | trống |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT | trống | trống | true | trống | trống | trống |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT | trống | trống | true | true | true | trống |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE | trống | trống | trống | true | trống | trống |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES | trống | trống | trống | trống | trống | true |
Các thiết bị có phân vùng recovery
chuyên dụng có thể đặt PRODUCT_BUILD_RECOVERY_IMAGE
thành true
hoặc trống. Đối với những thiết bị này, nếu BOARD_RECOVERYIMAGE_PARTITION_SIZE
được đặt, hình ảnh recovery
sẽ được tạo.
Kích hoạt chuỗi vbmeta để khởi động
Chuỗi vbmeta phải được bật cho hình ảnh boot
và init_boot
. Chỉ định như sau:
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
Ví dụ, hãy tham khảo thay đổi này .
Hệ thống với quyền root
Hệ thống với quyền root không được hỗ trợ cho các thiết bị sử dụng GKI. Trên những thiết bị như vậy, BOARD_BUILD_SYSTEM_ROOT_IMAGE
phải trống. Hệ thống với quyền root cũng không được hỗ trợ cho các thiết bị sử dụng phân vùng động.
cấu hình sản phẩm
Các thiết bị sử dụng đĩa ram chung phải cài đặt danh sách các tệp được phép cài đặt vào đĩa ram. Để làm như vậy, hãy chỉ định thông tin sau trong device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Tệp generic_ramdisk.mk
cũng ngăn không cho các tệp tạo tệp khác vô tình cài đặt các tệp khác vào đĩa ram (thay vào đó hãy di chuyển các tệp đó sang vendor_ramdisk
).
Thiết lập thiết bị
Hướng dẫn thiết lập khác nhau giữa các thiết bị khởi chạy với Android 13, nâng cấp lên Android 12 và khởi chạy với Android 12. Android 13, được thiết lập tương tự như cách thiết lập với Android 12
Thiết bị nâng cấp lên Android 12:
Có thể bảo toàn giá trị của
BOARD_USES_RECOVERY_AS_BOOT
. Nếu họ làm như vậy, thì họ đang sử dụng cấu hình cũ và các biến bản dựng mới phải trống. Nếu các thiết bị như vậy:Có thể đặt
BOARD_USES_RECOVERY_AS_BOOT
thành trống. Nếu họ làm như vậy, họ đang sử dụng cấu hình mới. Nếu các thiết bị như vậy:Không sử dụng phân vùng
recovery
chuyên dụng, cấu trúc như trong Hình 1 và tùy chọn thiết lập thiết bị là Tùy chọn 1 .Sử dụng phân vùng
recovery
chuyên dụng, kiến trúc như trong Hình 2a hoặc Hình 2b và tùy chọn thiết lập thiết bị là Tùy chọn 2a hoặc Tùy chọn 2b .
Các thiết bị khởi chạy với Android 12 phải đặt
BOARD_USES_RECOVERY_AS_BOOT
thành trống và sử dụng cấu hình mới. Nếu các thiết bị như vậy:Không sử dụng phân vùng
recovery
chuyên dụng, cấu trúc như trong Hình 1 và tùy chọn thiết lập thiết bị là Tùy chọn 1 .Sử dụng phân vùng
recovery
chuyên dụng, kiến trúc như trong Hình 2a hoặc Hình 2b và tùy chọn thiết lập thiết bị là Tùy chọn 2a hoặc Tùy chọn 2b .
Bởi vì aosp_arm64
chỉ xây dựng GKI (chứ không phải vendor_boot
hoặc phục hồi), nó không phải là mục tiêu hoàn chỉnh. Để biết cấu hình bản dựng aosp_arm64
, hãy tham khảo generic_arm64
.
Tùy chọn 1: Không có phân vùng phục hồi chuyên dụng
Các thiết bị không có phân vùng recovery
chứa hình ảnh boot
chung trong phân vùng boot
. Đĩa ram vendor_boot
chứa tất cả các tài nguyên khôi phục, bao gồm lib/modules
(với các mô-đun hạt nhân của nhà cung cấp). Trên các thiết bị như vậy, cấu hình sản phẩm kế thừa từ generic_ramdisk.mk
.
Đặt giá trị BAN
Đặt các giá trị sau:
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
Khởi tạo nhị phân và liên kết tượng trưng
Đĩa ram vendor_boot
có thể chứa một liên kết tượng trưng /init
đến /system/bin/init
và init_second_stage.recovery
tại /system/bin/init
. Tuy nhiên, vì đĩa ram chung được nối sau đĩa ram vendor_boot
, liên kết tượng trưng /init
bị ghi đè. Khi thiết bị khởi động vào chế độ khôi phục, tệp nhị phân /system/bin/init
là cần thiết để hỗ trợ init giai đoạn thứ hai. Nội dung của vendor_boot
+ ramdisks chung như sau:
-
/init
(từ ramdisk chung, được xây dựng từinit_first_stage
) -
/system/bin/init
(từvendor_ramdisk
, được xây dựng từinit_second_stage.recovery
)
Di chuyển tệp fstab
Di chuyển bất kỳ tệp fstab
nào đã được cài đặt vào đĩa ram chung sang vendor_ramdisk
. Ví dụ, hãy tham khảo thay đổi này .
cài đặt mô-đun
Nếu muốn, bạn có thể cài đặt các mô-đun dành riêng cho thiết bị vào vendor_ramdisk
(bỏ qua bước này nếu bạn không có bất kỳ mô-đun dành riêng cho thiết bị nào để cài đặt).
Sử dụng biến thể
vendor_ramdisk
của mô-đun khi mô-đun cài đặt vào/first_stage_ramdisk
. Mô-đun này sẽ khả dụng sau khiinit
chuyển root thành/first_stage_ramdisk
nhưng trước khiinit
chuyển root thành/system
. Ví dụ: xem Tổng kiểm tra siêu dữ liệu và Nén A/B ảo .Sử dụng biến thể
recovery
của mô-đun khi mô-đun cài đặt vào/
. Mô-đun này sẽ khả dụng trước khiinit
chuyển root thành/first_stage_ramdisk
. Để biết chi tiết về cách cài đặt các mô-đun vào/
, hãy xem Bảng điều khiển giai đoạn đầu .
Bảng điều khiển giai đoạn đầu tiên
Vì bảng điều khiển giai đoạn đầu khởi động trước khi init
chuyển root thành /first_stage_ramdisk
, nên bạn cần cài đặt biến thể recovery
của các mô-đun. Theo mặc định, cả hai biến thể mô-đun đều được cài đặt để build/make/target/product/base_vendor.mk
, vì vậy nếu tệp tạo tệp của thiết bị kế thừa từ tệp đó thì bạn không cần cài đặt rõ ràng biến thể recovery
.
Để cài đặt rõ ràng các mô-đun khôi phục, hãy sử dụng cách sau.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
Điều này đảm bảo rằng linker
, sh
và toybox
cài đặt vào $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, sau đó cài đặt vào /system/bin
bên dưới vendor_ramdisk
.
Để thêm các mô-đun cần thiết cho bảng điều khiển giai đoạn đầu tiên (ví dụ: adbd), hãy sử dụng thông tin sau.
PRODUCT_PACKAGES += adbd.recovery
Điều này đảm bảo rằng các mô-đun đã chỉ định sẽ cài đặt vào $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, sau đó sẽ cài đặt vào /system/bin
trong vendor_ramdisk
.
Tổng kiểm tra siêu dữ liệu
Để hỗ trợ tổng kiểm tra siêu dữ liệu trong quá trình gắn ở giai đoạn đầu tiên, các thiết bị không hỗ trợ GKI sẽ cài đặt biến thể đĩa ram của các mô-đun sau. Để thêm hỗ trợ cho GKI, hãy di chuyển các mô-đun tới $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Để biết ví dụ, hãy tham khảo danh sách thay đổi này .
Nén A/B ảo
Để hỗ trợ nén A/B ảo, snapuserd
phải được cài đặt vào vendor_ramdisk
. Thiết bị phải kế thừa từ virtual_ab_ota/compression.mk
, cài đặt biến thể vendor_ramdisk
của snapuserd
.
Thay đổi quá trình khởi động
Quá trình khởi động vào recovery hoặc vào Android không thay đổi, với ngoại lệ sau:
- Ramdisk
build.prop
di chuyển vào/second_stage_resources
để giai đoạn thứ haiinit
có thể đọc dấu thời gian khởi động của bản dựng.
Do các tài nguyên di chuyển từ đĩa ram chung sang đĩa ram vendor_boot
nên kết quả của việc nối đĩa ram chung vào đĩa ram vendor_boot
không thay đổi.
Cung cấp e2fsck
Makefiles thiết bị có thể kế thừa từ:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
nếu thiết bị hỗ trợ A/B ảo nhưng không hỗ trợ nén.virtual_ab_ota/compression.mk
nếu thiết bị hỗ trợ nén A/B ảo.
Tệp tạo tệp sản phẩm cài đặt $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
. Khi chạy, giai đoạn đầu tiên init
chuyển root thành /first_stage_ramdisk
rồi thực thi /system/bin/e2fsck
.
Tùy chọn 2a: Phân vùng khôi phục chuyên dụng và A/B
Sử dụng tùy chọn này cho các thiết bị có phân vùng recovery
A/B; tức là thiết bị có phân vùng recovery_a
và recovery_b partition
. Các thiết bị như vậy bao gồm các thiết bị A/B và Virtual A/B mà phân vùng khôi phục có thể cập nhật được, với cấu hình sau:
AB_OTA_PARTITIONS += recovery
Đĩa ram vendor_boot
chứa các bit của nhà cung cấp của các mô-đun nhân ramdisk và nhà cung cấp, bao gồm:
Tệp
fstab
dành riêng cho thiết bịlib/modules
(bao gồm các mô-đun hạt nhân của nhà cung cấp)
Ramdisk recovery
chứa tất cả các tài nguyên khôi phục. Trên các thiết bị như vậy, cấu hình sản phẩm kế thừa từ generic_ramdisk.mk
.
Đặt giá trị BAN
Đặt các giá trị sau cho thiết bị có phân vùng recovery
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 := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Khởi tạo nhị phân và liên kết tượng trưng
Đĩa ram recovery
có thể chứa liên kết tượng trưng /init -> /system/bin/init
và init_second_stage.recovery
tại /system/bin/init
. Tuy nhiên, vì đĩa ram khởi động được nối sau đĩa ram recovery
, liên kết tượng trưng /init
bị ghi đè. Khi thiết bị khởi động vào chế độ khôi phục, tệp nhị phân /system/bin/init
là cần thiết để hỗ trợ init giai đoạn thứ hai.
Khi thiết bị khởi động vào recovery
, nội dung của recovery
+ vendor_boot
+ ramdisks chung như sau:
-
/init
(từ ramdisk, được xây dựng từinit_first_stage
) -
/system/bin/init
(từ đĩa ramrecovery
, được tạo từinit_second_stage.recovery
và được thực thi từ/init
)
Khi thiết bị khởi động vào Android, nội dung của vendor_boot
+ ramdisks chung như sau:
-
/init
(từ ramdisk chung, được xây dựng từinit_first_stage
)
Di chuyển tệp fstab
Di chuyển bất kỳ tệp fstab
nào đã được cài đặt vào đĩa ram chung sang vendor_ramdisk
. Ví dụ, hãy tham khảo thay đổi này .
cài đặt mô-đun
Nếu muốn, bạn có thể cài đặt các mô-đun dành riêng cho thiết bị vào vendor_ramdisk
(bỏ qua bước này nếu bạn không có bất kỳ mô-đun dành riêng cho thiết bị nào để cài đặt). Init
không chuyển root. Biến thể của các mô-đun vendor_ramdisk
cài đặt vào thư mục gốc của vendor_ramdisk
. Để biết ví dụ về cách cài đặt các mô-đun vào vendor_ramdisk
, hãy xem Bảng điều khiển giai đoạn đầu , Tổng kiểm tra siêu dữ liệu và nén A/B ảo .
Bảng điều khiển giai đoạn đầu tiên
Để cài đặt biến thể vendor_ramdisk
của các mô-đun, hãy sử dụng như sau:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Điều này đảm bảo rằng linker
, sh
và toybox
cài đặt vào $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, sau đó cài đặt vào /system/bin
bên dưới vendor_ramdisk
.
Để thêm các mô-đun cần thiết cho bảng điều khiển giai đoạn đầu (ví dụ: adbd), hãy bật biến thể vendor_ramdisk
của các mô-đun này bằng cách tải các bản vá có liên quan lên AOSP, sau đó sử dụng thông tin sau:
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Điều này đảm bảo rằng các mô-đun đã chỉ định sẽ cài đặt vào $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
. Nếu đĩa ram vendor_boot
được tải trong chế độ khôi phục, thì mô-đun cũng có sẵn trong recovery
. Nếu đĩa ram vendor_boot
không được tải trong chế độ khôi phục, thì thiết bị cũng có thể tùy ý cài đặt adbd.recovery
.
Tổng kiểm tra siêu dữ liệu
Để hỗ trợ tổng kiểm tra siêu dữ liệu trong quá trình gắn ở giai đoạn đầu tiên, các thiết bị không hỗ trợ GKI sẽ cài đặt biến thể đĩa ram của các mô-đun sau. Để thêm hỗ trợ cho GKI, hãy di chuyển các mô-đun tới $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Để biết ví dụ, hãy tham khảo danh sách thay đổi này .
Nén A/B ảo
Để hỗ trợ nén A/B ảo, snapuserd
phải được cài đặt vào vendor_ramdisk
. Thiết bị phải kế thừa từ virtual_ab_ota/compression.mk
, cài đặt biến thể vendor_ramdisk
của snapuserd
.
Thay đổi quá trình khởi động
Khi khởi động vào Android, quá trình khởi động không thay đổi. vendor_boot
+ ramdisk chung tương tự như quy trình khởi động hiện tại, ngoại trừ việc fstab
tải từ vendor_boot
. Bởi vì system/bin/recovery
không tồn tại, first_stage_init
xử lý nó như một khởi động bình thường.
Khi khởi động vào chế độ khôi phục, quá trình khởi động sẽ thay đổi. Recovery + vendor_boot
+ generic ramdisk tương tự như quy trình khôi phục hiện tại, nhưng kernel được tải từ ảnh boot
thay vì từ ảnh recovery
. Quá trình khởi động cho chế độ phục hồi như sau.
Bootloader bắt đầu, sau đó thực hiện như sau:
- Đẩy recovery +
vendor_boot
+ ramdisk chung vào/
. (Nếu OEM sao chép các mô-đun hạt nhân trong đĩa ram phục hồi bằng cách thêm chúng vàoBOARD_RECOVERY_KERNEL_MODULES
), thìvendor_boot
là tùy chọn.) - Chạy hạt nhân từ phân vùng
boot
.
- Đẩy recovery +
Kernel gắn ramdisk vào
/
sau đó thực thi/init
từ ramdisk chung.Giai đoạn đầu tiên init bắt đầu, sau đó thực hiện như sau:
- Đặt
IsRecoveryMode() == true
vàForceNormalBoot() == false
. - Tải các mô-đun hạt nhân của nhà cung cấp từ
/lib/modules
. - Gọi
DoFirstStageMount()
nhưng bỏ qua quá trình gắn vìIsRecoveryMode() == true
. (Thiết bị không giải phóng ramdisk (vì/
vẫn như cũ) nhưng gọiSetInitAvbVersionInRecovery()
.) - Bắt đầu init giai đoạn thứ hai từ
/system/bin/init
từ đĩa ramrecovery
.
- Đặt
Cung cấp e2fsck
Makefiles thiết bị có thể kế thừa từ:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
nếu thiết bị hỗ trợ A/B ảo nhưng không hỗ trợ nén.virtual_ab_ota/compression.mk
nếu thiết bị hỗ trợ nén A/B ảo.
Tệp tạo tệp sản phẩm cài đặt $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
. Khi chạy, giai đoạn đầu tiên init
thực thi /system/bin/e2fsck
.
Tùy chọn 2b: Phân vùng phục hồi dành riêng và không phải A/B
Sử dụng tùy chọn này cho các thiết bị có phân vùng recovery
không phải A/B; nghĩa là thiết bị có một phân vùng có tên recovery
không có hậu tố vị trí. Các thiết bị như vậy bao gồm:
- thiết bị không phải A/B;
- Các thiết bị A/B và Virtual A/B, trong đó không thể cập nhật phân vùng khôi phục. (Điều này là bất thường.)
Đĩa ram vendor_boot
chứa các bit của nhà cung cấp của các mô-đun nhân ramdisk và nhà cung cấp, bao gồm:
- Tệp
fstab
dành riêng cho thiết bị -
lib/modules
(bao gồm các mô-đun hạt nhân của nhà cung cấp)
Hình ảnh recovery
phải độc lập. Nó phải chứa tất cả các tài nguyên cần thiết để khởi động chế độ khôi phục, bao gồm:
- hình ảnh hạt nhân
- Hình ảnh DTBO
- Các mô-đun hạt nhân trong
lib/modules
- Khởi tạo giai đoạn đầu dưới dạng liên kết tượng trưng
/init -> /system/bin/init
- Nhị phân init giai đoạn hai
/system/bin/init
- Tệp
fstab
dành riêng cho thiết bị - Tất cả các tài nguyên khôi phục khác, bao gồm nhị phân
recovery
, v.v. - vân vân.
Trên các thiết bị như vậy, cấu hình sản phẩm kế thừa từ generic_ramdisk.mk
.
Đặt giá trị BAN
Đặt các giá trị sau cho thiết bị không phải 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
Khởi tạo nhị phân và liên kết tượng trưng
Đĩa ram recovery
phải chứa liên kết tượng trưng /init -> /system/bin/init
và init_second_stage.recovery
tại /system/bin/init
. Khi thiết bị khởi động vào chế độ khôi phục, tệp nhị phân /system/bin/init
là cần thiết để hỗ trợ cả init giai đoạn đầu tiên và giai đoạn thứ hai.
Khi máy boot vào recovery
, nội dung của recovery
ramdisks như sau:
-
/init -> /system/bin/init
(từ đĩa ramrecovery
) -
/system/bin/init
(từ đĩa ramrecovery
, được tạo từinit_second_stage.recovery
và được thực thi từ/init
)
Khi thiết bị khởi động vào Android, nội dung của vendor_boot
+ ramdisks chung như sau:
-
/init
(từ ramdisk, được xây dựng từinit_first_stage
)
Di chuyển tệp fstab
Di chuyển bất kỳ tệp fstab
nào đã được cài đặt vào đĩa ram chung sang đĩa ram vendor_ramdisk
và recovery
. Ví dụ, hãy tham khảo thay đổi này .
cài đặt mô-đun
Nếu muốn, bạn có thể cài đặt các mô-đun dành riêng cho thiết bị vào vendor_ramdisk
và recovery
ramdisk (bỏ qua bước này nếu bạn không có bất kỳ mô-đun dành riêng cho thiết bị nào để cài đặt). init
không chuyển root. Biến thể của các mô-đun vendor_ramdisk
cài đặt vào thư mục gốc của vendor_ramdisk
. Biến thể recovery
của các mô-đun cài đặt vào thư mục gốc của đĩa ram recovery
. Để biết ví dụ về cách cài đặt các mô-đun vào vendor_ramdisk
và recovery
ramdisk, hãy xem Tổng kiểm tra bảng điều khiển giai đoạn đầu và Siêu dữ liệu .
Bảng điều khiển giai đoạn đầu tiên
Để cài đặt biến thể vendor_ramdisk
của các mô-đun, hãy sử dụng như sau:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Điều này đảm bảo rằng linker
, sh
và toybox
cài đặt vào $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, sau đó cài đặt vào /system/bin
bên dưới vendor_ramdisk
.
Để thêm các mô-đun cần thiết cho bảng điều khiển giai đoạn đầu (ví dụ: adbd), hãy bật biến thể vendor_ramdisk
của các mô-đun này bằng cách tải các bản vá có liên quan lên AOSP, sau đó sử dụng thông tin sau:
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Điều này đảm bảo rằng các mô-đun đã chỉ định sẽ cài đặt vào $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
.
Để cài đặt biến thể recovery
của các mô-đun, hãy thay thế vendor_ramdisk
bằng recovery
:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
Tổng kiểm tra siêu dữ liệu
Để hỗ trợ tổng kiểm tra siêu dữ liệu trong quá trình gắn ở giai đoạn đầu tiên, các thiết bị không hỗ trợ GKI sẽ cài đặt biến thể đĩa ram của các mô-đun sau. Để thêm hỗ trợ cho GKI, hãy di chuyển các mô-đun tới $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Để hỗ trợ tổng kiểm tra siêu dữ liệu trong quá trình cài đặt khôi phục giai đoạn đầu tiên, hãy bật biến thể khôi phục của các mô-đun này và cài đặt chúng.
Thay đổi quá trình khởi động
Khi khởi động vào Android, quá trình khởi động không thay đổi. vendor_boot
+ ramdisk chung tương tự như quy trình khởi động hiện tại, ngoại trừ việc fstab
tải từ vendor_boot
. Bởi vì system/bin/recovery
không tồn tại, first_stage_init
xử lý nó như một khởi động bình thường.
Khi khởi động vào chế độ khôi phục, quá trình khởi động không thay đổi. Đĩa ram khôi phục được tải giống như quy trình khôi phục hiện có. Hạt nhân được tải từ hình ảnh recovery
. Quá trình khởi động cho chế độ phục hồi như sau.
Bootloader bắt đầu, sau đó thực hiện như sau:
- Đẩy ramdisk phục hồi vào
/
. - Chạy kernel từ phân vùng
recovery
.
- Đẩy ramdisk phục hồi vào
Kernel gắn ramdisk vào
/
sau đó thực thi/init
, là một liên kết tượng trưng đến/system/bin/init
từ đĩa ramrecovery
.Giai đoạn đầu tiên init bắt đầu, sau đó thực hiện như sau:
- Đặt
IsRecoveryMode() == true
vàForceNormalBoot() == false
. - Tải các mô-đun hạt nhân của nhà cung cấp từ
/lib/modules
. - Gọi
DoFirstStageMount()
nhưng bỏ qua quá trình gắn vìIsRecoveryMode() == true
. (Thiết bị không giải phóng ramdisk (vì/
vẫn như cũ) nhưng gọiSetInitAvbVersionInRecovery()
.) - Bắt đầu init giai đoạn thứ hai từ
/system/bin/init
từ đĩa ramrecovery
.
- Đặt
Dấu thời gian hình ảnh khởi động
Mã sau đây là một tệp dấu thời gian hình ảnh boot
ví dụ.
####################################
# 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
Khi xây dựng, tệp
system/etc/ramdisk/build.prop
được thêm vào đĩa ram chung. Tệp này chứa thông tin dấu thời gian của bản dựng.Khi chạy, giai đoạn đầu
init
sao chép các tệp từ ramdisk sangtmpfs
trước khi giải phóng ramdisk để giai đoạn thứ haiinit
có thể đọc tệp này để đặt thuộc tính dấu thời gian của ảnhboot
.