Phân vùng khởi động chung

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ị chạy Android 13, ramdisk chung sẽ bị xóa khỏi hình ảnh boot và được đặt trong một hình ảnh init_boot riêng biệt. Thay đổi này chỉ để lại hình ảnh boot với kernel GKI.

Để nâng cấp các thiết bị tiếp tục sử dụng phiên bản kernel Android 12 trở lên, đĩa ram chung vẫn giữ nguyên 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ừ ramdisk chung sang ramdisk vendor_boot .

  • Hãy sử dụng phân vùng recovery chuyên dụng, không cần thay đổi ramdisk recovery vì ramdisk recovery 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ị chạy Android 13 có 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ử dụng kiến ​​trúc tương tự như với Android 12.

Ra mắt với Android 13, không có phục hồi chuyên dụng

Khởi chạy/nâng cấp thiết bị, GKI, không phục hồi chuyên dụng

Hình 1. Thiết bị khởi chạy hoặc nâng cấp lên Android 13, có GKI, không có phục hồi chuyên dụng

Ra mắt với Android 13, phục hồi chuyên dụng và A/B (đĩa ram chuyên dụng)

Khởi chạy/nâng cấp thiết bị, GKI, chuyên dụng và A/B recovery

Hình 2. Các thiết bị khởi 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_arecovery_b .

Ra mắt với Android 13, phục hồi chuyên dụng và không phải A/B (đĩa ram chuyên dụng)

Khởi chạy/nâng cấp thiết bị, GKI, phục hồi chuyên dụng và không phải A/B

Hình 3. Các thiết bị khởi chạy hoặc nâng cấp lên Android 13, có GKI, 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ó phân vùng có tên recovery không có hậu tố khe cắm.

Khởi chạy hoặc nâng cấp lên Android 12, không cần phục hồi chuyên dụng

Khởi chạy/nâng cấp thiết bị, GKI, không phục hồi chuyên dụng

Hình 4. Thiết bị khởi chạy hoặc nâng cấp lên Android 12, có GKI, không có phục hồi chuyên dụng

Khởi chạy hoặc nâng cấp lên Android 12, phục hồi chuyên dụng và A/B (đĩa ram chuyên dụng)

Khởi chạy/nâng cấp thiết bị, GKI, chuyên dụng và A/B recovery

Hình 5. Các thiết bị khởi 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_arecovery_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)

Khởi chạy/nâng cấp thiết bị, GKI, phục hồi chuyên dụng và không phải A/B

Hình 6. Thiết bị khởi chạy hoặc nâng cấp lên Android 12, có GKI, 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ó phân vùng có tên recovery không có hậu tố khe cắm.

Nâng cấp lên Android 12, recovery-as-boot (recovery-as-ramdisk)

Khởi chạy/nâng cấp thiết bị, không có GKI, recovery-as-boot

Hình 7. 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 (ramdisk chuyên dụng)

Khởi chạy/nâng cấp thiết bị, không có GKI, phục hồi chuyên dụng

