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ừ tệp blob cây thiết bị (DTB) hoặc hình ảnh lớp phủ Giao diện cấu hình và nguồn điện nâng cao (ACPI). Khi các thiết bị như vậy khởi động vào quá trình khôi phục, trình tải 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 tục) nên sử dụng chế độ khôi phục làm chế độ khởi động thay vì một phân vùng khôi phục riêng (để biết thông tin chi tiết, hãy xem phần Triển khai bản cập nhật A/B).
Các tuỳ chọn để đưa DTBO/ACPIO khôi phục vào hình ảnh khởi động/khôi phục sẽ khác nhau giữa các bản phát hành Android.
Phát hành | Cập nhật giao thức | 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 (thiết bị nâng cấp) | Bắt buộc phải có hình ảnh khôi phục chuyên dụng |
---|---|---|---|---|---|
11 | A/B, A/B ảo |
Có | 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 thử nghiệm A/B | Có | 3 | Không áp dụng | Có | |
không thuộc A/B | Không | 2, 3 | 0, 1, 2, 3 | Có | |
10 (Q) | A/B | Không áp dụng | 2 | 0, 1, 2 | Không |
không phải thử nghiệm A/B | Không áp dụng | 2 | 0, 1, 2 | Có | |
9 (Bàn thắng phạt đền) | A/B | Không áp dụng | 1 | 0, 1 | Không |
không phải thử nghiệm A/B | Không áp dụng | 1 | 0, 1 | Có | |
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 thử nghiệm 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) | 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.
Các điểm chính:
Thiết bị A/B không cần chỉ định hình ảnh khôi phục vì bản cập nhật A/B sử dụng hai bộ phân vùng (bao gồm
boot
vàdtbo
) và chuyển đổi giữa các phân vùng đó trong quá trình cập nhật, không cần hình ảnh khôi phục. Các 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 tiêu đề khởi động phiên bản 3 phải chỉ định rõ phiên bản tiêu đề khởi động 2 cho hình ảnh khôi phục một cách riêng biệt. Ví dụ:
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
Đối với các cấu 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
Để ngăn chặn lỗi qua mạng không dây (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 qua mạng không dây, nếu có sự cố xảy ra sau khi hình ảnh lớp phủ đã được cập nhật (nhưng trước khi hoàn tất quá trình 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 quá trình 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 sự không khớp với hình ảnh khôi phục (chưa được cập nhật).
Để tránh việc 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 (trang l) | l = (kernel_size + page_size -
1) / page_size |
Ramdisk (m trang) | m = (ramdisk_size + page_size -
1) / page_size |
Trình tải khởi động giai đoạn hai (n trang) | n = (second_size + page_size -
1) / page_size |
Khôi phục DTBO hoặc ACPIO (trang o) | o = (recovery_[dtbo|acpio]_size + page_size -
1) / page_size |
Để biết thông tin chi tiết về các đối số 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 phần 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 Android 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 BoardConfig.mk
của thiết bị:
Đặt cấu hình
BOARD_INCLUDE_RECOVERY_DTBO
thànhtrue
: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 để đặ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 bạn đặt chính xác các biến BOARD_INCLUDE_RECOVERY_DTBO
, BOARD_MKBOOTIMG_ARGS
và BOARD_PREBUILT_DTBOIMAGE
, thì hệ thống xây dựng Android sẽ bao gồm DTBO do biến BOARD_PREBUILT_DTBOIMAGE
chỉ định 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 BoardConfig.mk
của thiết bị:
Đặt cấu hình
BOARD_INCLUDE_RECOVERY_ACPIO
thànhtrue
: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 này phải lớn hơn hoặc bằng 1 để hỗ trợ khôi phục APCIO.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 APCIO. Hệ thống xây dựng Android sử dụng biến để đặ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 bạn đặt chính xác các biến BOARD_INCLUDE_RECOVERY_ACPIO
, BOARD_MKBOOTIMG_ARGS
và BOARD_RECOVERY_ACPIO
, thì hệ thống xây dựng Android sẽ bao gồm ACPIO do biến BOARD_RECOVERY_ACPIO
chỉ định trong recovery.img
.