Hình ảnh DTB

Các quá trình triển khai Android có thể bao gồm hình ảnh blob cây thiết bị (DTB) để trình tải khởi động sử dụng. Vị trí của hình ảnh DTB (và các tuỳ chọn để chỉ định thông số hình ảnh DTB) khác nhau giữa các bản phát hành Android.

  • Trong Android 11, các thiết bị sử dụng Hình ảnh hạt nhân chung (GKI) phải hỗ trợ phân vùng khởi động của nhà cung cấp, bao gồm tất cả thông tin dành riêng cho nhà cung cấp đã được chuyển từ phân vùng khởi động. Vì hình ảnh DTB chứa dữ liệu dành riêng cho nhà cung cấp nên hình ảnh này hiện đã trở thành một phần của phân vùng khởi động của nhà cung cấp. Để chỉ định các tham số hình ảnh DTB, hãy xem Tiêu đề khởi động của nhà cung cấp.

  • Trong Android 10, các thiết bị có thể đưa hình ảnh DTB vào phân vùng khởi động. Để chỉ định các tham số hình ảnh DTB, hãy xem phần Đưa hình ảnh DTB vào hình ảnh khởi động.

  • Trong Android 9 trở xuống, hình ảnh DTB có thể tồn tại trong phân vùng riêng hoặc được thêm vào nhân image.gz để tạo nhân hệ điều hành + hình ảnh DTB (sau đó được truyền đến mkbootimg để tạo boot.img).

Định dạng hình ảnh DTB

Trong Android 10 trở lên, hình ảnh DTB phải sử dụng một trong các định dạng sau:

  • DT blob lần lượt nối với nhau. Trình tải khởi động sử dụng trường totalsize trong mỗi tiêu đề FDT để đọc và phân tích cú pháp blob tương ứng.

  • Phân vùng DTB/DTBO. Trình tải khởi động có một cách hiệu quả để chọn đúng DT blob bằng cách kiểm tra cấu trúc dt_table_entry (chứa các trường id, revcustom) có thể lưu giữ thông tin nhận dạng phần cứng cho mục nhập. Để biết thông tin chi tiết, hãy xem phần Phân vùng DTB/DTBO.

Đưa hình ảnh DTB vào hình ảnh khởi động

Các thiết bị chạy Android 10 có thể có hình ảnh DTB trong hình ảnh khởi động. Điều này giúp Android không cần phải hỗ trợ các tập lệnh thêm hình ảnh DTB vào image.gz trong nhân, đồng thời cho phép sử dụng bài kiểm thử Bộ kiểm tra nhà cung cấp (VTS) để xác minh (và chuẩn hoá) vị trí DTB.

Ngoài ra, đối với các thiết bị không phải A/B, sẽ an toàn hơn nếu bạn sử dụng DTB trong hình ảnh khôi phục thay vì trong một phân vùng riêng để ngăn chặn các sự cố do OTA bị gián đoạn. Trong quá trình OTA, nếu xảy ra sự cố sau khi phân vùng DTB đượ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 OTA; tuy nhiên, do phân vùng DTB đã được cập nhật nên có thể xảy ra trường hợp không khớp với hình ảnh khôi phục (chưa được cập nhật). Việc sử dụng hình ảnh DTB trong định dạng hình ảnh khởi động sẽ giúp ngăn chặn các vấn đề như vậy bằng cách tạo hình ảnh khôi phục tự đủ (nghĩa là hình ảnh không phụ thuộc vào một phân vùng khác).

Khởi động cấu trúc hình ảnh

Các thiết bị chạy Android 10 có thể có hình ảnh DTB bằng cách sử dụng cấu trúc hình ảnh khởi động sau đây.

Phần hình ảnh khởi động Số trang
Tiêu đề khởi động (1 trang) 1
Kernel (l trang) 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
DTBO khôi phục (o trang) o = (recovery_dtbo_size + page_size – 1) / page_size
DTB (trang p) p = (dtb_size + page_size – 1) / page_size

Đường dẫn hình ảnh DTB

Đối với các thiết bị chạy Android 10, bạn có thể sử dụng công cụ mkbootimg.py và các đối số sau để chỉ định đường dẫn đến hình ảnh DTB.

Đối số Nội dung mô tả
dtb Đường dẫn đến hình ảnh DTB sẽ được đưa vào hình ảnh khởi động/khôi phục.
dtb_offset Khi thêm vào đối số base, hãy cung cấp địa chỉ tải thực tế cho cây thiết bị cuối cùng. Ví dụ: nếu đối số base0x10000000 và đối số dtb_offset0x01000000, thì dtb_addr_field trong tiêu đề của hình ảnh khởi động sẽ được điền là 0x11000000.

Bạn phải dùng biến cấu hình bảng BOARD_PREBUILT_DTBIMAGE_DIR để chỉ định đường dẫn đến hình ảnh DTB. Nếu có nhiều tệp có đuôi *.dtb xuất hiện trong thư mục BOARD_PREBUILT_DTBIMAGE_DIR, thì hệ thống xây dựng Android sẽ liên kết các tệp đó để tạo hình ảnh DTB cuối cùng được dùng trong quá trình tạo hình ảnh khởi động.

Để truyền đối số dtb đến mkbootimg.py bằng hình ảnh DTB từ thư mục do BOARD_PREBUILT_DTBIMAGE_DIR chỉ định, bạn phải đặt biến cấu hình bảng BOARD_INCLUDE_DTB_IN_BOOTIMG thành true. Ví dụ:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Bạn có thể thêm đối số dtb_offset vào biến cấu hình bảng BOARD_MKBOOTIMG_ARGS cùng với các giá trị chênh lệch và phiên bản tiêu đề khác. Ví dụ:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

Hỗ trợ trình tải khởi động

Để VTS chạy thành công trên các thiết bị chạy Android 10, trình tải khởi động phải hỗ trợ hình ảnh khởi động đã cập nhật và phải thêm tham số dòng lệnh hạt nhân androidboot.dtb_idx để cho biết chỉ mục của cây thiết bị (DT) đã chọn. Bạn chỉ có thể chỉ định một (1) chỉ mục. Ví dụ: tham số androidboot.dtb_idx=N báo cáo N là chỉ mục dựa trên 0 của cây thiết bị mà trình tải khởi động chọn từ tập hợp DTB có trong hình ảnh khởi động.