Hình 8. Thiết bị nâng cấp lên Android 12, không có GKI, recovery 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 hình ảnh init_boot 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

    • Phiên bản tiêu đề V3 hoặc V4
      • boot_signature cho chứng nhận GKI boot.img (chỉ phiên bản 4). GKI boot.img được chứng nhận chưa được ký để khởi động đã được 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
    • Hình ảnh đĩa RAM chung
      • Chỉ có trong hình ảnh boot từ Android 12 trở về trước
  • hình ảnh vendor_boot (để biết chi tiết, xem Phân vùng khởi động của 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 khôi phục (nếu không có phục hồi chuyên dụng)
    • hình ảnh dtb
  • 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ới bootcmdline vendor_boot .
      • 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ừ bootvendor_boot . Ví dụ:
      • cmdline được nối với bootvendor_boot cmdline .
      • DTBO có thể được suy ra từ tiêu đề vendor_boot .
    • hình ảnh đĩa ram recovery
      • 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 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
      • Đĩ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 đĩa ram chung và đĩa ram vendor_boot , do đó nó 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 ramdisk vendor_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 tiên trong ảnh khởi động.

Nội dung hình ảnh ramdisk chung

Đĩa RAM chung chứa các thành phần sau.

  • init
  • Đã thêm system/etc/ramdisk/build.prop
  • ro. PRODUCT .bootimg.* build đạo cụ
  • 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/
    • Các thư mục trống trùng lặp cho các điểm gắn kết: debug_ramdisk/ , mnt/ , dev/ , sys/ , proc/ , metadata/

Tích hợp hình ảnh khởi động

Cờ xây dựng kiểm soát cách tạo hình ảnh init_boot , boot , recoveryvendor_boot . 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ành true thì hãy đặt BOARD_PREBUILT_BOOTIMAGE thành vị trí của image 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 thiết bị có sử dụng hình ảnh recovery làm hình ảnh boot 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 sang vendor_boot .

  • BOARD_USES_GENERIC_KERNEL_IMAGE . Biến này chỉ ra rằng bo mạch sử dụng GKI. Biến này không ảnh hưởng đến sysprops hoặc PRODUCT_PACKAGES .

    Đây là công tắc GKI cấp bo mạch; tất cả các biến được liệt kê dưới đây đề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 khôi phục ramdisk có được tích hợp vào vendor_boot hay không.

    • Khi được đặt thành true , tài nguyên khôi phục chỉ được tạo thành vendor-ramdisk/ và không được tạo thành recovery/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 cho vendor-ramdisk/ .

  • BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT . Biến này kiểm soát xem khóa GSI AVB có được tích hợp vào vendor_boot không.

    • Khi được đặt thành true , nếu BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :

      • Được đặt, 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, 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 ảnh recovery có chứa kernel hay không. Các thiết bị chạy Android 12 và sử dụng phân vùng recovery A/B phải đặt biến này thành true . Các thiết bị chạy Android 12 và sử dụng không phải A/B phải đặt biến này thành false để giữ cho hình ảnh khôi phục luôn độ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ào IMAGES/ trong tệp đích hay không.

    • aosp_arm64 phải đặt biến này thành true .

    • 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 xem init_boot.img có được tạo hay không và đặt kích thước. Khi được đặt, ramdisk chung sẽ được thêm vào init_boot.img thay vì boot.img và yêu cầu các biến BOARD_AVB_INIT_BOOT* được đặt cho vbmeta chuỗi

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ần 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ị mà không cần 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 các thiết bị này, nếu BOARD_RECOVERYIMAGE_PARTITION_SIZE được đặt thì hình ảnh recovery sẽ được tạo.

Kích hoạt chuỗi vbmeta để khởi động

vbmeta chuỗi phải được kích hoạt cho hình ảnh bootinit_boot . Chỉ định những điều 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 là root

Hệ thống dưới dạng root không được hỗ trợ 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. Hệ thống dưới dạng 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 những điều 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 đó 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 bằng Android 13, nâng cấp lên Android 12 và khởi chạy bằng Android 12. Android 13 được thiết lập tương tự như 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 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ị đó:

      • Đặt BOARD_USES_RECOVERY_AS_BOOT thành true , kiến ​​trúc như trong Hình 3 .

      • Đặt BOARD_USES_RECOVERY_AS_BOOT thành trống, kiến ​​trúc như Hình 4 .

    • Có thể đặt BOARD_USES_RECOVERY_AS_BOOT thành trống. Nếu họ làm như vậy thì 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 recovery chuyên dụng, kiến ​​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ị chạy Android 12 phải đặt BOARD_USES_RECOVERY_AS_BOOT ở chế độ 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 recovery chuyên dụng, kiến ​​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 .

aosp_arm64 chỉ xây dựng GKI (chứ không phải vendor_boot hoặc recovery), nên 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 sẽ 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 cả 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ị 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

Đĩa ram vendor_boot có thể chứa liên kết tượng trưng /init đến /system/bin/initinit_second_stage.recovery tại /system/bin/init . Tuy nhiên, vì đĩa ram chung được nối sau đĩa ram vendor_boot nên liên kết tượng trưng /init 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ợ init giai đoạn thứ hai. Nội dung của vendor_boot + ramdisk 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 tin fstab

Di chuyển mọi tệp fstab đã được 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

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ài đặt bất kỳ mô-đun dành riêng cho thiết bị nào).

  • 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 khi init chuyển root vào /first_stage_ramdisk nhưng trước khi init chuyển root vào /system . Để biết ví dụ, hãy xem Tổng kiểm tra siêu dữ liệuNé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 phải có sẵn trước khi init chuyển root vào /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

