Trong Android 12, hình ảnh boot chung, được gọi là Hình ảnh hạt nhân chung (GKI), chứa ramdisk chung và hạt nhân GKI.
Đối với các thiết bị ra mắt cùng với Android 13, ramdisk chung sẽ bị xoá khỏi hình ảnh boot và được đặt trong hình ảnh init_boot riêng biệt. Thay đổi này chỉ để lại hình ảnh boot với nhân GKI.
Đối với các thiết bị nâng cấp tiếp tục sử dụng Android 12 hoặc các phiên bản kernel cũ hơn, ramdisk chung vẫn ở nguyên vị trí mà không cần hình ảnh init_boot mới.
Để tạo một ramdisk chung, hãy di chuyển các tài nguyên dành riêng cho nhà cung cấp ra khỏi ramdisk để ramdisk 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 những thiết bị:
Không sử dụng phân vùng
recoverychuyên dụng, tất cả các bit khôi phục sẽ di chuyển từ ramdisk chung sang ramdiskvendor_boot.Sử dụng một phân vùng
recoverychuyên dụng, không cần thay đổi ramdiskrecoveryvì ramdiskrecoverylà độc lập.
Kiến trúc
Các sơ đồ sau đây minh hoạ cấu trúc cho các thiết bị chạy Android 12 trở lên.
Thiết bị chạy Android 13 có một hình ảnh init_boot mới chứa ramdisk chung.
Các thiết bị nâng cấp từ Android 12 lên Android 13 sẽ sử dụng cùng một cấu trúc như khi dùng Android 12.
Ra mắt cùng với Android 13, không có chế độ khôi phục chuyên dụng
Hình 1. Các thiết bị ra mắt hoặc nâng cấp lên Android 13, có GKI, không có chế độ khôi phục chuyên dụng.
Ra mắt cùng Android 13, khôi phục chuyên dụng và A/B (ramdisk chuyên dụng)
Hình 2. Các thiết bị ra mắt hoặc nâng cấp lên Android 13, có GKI, chế độ khôi phục chuyên dụng và A/B.
Tham khảo hình này nếu thiết bị có các phân vùng recovery_a và recovery_b.
Ra mắt cùng Android 13, chế độ khôi phục chuyên dụng và không phải A/B (ramdisk 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, có GKI, chế độ khôi phục chuyên dụng và không phải A/B.
Tham khảo hình này nếu thiết bị có một phân vùng tên là recovery mà không có hậu tố khe cắm.
Ra mắt hoặc nâng cấp lên Android 12, không có chế độ khôi phục 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, có GKI, không có chế độ khôi phục chuyên dụng.
Khởi chạy hoặc nâng cấp lên Android 12, khôi phục chuyên dụng và A/B (ramdisk chuyên dụng)
Hình 5. Các thiết bị ra mắt hoặc nâng cấp lên Android 12, có GKI, chế độ khôi phục chuyên dụng và A/B.
Tham khảo hình này nếu thiết bị có các phân vùng recovery_a và recovery_b.
Khởi chạy hoặc nâng cấp lên Android 12, chế độ khôi phục chuyên dụng và không phải A/B (ramdisk 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, có GKI, chế độ khôi phục chuyên dụng và không phải A/B.
Tham khảo hình này nếu thiết bị có một phân vùng tên là recovery mà không có hậu tố khe cắm.
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, khôi phục dưới dạng khởi động.
Nâng cấp lên Android 12, chế độ khôi phục chuyên dụng (ramdisk chuyên dụng)
Hình 8. Các thiết bị nâng cấp lên Android 12, không có GKI, có chế độ khôi phục chuyên dụng.
Nội dung của hình ảnh khởi động
Hình ảnh khởi động Android chứa những nội dung sau.
Đã thêm hình ảnh
init_bootcho các thiết bị ra mắt cùng Android 13- Phiên bản tiêu đề V4
- Hình ảnh ổ đĩa ngẫu nhiên chung
Hình ảnh
bootchung chung- Phiên bản tiêu đề V3 hoặc V4
- Một
boot_signatuređể chứng nhận GKI boot.img (chỉ phiên bản 4). GKIboot.imgđược chứng nhận không được ký cho quy trình khởi động đã xác minh. Nhà sản xuất thiết bị gốc vẫn phải kýboot.imgđược tạo sẵn bằng khoá AVB dành riêng cho thiết bị. - Tổng quát
cmdline(GENERIC_KERNEL_CMDLINE) - Nhân GKI
- Một
- Hình ảnh ramdisk chung
- Chỉ có trong hình ảnh
boottừ Android 12 trở xuống
- Chỉ có trong hình ảnh
- Phiên bản tiêu đề V3 hoặc V4
vendor_boothình ảnh (để biết thông tin chi tiết, hãy xem Phân vùng khởi động của nhà cung cấp)vendor_boottiêu đề- Thông tin cụ thể theo thiết bị
cmdline(BOARD_KERNEL_CMDLINE)
- Thông tin cụ thể theo thiết bị
vendor_boothình ảnh ổ đĩa ngẫu nhiênlib/modules- Tài nguyên khôi phục (nếu không có quy trình khôi phục chuyên dụng)
dtbhình ảnh
recoveryhình ảnh- Tiêu đề phiên bản V2
cmdlinedà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; hãy xem Hình ảnh khôi phục. Ví dụ:
cmdlinekhông được nối vớibootvàvendor_bootcmdline.- Tiêu đề chỉ định DTBO khôi phục (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 luận từ
bootvàvendor_boot. Ví dụ: cmdlineđược nối vớibootvàvendor_bootcmdline.- DTBO có thể được suy ra từ tiêu đề
vendor_boot.
recoveryhình ảnh ổ đĩa ngẫu nhiên- Tài nguyên khôi phục
- Đối với phân vùng khôi phục không phải A/B, nội dung của ramdisk phải độc lập; hãy xem Hình ảnh khôi phục. Ví dụ:
lib/modulesphả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 khôi phục phải chứa
init. - Đối với phân vùng khôi phục A/B, ramdisk khôi phục được thêm vào trước ramdisk chung và
vendor_boot, do đó, ramdisk này không cần phải độc lập. Ví dụ: lib/modulescó thể chỉ chứa các mô-đun hạt nhân bổ sung cần thiết để khởi động chế độ khôi phục ngoài các mô-đun hạt nhân trong ramdiskvendor_boot.- Symlink tại
/initcó thể tồn tại, nhưng sẽ bị che khuất bởi tệp nhị phân/initở giai đoạn đầu trong hình ảnh khởi động.
- Tiêu đề phiên bản V2
Nội dung hình ảnh ổ đĩa RAM chung
Ramdisk chung chứa các thành phần sau.
initsystem/etc/ramdisk/build.propro.PRODUCT.bootimg.* buildđạo cụ- Thư mục trống cho điểm gắn kết:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/ first_stage_ramdisk/- Các thư mục trống trùng lặp cho điểm gắn kết:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
- Các thư mục trống trùng lặp cho điểm gắn kết:
Tích hợp hình ảnh khởi động
Cờ dựng kiểm soát cách dựng hình ảnh init_boot, boot, recovery và vendor_boot. Giá trị của biến bảng boolean phải là chuỗi true hoặc là chuỗi trống (đây 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 được tạo sẵn hay không. Nếu bạn đặt biến này thànhtrue, hãy đặtBOARD_PREBUILT_BOOTIMAGEthành vị trí của hình ảnh khởi động được tạo 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 ảnhrecoverylàm hình ảnhboothay không. Khi sử dụng GKI, biến này sẽ trống và các tài nguyên khôi phục cần được chuyển sangvendor_boot.BOARD_USES_GENERIC_KERNEL_IMAGE. Biến này cho biết 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 độ bo mạch; tất cả các biến sau đây đều bị biến này hạn chế.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. Biến này kiểm soát việc các tài nguyên khôi phục ramdisk có được tạo thànhvendor_boothay không.Khi được đặt thành
true, các tài nguyên khôi phục chỉ được tạo thànhvendor-ramdisk/và không được tạo thànhrecovery/root/.Khi trống, các tài nguyên khôi phục chỉ được tạo cho
recovery/root/và không được tạo chovendor-ramdisk/.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. Biến này kiểm soát việc các khoá GSI AVB có được tạo chovendor_boothay không.Khi được đặt thành
true, nếuBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:Được đặt, các khoá GSI AVB được tạo thành
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb.Chưa đặt, các khoá 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 khoá GSI AVB được tạo thành
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb.Chưa đặt, các khoá 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 việc hình ảnhrecoverycó chứa một hạt nhân hay không. Các thiết bị chạy Android 12 và sử dụng phân vùng A/Brecoveryphải đặt biến này thànhtrue. Các thiết bị khởi chạy bằng Android 12 và sử dụng phiên bản không phải A/B phải đặt biến này thànhfalseđể giữ cho 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 việc$OUT/boot*.imgcó được sao chép vàoIMAGES/trong các tệp đích hay không.aosp_arm64phả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 việcinit_boot.imgcó được tạo hay không và đặt kích thước. Khi được đặt, ramdisk chung sẽ được thêm vàoinit_boot.imgthay vìboot.imgvà yêu cầu bạn đặt các biếnBOARD_AVB_INIT_BOOT*cho vbmeta được liên kết.
Các kiểu kết hợp được phép
| Thành phần hoặc biến | Nâng cấp thiết bị mà không có phân vùng khôi phục | Nâng cấp thiết bị có phân vùng khôi phục | Khởi động thiết bị mà không có phân vùng khôi phục | Khởi chạy thiết bị bằng phân vùng khôi phục A/B | Khởi động thiết bị có phân vùng khôi phục không phải A/B | aosp_arm64 |
|---|---|---|---|---|---|---|
Có chứa boot |
có | có | có | có | có | có |
Chứa init_boot (Android 13) |
không | không | có | có | có | có |
Có chứa vendor_boot |
tùy chọn | tùy chọn | có | có | có | không |
Có chứa recovery |
không | có | không | có | có | 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 bạn đặt BOARD_RECOVERYIMAGE_PARTITION_SIZE, thì một hình ảnh recovery sẽ được tạo.
Bật vbmeta được liên kết để khởi động
Bạn phải bật vbmeta được liên kết cho hình ảnh boot và init_boot. Nêu rõ những thông tin 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
Để biết ví dụ, hãy tham khảo thay đổi này.
Hệ thống dưới dạng gốc
Không hỗ trợ hệ thống dưới dạng gốc cho các thiết bị sử dụng GKI. Trên các thiết bị như vậy, BOARD_BUILD_SYSTEM_ROOT_IMAGE phải trống. System-as-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 ramdisk chung phải cài đặt danh sách các tệp được phép cài đặt vào ramdisk. Để làm vậy, hãy chỉ định các thuộc tính sau trong device.mk:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Tệp generic_ramdisk.mk cũng ngăn các tệp makefile khác vô tình cài đặt các tệp khác vào ramdisk (thay vào đó, hãy di chuyển các tệp như vậy sang vendor_ramdisk).
Thiết lập thiết bị
Hướng dẫn thiết lập sẽ khác nhau giữa các thiết bị ra mắt bằng Android 13, nâng cấp lên Android 12 và ra mắt bằng Android 12. Android 13, được thiết lập tương tự như Android 12
Thiết bị nâng cấp lên Android 12:
Có thể giữ lại giá trị của
BOARD_USES_RECOVERY_AS_BOOT. Nếu làm như vậy, họ đang sử dụng các 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ị đó:Có thể đặt
BOARD_USES_RECOVERY_AS_BOOTthành trống. Nếu làm như vậy, họ đang sử dụng cấu hình mới. Nếu các thiết bị đó:Không sử dụng phân vùng
recoverychuyên dụng, cấu trúc như minh hoạ trong Hình 1 và lựa chọn thiết lập thiết bị là Lựa chọn 1.Sử dụng một phân vùng
recoverychuyên dụng, cấu trúc như trong Hình 2a hoặc Hình 2b và lựa chọn thiết lập thiết bị là Lựa chọn 2a hoặc Lựa chọn 2b.
Các thiết bị chạy Android 12 phải đặt
BOARD_USES_RECOVERY_AS_BOOTthành trống và sử dụng cấu hình mới. Nếu các thiết bị đó:Không sử dụng phân vùng
recoverychuyên dụng, cấu trúc như trong Hình 1 và lựa chọn thiết lập thiết bị là Lựa chọn 1.Sử dụng một phân vùng
recoverychuyên dụng, cấu trúc như trong Hình 2a hoặc Hình 2b và lựa chọn thiết lập thiết bị là Lựa chọn 2a hoặc Lựa chọn 2b.
Vì aosp_arm64 chỉ tạo GKI (chứ không phải vendor_boot hoặc quy trình khôi phục), nên đây không phải là mục tiêu hoàn chỉnh. Đối với cấu hình bản dựng aosp_arm64, hãy tham khảo generic_arm64.
Phương án 1: Không có phân vùng khôi phục chuyên dụng
Các thiết bị không có phân vùng recovery sẽ chứa hình ảnh boot chung trong phân vùng boot. Ramdisk vendor_boot chứa tất cả các tài nguyên khôi phục, bao gồm cả lib/modules (với các mô-đun kernel của nhà cung cấp). Trên những thiết bị như vậy, cấu hình sản phẩm sẽ kế thừa từ generic_ramdisk.mk.
Đặt giá trị BOARD
Đặ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 động tệp nhị phân và đường liên kết tượng trưng
Ramdisk vendor_boot có thể chứa một đường 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ì ramdisk chung được nối sau ramdisk vendor_boot, nên symlink /init sẽ bị ghi đè. Khi thiết bị khởi động vào chế độ khôi phục, cần có tệp nhị phân /system/bin/init để hỗ trợ quá trình khởi động giai đoạn thứ hai. Nội dung của vendor_boot + ramdisk chung như sau:
/init(từ ramdisk chung, được tạo từinit_first_stage)/system/bin/init(từvendor_ramdisk, được tạo từinit_second_stage.recovery)
Di chuyển tệp fstab
Di chuyển mọi tệp fstab đã cài đặt vào ramdisk chung sang vendor_ramdisk. Để biết ví dụ, hãy tham khảo thay đổi này.
Cài đặt mô-đun
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ó mô-đun dành riêng cho thiết bị nào để cài đặt).
Sử dụng biến thể
vendor_ramdiskcủa mô-đun khi mô-đun cài đặt vào/first_stage_ramdisk. Bạn có thể sử dụng mô-đun này sau khiinitchuyển gốc thành/first_stage_ramdisknhưng trước khiinitchuyển gốc thành/system. Để xem ví dụ, hãy xem phần Tổng kiểm tra siêu dữ liệu và Nén A/B ảo.Sử dụng biến thể
recoverycủa mô-đun khi mô-đun cài đặt vào/. Mô-đun này phải có sẵn trước khiinitchuyển gốc thành/first_stage_ramdisk. Để biết thông tin chi tiết về cách cài đặt các mô-đun vào/, hãy xem phần Bảng điều khiển giai đoạn đầu tiên.
Bảng điều khiển giai đoạn đầu
Vì bảng điều khiển giai đoạn đầu tiên bắt đầu trước khi init chuyển gốc thành /first_stage_ramdisk, 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 vào build/make/target/product/base_vendor.mk, vì vậy, nếu makefile của thiết bị kế thừa từ tệp đó, 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 dùng lệnh sau.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
Điều này đảm bảo rằng linker, sh và toybox sẽ cài đặt vào $ANDROID_PRODUCT_OUT/recovery/root/system/bin, sau đó cài đặt vào /system/bin trong 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 dùng các mô-đun sau.
PRODUCT_PACKAGES += adbd.recovery
Điều này đảm bảo rằng các mô-đun được chỉ định sẽ cài đặt vào $ANDROID_PRODUCT_OUT/recovery/root/system/bin, sau đó cài đặt vào /system/bin trong vendor_ramdisk.
Tổng kiểm tra siêu dữ liệu
Để hỗ trợ các tổng kiểm tra siêu dữ liệu trong quá trình gắn giai đoạn đầu, những thiết bị không hỗ trợ GKI sẽ cài đặt biến thể ramdisk của các mô-đun sau. Để thêm tính năng hỗ trợ cho GKI, hãy di chuyển các mô-đun đến $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ợ tính năng nén A/B ảo, bạn phải cài đặt snapuserd vào vendor_ramdisk. Thiết bị sẽ kế thừa từ virtual_ab_ota/compression.mk, cài đặt biến thể vendor_ramdisk của snapuserd.
Thay đổi đối với quy trình khởi động
Quá trình khởi động vào chế độ khôi phục hoặc vào Android không thay đổi, ngoại trừ trường hợp sau:
- Ramdisk
build.propchuyển sang/second_stage_resourcesđểinitgiai đoạn thứ hai có thể đọc dấu thời gian của bản dựng khi khởi động.
Vì các tài nguyên di chuyển từ ramdisk chung sang ramdisk vendor_boot, nên kết quả của việc nối ramdisk chung với ramdisk vendor_boot không thay đổi.
Cung cấp e2fsck
Các tệp makefile của thiết bị có thể kế thừa từ:
virtual_ab_ota/launch_with_vendor_ramdisk.mknếu thiết bị hỗ trợ A/B ảo nhưng không hỗ trợ nén.virtual_ab_ota/compression.mknếu thiết bị hỗ trợ tính năng nén A/B ảo.
Các tệp make của sản phẩm sẽ cài đặt $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck. Tại thời gian chạy, giai đoạn đầu tiên init chuyển đổi gốc thành /first_stage_ramdisk rồi thực thi /system/bin/e2fsck.
Lựa chọn 2a: Phân vùng khôi phục chuyên dụng và A/B
Sử dụng lựa chọn này cho các thiết bị có phân vùng A/B recovery; tức là thiết bị có recovery_a và recovery_b partition. Các thiết bị như vậy bao gồm thiết bị A/B và thiết bị A/B ảo có phân vùng khôi phục có thể cập nhật, với cấu hình sau:
AB_OTA_PARTITIONS += recovery
Ramdisk vendor_boot chứa các bit của nhà cung cấp trong ramdisk và các mô-đun kernel của nhà cung cấp, bao gồm cả những mô-đun sau:
Tệp
fstabdành riêng cho thiết bịlib/modules(bao gồm các mô-đun nhân của nhà cung cấp)
Ramdisk recovery chứa tất cả tài nguyên khôi phục. Trên những thiết bị như vậy, cấu hình sản phẩm sẽ kế thừa từ generic_ramdisk.mk.
Đặt giá trị BOARD
Đặt các giá trị sau cho những thiết bị có phân vùng 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
Khởi động tệp nhị phân và đường liên kết tượng trưng
Ramdisk recovery có thể chứa một symlink /init -> /system/bin/init và init_second_stage.recovery tại /system/bin/init. Tuy nhiên, vì ramdisk khởi động được nối sau ramdisk recovery, nên symlink /init sẽ bị ghi đè. Khi thiết bị khởi động ở chế độ khôi phục, cần có tệp nhị phân /system/bin/init để hỗ trợ giai đoạn khởi động thứ hai.
Khi thiết bị khởi động vào recovery, nội dung của recovery + vendor_boot + ramdisk chung sẽ như sau:
/init(từ ramdisk, được tạo từinit_first_stage)/system/bin/init(từ ramdiskrecovery, được tạo từinit_second_stage.recoveryvà thực thi từ/init)
Khi thiết bị khởi động vào Android, nội dung của vendor_boot + ramdisk chung sẽ như sau:
/init(từ ramdisk chung, được tạo từinit_first_stage)
Di chuyển tệp fstab
Di chuyển mọi tệp fstab đã cài đặt vào ramdisk chung sang vendor_ramdisk. Để biết ví dụ, hãy tham khảo thay đổi này.
Cài đặt mô-đun
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ó mô-đun dành riêng cho thiết bị nào để cài đặt). Init
không chuyển đổi gốc. Biến thể vendor_ramdisk của các mô-đun sẽ cài đặt vào gốc của vendor_ramdisk. Để xem 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
Để cài đặt biến thể vendor_ramdisk của các mô-đun, hãy dùng lệ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 sẽ cài đặt vào $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, sau đó cài đặt vào /system/bin trong 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 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 các mô-đun sau,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Điều này đảm bảo rằng các mô-đun được chỉ định sẽ cài đặt vào $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin. Nếu vendor_boot ramdisk được tải ở chế độ khôi phục, thì mô-đun này cũng có trong recovery. Nếu vendor_boot ramdisk không được tải ở chế độ khôi phục, thì thiết bị cũng có thể tuỳ ý cài đặt adbd.recovery.
Tổng kiểm tra siêu dữ liệu
Để hỗ trợ các tổng kiểm tra siêu dữ liệu trong quá trình gắn giai đoạn đầu, những thiết bị không hỗ trợ GKI sẽ cài đặt biến thể ramdisk của các mô-đun sau. Để thêm tính năng hỗ trợ cho GKI, hãy di chuyển các mô-đun đến $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ợ tính năng nén A/B ảo, bạn phải cài đặt snapuserd vào vendor_ramdisk. Thiết bị sẽ kế thừa từ virtual_ab_ota/compression.mk, cài đặt biến thể vendor_ramdisk của snapuserd.
Thay đổi đối với quy trình khởi động
Khi khởi động vào Android, quy trình khởi động sẽ không thay đổi. vendor_boot + ramdisk chung tương tự như quy trình khởi động hiện có, ngoại trừ việc fstab tải từ vendor_boot. Vì system/bin/recovery không tồn tại, nên first_stage_init sẽ xử lý yêu cầu này như một quy trình khởi động thông thường.
Khi khởi động vào chế độ khôi phục, quy trình khởi động sẽ thay đổi. Quy trình khôi phục + vendor_boot + ramdisk chung tương tự như quy trình khôi phục hiện có, nhưng nhân được tải từ hình ảnh boot thay vì từ hình ảnh recovery.
Quy trình khởi động cho chế độ khôi phục diễn ra như sau.
Trình tải khởi động bắt đầu, sau đó thực hiện những thao tác sau:
- Đẩy quá trình khôi phục +
vendor_boot+ ramdisk chung đến/. (Nếu OEM sao chép các mô-đun kernel trong ramdisk khôi phục bằng cách thêm chúng vàoBOARD_RECOVERY_KERNEL_MODULES, thìvendor_bootlà không bắt buộc.) - Chạy nhân từ phân vùng
boot.
- Đẩy quá trình khôi phục +
Nhân gắn ramdisk vào
/rồi thực thi/inittừ ramdisk chung.Giai đoạn khởi động đầu tiên bắt đầu, sau đó thực hiện những việc sau:
- Đặt
IsRecoveryMode() == truevà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 việc gắn vìIsRecoveryMode() == true. (Thiết bị không giải phóng ramdisk (vì/vẫn giữ nguyên) nhưng sẽ gọiSetInitAvbVersionInRecovery().) - Bắt đầu giai đoạn khởi động thứ hai từ
/system/bin/inittừ ramdiskrecovery.
- Đặt
Cung cấp e2fsck
Các tệp makefile của thiết bị có thể kế thừa từ:
virtual_ab_ota/launch_with_vendor_ramdisk.mknếu thiết bị hỗ trợ A/B ảo nhưng không hỗ trợ nén.virtual_ab_ota/compression.mknếu thiết bị hỗ trợ tính năng nén A/B ảo.
Các tệp make của sản phẩm sẽ cài đặt $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck. Tại thời gian chạy, giai đoạn đầu tiên init thực thi /system/bin/e2fsck.
Lựa chọn 2b: Phân vùng khôi phục chuyên dụng và không phải A/B
Sử dụng lựa chọn này cho các thiết bị có phân vùng recovery không phải A/B; tức là thiết bị có một phân vùng tên là recovery mà không có hậu tố khe cắm. Các thiết bị như vậy bao gồm:
- thiết bị không phải A/B;
- Thiết bị A/B và Virtual A/B, trong đó phân vùng khôi phục không thể cập nhật. (Đây là điều bất thường.)
Ramdisk vendor_boot chứa các bit của nhà cung cấp trong ramdisk và các mô-đun kernel của nhà cung cấp, bao gồm cả những mô-đun sau:
- Tệp
fstabdành riêng cho thiết bị lib/modules(bao gồm các mô-đun nhân của nhà cung cấp)
Hình ảnh recovery phải độc lập. Phân vùng này 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 nhân
- Hình ảnh DTBO
- Mô-đun kernel trong
lib/modules - Giai đoạn khởi động đầu tiên dưới dạng một symlink
/init -> /system/bin/init - Tệp nhị phân init giai đoạn thứ hai
/system/bin/init - Tệp
fstabdà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 cả tệp nhị phân
recovery
Trên những thiết bị như vậy, cấu hình sản phẩm sẽ kế thừa từ generic_ramdisk.mk.
Đặt giá trị BOARD
Đặ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 động tệp nhị phân và đường liên kết tượng trưng
Ramdisk recovery phải chứa một symlink /init -> /system/bin/init và init_second_stage.recovery tại /system/bin/init. Khi thiết bị khởi động ở chế độ khôi phục, cần có tệp nhị phân /system/bin/init để hỗ trợ cả giai đoạn đầu và giai đoạn thứ hai của quá trình khởi động.
Khi thiết bị khởi động vào recovery, nội dung của ramdisk recovery sẽ như sau:
/init -> /system/bin/init(từ ramdiskrecovery)/system/bin/init(từ ramdiskrecovery, được tạo từinit_second_stage.recoveryvà thực thi từ/init)
Khi thiết bị khởi động vào Android, nội dung của vendor_boot + ramdisk chung sẽ như sau:
/init(từ ramdisk, được tạo từinit_first_stage)
Di chuyển tệp fstab
Di chuyển mọi tệp fstab đã cài đặt vào ramdisk chung sang ramdisk vendor_ramdisk và recovery. Để biết ví dụ, hãy tham khảo thay đổi này.
Cài đặt mô-đun
Bạn có thể cài đặt các mô-đun dành riêng cho thiết bị vào vendor_ramdisk và ramdisk recovery (bỏ qua bước này nếu bạn không có mô-đun dành riêng cho thiết bị nào để cài đặt). init
không chuyển đổi gốc. Biến thể vendor_ramdisk của các mô-đun sẽ cài đặt vào gốc của vendor_ramdisk. Biến thể recovery của các mô-đun sẽ cài đặt vào gốc của ramdisk 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 Bảng điều khiển giai đoạn đầu tiên và Tổng kiểm tra siêu dữ liệu.
Bảng điều khiển giai đoạn đầu
Để cài đặt biến thể vendor_ramdisk của các mô-đun, hãy dùng lệ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 sẽ cài đặt vào $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, sau đó cài đặt vào /system/bin trong 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 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 các mô-đun sau,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Điều này đảm bảo rằng các mô-đun được 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ợ các tổng kiểm tra siêu dữ liệu trong quá trình gắn giai đoạn đầu, những thiết bị không hỗ trợ GKI sẽ cài đặt biến thể ramdisk của các mô-đun sau. Để thêm tính năng hỗ trợ cho GKI, hãy di chuyển các mô-đun đến $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 gắn kết giai đoạn đầu khi khôi phục, 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 đối với quy trình khởi động
Khi khởi động vào Android, quy trình khởi động sẽ không thay đổi. vendor_boot + ramdisk chung tương tự như quy trình khởi động hiện có, ngoại trừ việc fstab tải từ vendor_boot. Vì system/bin/recovery không tồn tại, nên first_stage_init sẽ xử lý yêu cầu này như một quy trình khởi động thông thường.
Khi khởi động vào chế độ khôi phục, quy trình khởi động sẽ không thay đổi. Ramdisk khôi phục được tải theo cách tương tự như quy trình khôi phục hiện có.
Nhân được tải từ hình ảnh recovery. Quy trình khởi động cho chế độ khôi phục diễn ra như sau.
Trình tải khởi động bắt đầu, sau đó thực hiện những thao tác sau:
- Đẩy ổ đĩa RAM khôi phục đến
/. - Chạy nhân từ phân vùng
recovery.
- Đẩy ổ đĩa RAM khôi phục đến
Nhân gắn ramdisk vào
/rồi thực thi/init, đây là một đường liên kết tượng trưng đến/system/bin/inittừ ramdiskrecovery.Giai đoạn khởi động đầu tiên bắt đầu, sau đó thực hiện những việc sau:
- Đặt
IsRecoveryMode() == truevà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 việc gắn vìIsRecoveryMode() == true. (Thiết bị không giải phóng ramdisk (vì/vẫn giữ nguyên) nhưng sẽ gọiSetInitAvbVersionInRecovery().) - Bắt đầu giai đoạn khởi động thứ hai từ
/system/bin/inittừ ramdiskrecovery.
- Đặt
Dấu thời gian của hình ảnh khởi động
Đoạn mã sau đây là ví dụ về tệp dấu thời gian hình ảnh 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
Tại thời điểm tạo bản dựng, một tệp
system/etc/ramdisk/build.propsẽ được thêm vào ramdisk chung. Tệp này chứa thông tin về dấu thời gian của bản dựng.Trong thời gian chạy, giai đoạn đầu tiên
initsao chép các tệp từ ramdisk sangtmpfstrước khi giải phóng ramdisk để giai đoạn thứ haiinitcó thể đọc tệp này để đặt các thuộc tính dấu thời gian hình ảnhboot.