Khôi phục hình ảnh

Trên các thiết bị không phải A/B, hình ảnh khôi phục phải chứa thông tin từ hình ảnh lớp phủ blob cây thiết bị (DTB) hoặc Cấu hình nâng cao và Giao diện nguồn (ACPI) . Khi các thiết bị như vậy khởi động vào quá trình khôi phục, bộ nạp khởi động có thể tải hình ảnh lớp phủ tương thích với hình ảnh khôi phục. Các thiết bị hỗ trợ cập nhật A/B (liền mạch) nên sử dụng khôi phục làm khởi động thay vì phân vùng khôi phục riêng biệt (để biết chi tiết, hãy xem Triển khai cập nhật A/B ).

Các tùy chọn để bao gồm DTBO/ACPIO khôi phục như một phần của hình ảnh khởi động/khôi phục khác nhau giữa các bản phát hành Android.

Giải phóng Cập nhật sơ đồ Tuân thủ GKI Phiên bản tiêu đề khởi động (thiết bị khởi chạy) Phiên bản tiêu đề khởi động (nâng cấp thiết bị) Cần có hình ảnh khôi phục chuyên dụng
11 A/B,
A/B ảo
Đúng 3 * không áp dụng KHÔNG
A/B,
A/B ảo
KHÔNG 2, 3 0, 1, 2, 3 KHÔNG
không phải A/B Đúng 3 không áp dụng Đúng
không phải A/B KHÔNG 2, 3 0, 1, 2, 3 Đúng
10 (Q) A/B không áp dụng 2 0, 1, 2 KHÔNG
không phải A/B không áp dụng 2 0, 1, 2 Đúng
9 (P) A/B không áp dụng 1 0, 1 KHÔNG
không phải A/B không áp dụng 1 0, 1 Đúng
8 (O) A/B không áp dụng Không áp dụng (được coi là 0) Không áp dụng (được coi là 0) KHÔNG
không phải A/B không áp dụng Không áp dụng (được coi là 0) Không áp dụng (được coi là 0) Đúng

* Các thiết bị A/B chạy Android 11 trở lên và sử dụng Hình ảnh hạt nhân chung (GKI) phải sử dụng phiên bản tiêu đề khởi động chính là 3 để tương thích với phân vùng khởi động của nhà cung cấp .

Những điểm chính:

  • Các thiết bị A/B không cần chỉ định hình ảnh khôi phục vì các bản cập nhật A/B sử dụng hai bộ phân vùng (bao gồm bootdtbo ) và chuyển đổi giữa chúng trong khi cập nhật, loại bỏ nhu cầu về hình ảnh khôi phục. Nếu muốn, thiết bị A/B vẫn có thể sử dụng hình ảnh khôi phục chuyên dụng.

  • Các thiết bị không phải A/B chạy Android 11 trở lên và sử dụng phiên bản tiêu đề khởi động 3 phải chỉ định rõ ràng phiên bản tiêu đề khởi động 2 cho hình ảnh khôi phục. Ví dụ:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Đối với các kiến ​​trúc không hỗ trợ cây thiết bị, hình ảnh khôi phục có thể bao gồm hình ảnh ACPIO thay vì hình ảnh DTBO.

Giới thiệu về lỗi OTA và hình ảnh khôi phục

Để tránh lỗi qua mạng (OTA) trên các thiết bị không phải A/B, hình ảnh khôi phục phải tự cung cấp và độc lập với các hình ảnh khác. Trong quá trình cập nhật OTA, nếu xảy ra sự cố sau khi hình ảnh lớp phủ được cập nhật (nhưng trước khi hoàn tất cập nhật đầy đủ), thiết bị sẽ cố gắng khởi động vào chế độ khôi phục để hoàn tất cập nhật OTA. Tuy nhiên, vì phân vùng lớp phủ đã được cập nhật nên có thể xảy ra hiện tượng không khớp với hình ảnh khôi phục (chưa được cập nhật).