Vì bảng điều khiển giai đoạn đầu khởi động trước khi init chuyển root sang /first_stage_ramdisk nên 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 thành 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 đó thì bạn không cần phải 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 , shtoybox 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 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 đượ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ợ tổng kiểm tra siêu dữ liệu trong quá trình gắn kết 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 sang $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 .

Những thay đổi trong quá trình khởi động

Quá trình khởi động vào recovery hoặc vào Android không thay đổi, ngoại trừ sau:

  • Ramdisk build.prop di chuyển vào /second_stage_resources để init giai đoạn thứ hai có thể đọc dấu thời gian khởi động của quá trình xây dựng.

Vì các tài nguyên chuyển từ đĩa ram chung sang đĩa vendor_boot , nên kết quả của việc ghép đĩa ram chung với ramdisk vendor_boot không thay đổi.

Cung cấp e2fsck

Các tệp tạo 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.

Các tệp tạo sản phẩm cài đặt $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck . Khi chạy, init giai đoạn đầu tiên 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 phục hồi A/B chuyên dụng và

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_arecovery_b partition . Các thiết bị này bao gồm các thiết bị A/B và Virtual A/B trong đó 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 nhà cung cấp của ramdisk và mô-đun hạt nhân của 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)

Đĩa RAM 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ị BOARD

Đặ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

Đĩa RAM recovery có thể chứa liên kết tượng trưng /init -> /system/bin/initinit_second_stage.recovery tại /system/bin/init . Tuy nhiên, vì đĩa ram khởi động được nối sau đĩa ram recovery nên 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, cần có tệp nhị phân /system/bin/init để hỗ trợ init giai đoạn thứ hai.

Khi máy khởi động vào recovery thì nội dung của recovery + vendor_boot + generic ramdisks như sau:

  • /init (từ ramdisk, được xây dựng từ init_first_stage )
  • /system/bin/init (từ ramdisk recovery , được xây dựng từ init_second_stage.recovery và được thực thi từ /init )

Khi máy khởi động vào Android, nội dung của vendor_boot + generic ramdisks như sau:

  • /init (từ ramdisk chung, được xây dựng từ init_first_stage )

Di chuyển tập tin fstab

Di chuyển mọi tệp fstab đã được cài đặt vào đĩa RAM chung sang vendor_ramdisk . Để biết 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ài đặt bất kỳ mô-đun dành riêng cho thiết bị nào). Init không chuyển root. Biến thể mô-đun của 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 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ệuNé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 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 , shtoybox 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 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ách 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 ramdisk vendor_boot được tải ở chế độ khôi phục, mô-đun cũng có sẵn trong recovery . Nếu đĩa ram vendor_boot không được tải ở chế độ khôi phục thì thiết bị cũng có thể tùy chọn 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 kết 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 sang $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 .

Những thay đổi trong quá trình khởi động

Khi khởi động vào Android, quá trình khởi động không thay đổi. Đĩa ram chung vendor_boot + 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 xử lý nó như một lần khởi động bình thường.

Khi khởi động vào chế độ recovery, quá trình khởi động sẽ thay đổi. Recovery + vendor_boot + ramdisk chung tương tự như quy trình khôi phục hiện có, nhưng kernel được tải từ ảnh boot thay vì từ ảnh recovery . Quá trình khởi động cho chế độ recovery như sau.

  1. Bootloader khởi động, sau đó thực hiện như sau:

    1. Đẩy recovery + vendor_boot + RAMdisk chung vào / . (Nếu OEM sao chép các mô-đun hạt nhân trong ramdisk khôi phục bằng cách thêm chúng vào BOARD_RECOVERY_KERNEL_MODULES ), vendor_boot là tùy chọn.)
    2. Chạy kernel từ phân vùng boot .
  2. Kernel gắn ramdisk vào / sau đó thực thi /init từ ramdisk chung.

  3. Giai đoạn đầu tiên init bắt đầu, sau đó thực hiện như sau:

    1. Đặt IsRecoveryMode() == trueForceNormalBoot() == false .
    2. Tải các mô-đun hạt nhân của nhà cung cấp từ /lib/modules .
    3. Gọi DoFirstStageMount() nhưng bỏ qua quá trình cài đặt vì IsRecoveryMode() == true . (Thiết bị không giải phóng ramdisk (vì / vẫn như cũ) nhưng gọi SetInitAvbVersionInRecovery() .)
    4. Bắt đầu init giai đoạn thứ hai từ /system/bin/init từ đĩa ram recovery .

