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à nhân GKI.
Đối với các thiết bị chạy Android 13, thuộc tính chung
ramdisk bị xoá khỏi hình ảnh boot
và được đặt trong một init_boot
riêng
hình ảnh. Thay đổi này khiến hình ảnh boot
chỉ có
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 giữ nguyên vị trí cũ
không bắt buộc đối với hình ảnh init_boot
mới.
Để tạo ổ đĩa ram chung, hãy chuyển các tài nguyên dành riêng cho nhà cung cấp ra khỏi ổ đĩa ram
sao cho ramdisk chung chỉ chứa init
giai đoạn đầu tiên và một thuộc tính
chứa thông tin về 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ả bit khôi phục sẽ di chuyển từ ramdisk chung cho ramdiskvendor_boot
.Sử dụng một phân vùng
recovery
chuyên dụng, không thay đổi ổ đĩa RAMrecovery
vì ramdiskrecovery
độc lập.
Kiến trúc
Các biểu đồ sau 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 ra mắt có một
Hình ảnh init_boot
chứa ổ đĩa ram chung.
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ư với
Android 12.
Khởi chạy với Android 13 mà không cần khôi phục riêng
Hình 1. Thiết bị chạy hoặc nâng cấp lên Android 13 có GKI, không có yêu cầu khôi phục chuyên dụng.
Khởi chạy bằng Android 13, khôi phục A/B chuyên dụng và (đĩa RAM chuyên dụng)
Hình 2. Thiết bị chạy hoặc nâng cấp lên Android 13 có GKI, chuyên dụng và khôi phục 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 bằng Android 13, khôi phục chuyên dụng và không phải A/B (đĩa ram chuyên dụng)
Hình 3. Thiết bị chạy hoặc nâng cấp lên Android 13 có GKI, tính năng khôi phục chuyên dụng và không áp dụng phương thức khôi phục A/B.
Tham khảo hình này nếu thiết bị có phân vùng có tên recovery
mà không có
hậu tố vị trí.
Khởi chạy hoặc nâng cấp lên Android 12 mà không cần khôi phục riêng
Hình 4. Thiết bị chạy hoặc nâng cấp lên Android 12 có GKI, không có yêu cầu 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 A/B chuyên dụng và khôi phục A/B (đĩa RAM chuyên dụng)
Hình 5. Thiết bị chạy hoặc nâng cấp lên Android 12 có GKI, chuyên dụng và khôi phục 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, khôi phục chuyên dụng và không A/B (đĩa ramdisk chuyên dụng)
Hình 6. Thiết bị chạy hoặc nâng cấp lên Android 12 có GKI, tính năng khôi phục chuyên dụng và không áp dụng phương thức khôi phục A/B.
Tham khảo hình này nếu thiết bị có phân vùng có tên recovery
mà không có
hậu tố vị trí.
Nâng cấp lên Android 12, khôi phục khi khởi động (recovery-as-ramdisk)
Hình 7. Thiết bị nâng cấp lên Android 12, không có GKI, khôi phục khi khởi động.
Nâng cấp lên Android 12, khôi phục chuyên dụng (đĩa ram chuyên dụng)
Hình 8. Thiết bị nâng cấp lên Android 12, không có GKI, tính năng khôi phục chuyên dụng.
Nội dung hình ảnh khởi động
Hình ảnh khởi động Android chứa nội dung sau.
Đã thêm
init_boot
hình ảnh cho các thiết bị chạy Android 13- Phiên bản tiêu đề V4
- Hình ảnh ổ đĩa RAM chung
Hình ảnh
boot
chung chung- Phiên bản tiêu đề V3 hoặc
Phiên bản 4
boot_signature
dành cho chứng nhận boot.img của GKI (chỉ phiên bản 4). Chiến lược phát hành đĩa đơn GKIboot.img
được chứng nhận chưa được ký để xác minh quy trình khởi động. OEM vẫn phải kýboot.img
tạo sẵn bằng thiết bị dành riêng cho bạn AVB .cmdline
(GENERIC_KERNEL_CMDLINE
) chung- Nhân GKI
- Hình ảnh ổ đĩa RAM chung
- Chỉ có trong
boot
hình ảnh trên Android 12 và sớm hơn
- Chỉ có trong
- Phiên bản tiêu đề V3 hoặc
Phiên bản 4
Hình ảnh
vendor_boot
(để biết chi tiết, hãy xem phần Khởi động nhà cung cấp Vách ngăn)- 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 khôi phục (nếu không có tính năng khôi phục chuyên dụng)
- Hình ảnh
dtb
- Tiêu đề
Hình ảnh
recovery
- Tiêu đề phiên bản 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 là độ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 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 ra
từ
boot
vàvendor_boot
. Ví dụ: cmdline
được nối vớiboot
vàvendor_boot
cmdline
.- Có thể suy ra DTBO từ tiêu đề
vendor_boot
.
- Hình ảnh ổ đĩa RAM
recovery
- 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 ổ đĩa ram phải độc lập; xem Hình ảnh khôi phục. Ví dụ:
lib/modules
phải chứa tất cả các mô-đun nhân cần thiết để khởi động chế độ khôi phục- Ổ đĩa RAM khôi phục phải chứa
init
. - Đối với phân vùng khôi phục A/B, ổ đĩa ram khôi phục được thêm vào trước phần tử
chung và
vendor_boot
ramdisk, do đó, nó không cần phải là một cách độc lập. Ví dụ: lib/modules
có thể chỉ chứa các mô-đun nhân bổ sung cần thiết để khởi động chế độ khôi phục bên cạnh các mô-đun nhân hệ điều hành trong ramdiskvendor_boot
.- Đường liên kết tượng trưng tại
/init
có thể tồn tại, nhưng bị lu mờ bởi tệp nhị phân/init
giai đoạn đầu tiên trong hình ảnh khởi động.
- Tiêu đề phiên bản V2
Nội dung hình ảnh chung trên ổ đĩa RAM
Ổ đĩa RAM thông thường chứa các thành phần sau.
init
system/etc/ramdisk/build.prop
- Đạo cụ
ro.PRODUCT.bootimg.* build
- Các thư mục trống cho điểm gắn:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
first_stage_ramdisk/
- Các thư mục trống trùng lặp cho các điểm gắn:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- Các thư mục trống trùng lặp cho các điểm gắn:
Tích hợp hình ảnh khởi động
Cờ bản dựng kiểm soát cách init_boot
, boot
, recovery
và vendor_boot
tạo hình ảnh. Giá trị của biến bảng boolean phải là chuỗi
true
hoặc để trống (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 tính năng khởi động tạo sẵn hay không hình ảnh. Nếu bạn đặt biến này thànhtrue
, hãy đặtBOARD_PREBUILT_BOOTIMAGE
vào vị trí của hình ảnh khởi động 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ị sử dụng hình ảnhrecovery
làm hình ảnhboot
. Khi sử dụng GKI, biến này là trống và tài nguyên khôi phục phải được chuyển sangvendor_boot
.BOARD_USES_GENERIC_KERNEL_IMAGE
. Biến này cho biết rằng hội đồng quản trị 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 sau đây 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 việc tài nguyên khôi phục ramdisk được tạo chovendor_boot
.Khi bạn đặt thành
true
, tài nguyên khôi phục chỉ được tạo thànhvendor-ramdisk/
và không được tạo chorecovery/root/
.Khi trống, tài nguyên khôi phục chỉ được tạo cho
recovery/root/
và không được tạo được tạo chovendor-ramdisk/
.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
. Biến này kiểm soát việc GSI Khoá AVB được tích hợp vàovendor_boot
.Khi đặt là
true
, nếuBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
:Đã đặt, các khoá AVB của GSI được tích hợp
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
.Bạn chưa đặt chính sách này, các khoá AVB của GSI được tích hợp
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
.
Khi trống, nếu
BOARD_RECOVERY_AS_ROOT
:Đã đặt, các khoá AVB của GSI được tích hợp
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
.Bạn chưa đặt chính sách này, các khoá AVB của GSI được tích hợp
$ANDROID_PRODUCT_OUT/ramdisk/avb
.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
. Biến này kiểm soát việc Hình ảnhrecovery
có chứa hạt nhân hoặc không. Thiết bị chạy Android 12 và sử dụng phân vùng A/Brecovery
phải đặt phân vùng này thànhtrue
. Thiết bị chạy Android 12 và sử dụng mã không phải A/B phải đặt biến này thànhfalse
để giữ lại 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*.img
được sao chép vàoIMAGES/
trong các tệp đích.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 việcinit_boot.img
được tạo và đặt kích thước. Khi được đặt, ổ đĩa RAM thông thường được thêm vàoinit_boot.img
thay vìboot.img
và yêu cầu Cần đặt biếnBOARD_AVB_INIT_BOOT*
vbmeta theo chuỗi.
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ần phân vùng khôi phục | Nâng cấp thiết bị bằng phân vùng khôi phục | Chạy 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 chạy 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ó thể đặt các thiết bị có phân vùng recovery
riêng
PRODUCT_BUILD_RECOVERY_IMAGE
thành true
hoặc để trống. Đối với các thiết bị này, nếu
Đã đặt BOARD_RECOVERYIMAGE_PARTITION_SIZE
, hình ảnh recovery
sẽ được tạo.
Bật vbmeta theo chuỗi để khởi động
Bạn phải bật vbmeta theo chuỗi cho hình ảnh boot
và init_boot
. Nêu rõ
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
Để xem ví dụ, hãy tham khảo này thay đổi.
Hệ thống dưới dạng gốc
Không hỗ trợ chế độ hệ thống dưới dạng thư mục gốc đối với các thiết bị sử dụng GKI. Bật
thiết bị như vậy, thì BOARD_BUILD_SYSTEM_ROOT_IMAGE
phải trống. Hệ thống dưới dạng gốc
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
Thiết bị dùng ramdisk chung phải cài đặt một danh sách các tệp
được phép cài đặt vào ổ đĩa RAM. Để thực hiện việc này, hãy chỉ định nội dung sau trong
device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Tệp generic_ramdisk.mk
cũng giúp ngăn chặn các tệp make khác vô tình bị vô tình
cài đặt các tệp khác vào ramdisk (di chuyển các tệp đó sang vendor_ramdisk
thay thế).
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ị chạy Android 13, nâng cấp lên Android 12 và ra mắt cù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ữ nguyên giá trị của
BOARD_USES_RECOVERY_AS_BOOT
. Nếu họ làm như vậy, các thiết bị đó đang sử dụng cấu hình cũ và biến thể bản dựng mới phải trống. Nếu có thiết bị:Có thể đặt
BOARD_USES_RECOVERY_AS_BOOT
thành trống. Nếu có, tức là họ đang sử dụng các cấu hình mới. Nếu các thiết bị này:
Bạn phải đặt các thiết bị chạy Android 12
BOARD_USES_RECOVERY_AS_BOOT
để trống và sử dụng cấu hình mới. Nếu có thiết bị:Không sử dụng phân vùng
recovery
chuyên dụng, cấu trúc như minh hoạ trong Hình 1 và tuỳ chọn thiết lập thiết bị là Lựa chọn 1.Sử dụng phân vùng
recovery
chuyên dụng, cấu trúc như minh hoạ trong Hình 2a hoặc Hình 2b và cách thiết lập thiết bị là Lựa chọn 2a hoặc Cách 2b.
Vì aosp_arm64
chỉ tạo GKI (không phải vendor_boot
hoặc tính năng khôi phục) nên ứng dụng này
chưa phải là một mục tiêu hoàn chỉnh. Đối với aosp_arm64
cấu hình bản dựng, hãy tham khảo
generic_arm64
.
Tùy chọ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
chứa hình ảnh boot
chung trong
Phân vùng boot
. Ổ đĩa vendor_boot
chứa tất cả tài nguyên khôi phục,
bao gồm lib/modules
(với các mô-đun nhân của nhà cung cấp). Trên các thiết bị này,
cấu hình sản phẩm kế thừa từ
generic_ramdisk.mk
.
Đặt giá trị Board
Thiết lập 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 tệp nhị phân và liên kết tượng trưng
Ổ đĩa RAM vendor_boot
có thể chứa đường liên kết tượng trưng /init
đến /system/bin/init
,
và init_second_stage.recovery
lúc /system/bin/init
. Tuy nhiên, vì
ramdisk chung được nối sau ramdisk vendor_boot
, /init
đường liên kết tượng trưng đã bị ghi đè. Khi thiết bị khởi động vào quá trình khôi phục,
Cần có tệp nhị phân /system/bin/init
để hỗ trợ khởi tạo giai đoạn hai. Nội dung
của vendor_boot
+ ổ đĩa ram chung như sau:
/init
(từ ramdisk chung, tạo bằnginit_first_stage
)/system/bin/init
(từvendor_ramdisk
, tạo từinit_second_stage.recovery
)
Di chuyển tệp fstab
Di chuyển mọi tệp fstab
đã được cài đặt vào ổ đĩa ram chung sang
vendor_ramdisk
. Để xem ví dụ, hãy tham khảo này
thay đổi.
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_ramdisk
của mô-đun khi mô-đun cài đặt để/first_stage_ramdisk
. Mô-đun này sẽ có sau ngàyinit
chuyển thư mục gốc thành/first_stage_ramdisk
nhưng trước khiinit
chuyển sang gốc/system
. Ví dụ: hãy xem phần Giá trị tổng kiểm siêu dữ liệu và Nén A/B ảo.Sử dụng biến thể
recovery
của mô-đun khi cài đặt mô-đun vào/
. Mô-đun này phải có sẵn trước khiinit
chuyển sang thư mục gốc/first_stage_ramdisk
. Để biết chi tiết về cách cài đặt các mô-đun cho/
, hãy xem phần Trước tiên bảng điều khiển giai đoạn.
Bảng điều khiển giai đoạn một
Vì bảng điều khiển giai đoạn đầu tiên bắt đầu trước khi init
chuyển sang thư mục gốc
/first_stage_ramdisk
, bạn cần cài đặt biến thể recovery
của 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 makefile của thiết bị kế thừa
từ tệp đó, bạn không cần cài đặt biến thể recovery
một cách rõ ràng.
Để cài đặt các mô-đun khôi phục một cách rõ ràng, hãy sử dụng mã 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
thuộc 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 đang theo dõi.
PRODUCT_PACKAGES += adbd.recovery
Điều này đảm bảo rằng các mô-đun được chỉ định sẽ cài đặt
$ANDROID_PRODUCT_OUT/recovery/root/system/bin
, sau đó cài đặt vào
/system/bin
trong vendor_ramdisk
.
Giá trị tổng kiểm siêu dữ liệu
Để hỗ trợ siêu dữ liệu
giá trị tổng kiểm
trong quá trình gắn ổ đĩa ở giai đoạn đầu tiên, các thiết bị không hỗ trợ GKI sẽ cài đặt ổ đĩa ram
biến thể 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 sang
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Để xem ví dụ, hãy tham khảo này danh sách thay đổi.
Nén A/B ảo
Để hỗ trợ nén A/B ảo, bạn phải cài đặt snapuserd
để
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
.
Các thay đổi đối với quy trình khởi động
Quá trình khởi động vào quá trình khôi phục hoặc đăng nhập vào Android không thay đổi, với ngoại lệ sau đây:
- Ramdisk
build.prop
di chuyển sang/second_stage_resources
để giai đoạn haiinit
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 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
sẽ 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.mk
nếu thiết bị hỗ trợ mạng ảo A/B nhưng không nén.virtual_ab_ota/compression.mk
nếu thiết bị hỗ trợ A/B ảo nén.
Cài đặt tệp makefile của sản phẩm
$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
sẽ chuyển sang thư mục gốc thành /first_stage_ramdisk
, sau đó
thực thi /system/bin/e2fsck
.
Lựa chọn 2a: Phân vùng khôi phục A/B riêng và phân vùng khôi phục A/B
Sử dụng tuỳ 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ị đó bao gồm
Thiết bị A/B và A/B ảo có thể cập nhật phân vùng khôi phụ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 ổ đĩa ram và nhà cung cấp
mô-đun nhân, bao gồm:
Tệp
fstab
dành riêng cho thiết bịlib/modules
(bao gồm các mô-đun nhân của nhà cung cấp)
Ổ đĩa RAM recovery
chứa tất cả tài nguyên khôi phục. Trên các thiết bị này,
cấu hình sản phẩm kế thừa từ
generic_ramdisk.mk
.
Đặt giá trị Board
Đặt các giá trị sau cho 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 tạo tệp nhị phân và liên kết tượng trưng
Ổ đĩa ram recovery
có thể chứa một đường liên kết tượng trưng /init -> /system/bin/init
và
init_second_stage.recovery
lúc /system/bin/init
. Tuy nhiên, vì khởi động
ramdisk được nối sau ramdisk recovery
, đường liên kết tượng trưng /init
là
bị ghi đè. Khi thiết bị khởi động vào chế độ khôi phục, /system/bin/init
tệp nhị phân là cần thiết để hỗ trợ init giai đoạn hai.
Khi thiết bị khởi động vào recovery
, nội dung của recovery
+
vendor_boot
+ ổ đĩa ram chung như sau:
/init
(từ ramdisk, tạo bằnginit_first_stage
)/system/bin/init
(từrecovery
ramdisk, 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
+ chung
ổ đĩa cứng như sau:
/init
(từ ramdisk chung, tạo bằnginit_first_stage
)
Di chuyển tệp fstab
Di chuyển mọi tệp fstab
đã được cài đặt vào ổ đĩa ram chung sang
vendor_ramdisk
. Để xem ví dụ, hãy tham khảo này
thay đổi.
Cài đặt mô-đun
Bạn có thể tuỳ ý 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 thư mục 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
. Ví dụ về cách cài đặt mô-đun để
vendor_ramdisk
, hãy xem Bảng điều khiển giai đoạn đầu tiên, Siêu dữ liệu
giá trị tổng kiểm và A/B ảo
nén.
Bảng điều khiển giai đoạn một
Để cài đặt biến thể vendor_ramdisk
của các mô-đun, hãy sử dụng nhữ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
thuộc 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, thì hãy sử dụng mã 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
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
. Nếu ổ đĩa RAM vendor_boot
được tải ở chế độ khôi phục, mô-đun này cũng có trong recovery
. Nếu
vendor_boot
ramdisk không được tải ở chế độ khôi phục, thiết bị có thể (không bắt buộc)
cũng cài đặt adbd.recovery
.
Giá trị tổng kiểm siêu dữ liệu
Để hỗ trợ siêu dữ liệu
giá trị tổng kiểm
trong quá trình gắn ổ đĩa ở giai đoạn đầu tiên, các thiết bị không hỗ trợ GKI sẽ cài đặt ổ đĩa ram
biến thể 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 sang
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Để xem ví dụ, hãy tham khảo này danh sách thay đổi.
Nén A/B ảo
Để hỗ trợ tính năng nén A/B ảo, bạn phải cài đặt snapuserd
để
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
.
Các thay đổi đối với quy trình khởi động
Khi khởi động vào Android, quá trình khởi động sẽ không thay đổi. vendor_boot
+
ramdisk chung cũng 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
. Vì system/bin/recovery
không tồn tại,
first_stage_init
xử lý việc này như một quá trình khởi động thông thường.
Khi khởi động vào chế độ khôi phục, quá trình khởi động sẽ thay đổi. Việc khôi phục +
vendor_boot
+ ramdisk chung tương tự như quy trình khôi phục hiện có, nhưng
hạt nhân được tải từ hình ảnh boot
thay vì từ hình ảnh recovery
.
Quá trình khởi động cho chế độ khôi phục như sau.
Trình tải khởi động khởi động, sau đó thực hiện những thao tác sau:
- Đẩy khôi phục +
vendor_boot
+ ổ đĩa ram chung đến/
. (Nếu OEM (Nhà sản xuất thiết bị gốc) sao chép các mô-đun nhân trong ramdisk khôi phục bằng cách thêm các mô-đun đó vàoBOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
là không bắt buộc.) - Chạy nhân hệ điều hành từ phân vùng
boot
.
- Đẩy khôi phục +
Kernel gắn ramdisk vào
/
sau đó thực thi/init
từ ramdisk chung.Quá trình bắt đầu giai đoạn đầu tiên bắt đầu, sau đó thực hiện những việc sau:
- Đặt
IsRecoveryMode() == true
vàForceNormalBoot() == false
. - Tải các mô-đun nhân của nhà cung cấp từ
/lib/modules
. - Gọi
DoFirstStageMount()
nhưng bỏ qua bước gắn kết vìIsRecoveryMode() == true
. (Thiết bị không giải phóng ổ đĩa RAM (vì/
vẫn như cũ) nhưng có gọiSetInitAvbVersionInRecovery()
.) - Bắt đầu khởi tạo giai đoạn 2 từ
/system/bin/init
từ ổ đĩa ramrecovery
.
- Đặ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.mk
nếu thiết bị hỗ trợ mạng ảo A/B nhưng không nén.virtual_ab_ota/compression.mk
nếu thiết bị hỗ trợ A/B ảo nén.
Cài đặt tệp makefile của sản phẩm
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
. Tại
thời gian chạy, giai đoạn đầu tiên init
sẽ thực thi /system/bin/e2fsck
.
Lựa chọn 2b: Phân vùng khôi phục riêng và không phải A/B
Sử dụng tuỳ 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ố vị trí. 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à thiết bị A/B ảo, trong đó phân vùng khôi phục không nằm trong có thể cập nhật. (Đây là điều bất thường.)
Ổ đĩa RAM vendor_boot
chứa các bit của nhà cung cấp của ổ đĩa ram và nhà cung cấp
mô-đun nhân, bao gồm:
- Tệp
fstab
dà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. Tên này phải chứa
tất 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
- Bắt đầu giai đoạn đầu dưới dạng một đường liên kết tượng trưng
/init -> /system/bin/init
- Tệp nhị phân khởi tạo 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 cả tệp nhị phân
recovery
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ị 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 tạo tệp nhị phân và liên kết tượng trưng
Ổ đĩa recovery
phải chứa một đường liên kết tượng trưng /init -> /system/bin/init
và
init_second_stage.recovery
lúc /system/bin/init
. 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ợ cả chế độ khôi phục
khởi tạo giai đoạn và giai đoạn hai.
Khi thiết bị khởi động vào recovery
, nội dung của ổ đĩa recovery
sẽ được
như sau:
/init -> /system/bin/init
(từrecovery
ổ đĩa RAM)/system/bin/init
(từrecovery
ramdisk, 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
+ chung
ổ đĩa cứng như sau:
/init
(từ ramdisk, tạo bằnginit_first_stage
)
Di chuyển tệp fstab
Di chuyển mọi tệp fstab
đã được cài đặt vào ổ đĩa ram chung sang
Ổ đĩa vendor_ramdisk
và recovery
. Để xem ví dụ, hãy tham khảo này
thay đổi.
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à
recovery
ổ đĩa RAM (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 thư mục 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 ổ đĩa RAM recovery
. Ví dụ về cách cài đặt mô-đun để
Ổ đĩa vendor_ramdisk
và recovery
, se
Bảng điều khiển giai đoạn đầu tiên và Siêu dữ liệu
giá trị tổng kiểm.
Bảng điều khiển giai đoạn một
Để cài đặt biến thể vendor_ramdisk
của các mô-đun, hãy sử dụng nhữ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
thuộc 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, thì hãy sử dụng mã 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
$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 \
Giá trị tổng kiểm siêu dữ liệu
Để hỗ trợ siêu dữ liệu
giá trị tổng kiểm
trong quá trình gắn ổ đĩa ở giai đoạn đầu tiên, các thiết bị không hỗ trợ GKI sẽ cài đặt ổ đĩa ram
biến thể 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 sang
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Để hỗ trợ việc kiểm tra siêu dữ liệu trong quá trình liên kết giai đoạn đầu tiên trong quá trình khôi phục, hãy bật biến thể khôi phục của các mô-đun này cũng như cài đặt chúng.
Các thay đổi đối với quy trình khởi động
Khi khởi động vào Android, quá trình khởi động sẽ không thay đổi. vendor_boot
+
ramdisk chung cũng 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
. Vì system/bin/recovery
không tồn tại,
first_stage_init
xử lý việc này như một quá trình khởi động thông thường.
Khi khởi động vào chế độ khôi phục, quá trình khởi động sẽ không thay đổi. Quá trình phục hồi
ramdisk được tải theo cách tương tự như quy trình khôi phục hiện tại.
Kernel được tải từ hình ảnh recovery
. Chiến lược phát hành đĩa đơn
quy trình khởi động cho chế độ khôi phục như sau.
Trình tải khởi động khởi động, sau đó thực hiện những thao tác sau:
- Đẩy ổ đĩa khôi phục tới
/
. - Chạy nhân hệ điều hành từ phân vùng
recovery
.
- Đẩy ổ đĩa khôi phục tới
Kernel 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/init
trong ổ đĩa RAMrecovery
.Quá trình bắt đầu giai đoạn đầu tiên bắt đầu, sau đó thực hiện những việc sau:
- Đặt
IsRecoveryMode() == true
vàForceNormalBoot() == false
. - Tải các mô-đun nhân của nhà cung cấp từ
/lib/modules
. - Gọi
DoFirstStageMount()
nhưng bỏ qua bước gắn kết vìIsRecoveryMode() == true
. (Thiết bị không giải phóng ổ đĩa RAM (vì/
vẫn như cũ) nhưng có gọiSetInitAvbVersionInRecovery()
.) - Bắt đầu khởi tạo giai đoạn 2 từ
/system/bin/init
từ ổ đĩa ramrecovery
.
- Đặt
Dấu thời gian của hình ảnh khởi động
Mã sau đây là tệp dấu thời gian của hình ảnh boot
mẫu:
####################################
# 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
Trong thời gian xây dựng, tệp
system/etc/ramdisk/build.prop
được thêm vào thuộc tính chung ổ đĩa RAM. 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 là
init
bản sao tệp từ ramdisk vàotmpfs
trước khi giải phóng ramdisk để giai đoạninit
có thể đọc tệp này để đặtboot
thuộc tính dấu thời gian hình ảnh.