Để ngăn quá trình khôi phục phụ thuộc vào phân vùng DTBO/ACPIO trong quá trình cập nhật, các thiết bị không phải A/B chạy Android 9 trở lên có thể chỉ định hình ảnh DTBO/ACPIO khôi phục chứa thông tin từ hình ảnh lớp phủ dưới dạng một phần riêng biệt ở định dạng hình ảnh khởi động ( phải sử dụng phiên bản tiêu đề khởi động là 1 hoặc 2).

Thay đổi hình ảnh khởi động

Để cho phép hình ảnh khôi phục chứa DTBO hoặc ACPIO khôi phục trên các thiết bị không phải A/B chạy Android 9 trở lên, hãy cập nhật cấu trúc hình ảnh khởi động như sau.

Phần hình ảnh khởi động Số trang
Tiêu đề khởi động (1 trang) 1
Hạt nhân (l trang) l = ( kernel_size + page_size - 1) / page_size
Đĩa RAM (m trang) m = ( ramdisk_size + page_size - 1) / page_size
Bộ tải khởi động giai đoạn thứ hai (n trang) n = ( second_size + page_size - 1) / page_size
Khôi phục DTBO hoặc ACPIO (o trang) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Để biết chi tiết về các đối số của công cụ mkbootimg để chỉ định phiên bản tiêu đề hình ảnh khởi động và đường dẫn hình ảnh lớp phủ, hãy xem Phiên bản tiêu đề hình ảnh khởi động .

Triển khai DTBO

Các thiết bị không phải A/B chạy 9 trở lên có thể điền vào phần recovery_dtbo của hình ảnh khôi phục. Để đưa hình ảnh recovery_dtbo vào recovery.img , trong thiết bị BoardConfig.mk :

  • Đặt cấu hình BOARD_INCLUDE_RECOVERY_DTBO thành true :

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Mở rộng biến BOARD_MKBOOTIMG_ARGS để chỉ định phiên bản tiêu đề hình ảnh khởi động:

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Đảm bảo rằng biến BOARD_PREBUILT_DTBOIMAGE được đặt thành đường dẫn của hình ảnh DTBO. Hệ thống xây dựng Android sử dụng biến này để đặt đối số recovery_dtbo của công cụ mkbootimg trong quá trình tạo hình ảnh khôi phục.

Nếu các biến BOARD_INCLUDE_RECOVERY_DTBO , BOARD_MKBOOTIMG_ARGSBOARD_PREBUILT_DTBOIMAGE được đặt chính xác thì hệ thống xây dựng Android sẽ bao gồm DTBO được chỉ định bởi biến BOARD_PREBUILT_DTBOIMAGE trong recovery.img .

Triển khai ACPIO

Các thiết bị không phải A/B chạy Android 9 trở lên có thể sử dụng hình ảnh lớp phủ ACPIO (thay vì hình ảnh DTBO) và có thể điền vào phần recovery_acpio (thay vì phần recovery_dtbo ) của hình ảnh khôi phục. Để đưa hình ảnh recovery_acpio vào recovery.img , trong thiết bị BoardConfig.mk :

  • Đặt cấu hình BOARD_INCLUDE_RECOVERY_ACPIO thành true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Mở rộng biến BOARD_MKBOOTIMG_ARGS để chỉ định phiên bản tiêu đề hình ảnh khởi động. Biến phải lớn hơn hoặc bằng 1 để hỗ trợ ACPIO khôi phục.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Đảm bảo rằng biến BOARD_RECOVERY_ACPIO được đặt thành đường dẫn của hình ảnh ACPIO. Hệ thống xây dựng Android sử dụng biến này để đặt đối số recovery_acpio của công cụ mkbootimg trong quá trình tạo hình ảnh khôi phục.

Nếu các biến BOARD_INCLUDE_RECOVERY_ACPIO , BOARD_MKBOOTIMG_ARGSBOARD_RECOVERY_ACPIO được đặt chính xác thì hệ thống xây dựng Android sẽ bao gồm ACPIO được chỉ định bởi biến BOARD_RECOVERY_ACPIO trong recovery.img .