Cung cấp e2fsck

Các tệp tạo 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.

Các tệp tạo sản phẩm cài đặt $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck . Khi chạy, init giai đoạn đầu tiên thực thi /system/bin/e2fsck .

Tùy 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 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ố khe cắm. Những 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 không thể cập nhật phân vùng khôi phục. (Điều này thật bất thường.)

Đĩa ram vendor_boot chứa các bit nhà cung cấp của ramdisk và mô-đun hạt nhân của 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
  • 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
  • Khởi tạo nhị phân 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 , 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ị 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

Đĩa RAM recovery phải chứa liên kết tượng trưng /init -> /system/bin/initinit_second_stage.recovery tại /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ả init giai đoạn đầu tiên và giai đoạn thứ hai.

Khi thiết bị khởi động vào recovery , nội dung của ramdisks recovery như sau:

  • /init -> /system/bin/init (từ đĩa RAM recovery )
  • /system/bin/init (từ ramdisk recovery , được xây dựng từ init_second_stage.recovery và được thực thi từ /init )

Khi máy khởi động vào Android, nội dung của vendor_boot + generic ramdisks như sau:

  • /init (từ ramdisk, được xây dựng từ init_first_stage )

Di chuyển tập tin fstab

Di chuyển mọi tệp fstab đã được cài đặt vào đĩa ram chung sang vendor_ramdisk và đĩa recovery . Để biết 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à ramdisk recovery (bỏ qua bước này nếu bạn không cài đặt bất kỳ mô-đun dành riêng cho thiết bị nào). init không chuyển root. Biến thể mô-đun của 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 sẽ cài đặt vào thư mục 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à ramdisk recovery , hãy xem Bảng điều khiển giai đoạn đầuTổ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 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 , shtoybox 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 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ách 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ợ tổng kiểm tra siêu dữ liệu trong quá trình gắn kết 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 sang $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 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 và cài đặt chúng.

Những thay đổi trong quá trình khởi động

Khi khởi động vào Android, quá trình khởi động không thay đổi. Đĩa ram chung vendor_boot + 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 xử lý nó như một lần khởi động bình thường.

Khi khởi động vào chế độ recovery, quá trình khởi động không thay đổi. Đĩa RAM khôi phục được tải theo cách tương tự như quá 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ế độ recovery như sau.

  1. Bootloader khởi động, sau đó thực hiện như sau:

    1. Đẩy đĩa RAM phục hồi vào / .
    2. Chạy kernel từ phân vùng recovery .
  2. Kernel gắn ramdisk vào / sau đó thực thi /init , đây là một liên kết tượng trưng đến /system/bin/init từ ramdisk recovery .

  3. Giai đoạn đầu tiên init bắt đầu, sau đó thực hiện như sau:

    1. Đặt IsRecoveryMode() == trueForceNormalBoot() == false .
    2. Tải các mô-đun hạt nhân của nhà cung cấp từ /lib/modules .
    3. Gọi DoFirstStageMount() nhưng bỏ qua quá trình cài đặt vì IsRecoveryMode() == true . (Thiết bị không giải phóng ramdisk (vì / vẫn như cũ) nhưng gọi SetInitAvbVersionInRecovery() .)
    4. Bắt đầu init giai đoạn thứ hai từ /system/bin/init từ đĩa ram recovery .

Dấu thời gian hình ảnh khởi động

Đoạn mã sau đây là một 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 xây dựng, tệp system/etc/ramdisk/build.prop được thêm vào ramdisk chung. Tệp này chứa thông tin dấu thời gian của bản dựng.

  • Trong thời gian chạy, init giai đoạn đầu sao chép các tệp từ ramdisk sang tmpfs trước khi giải phóng ramdisk để init giai đoạn thứ hai có thể đọc tệp này để đặt thuộc tính dấu thời gian của ảnh boot .