Hỗ trợ cập nhật OTA

Để hỗ trợ các bản cập nhật qua mạng (OTA) , bộ nạp khởi động phải có khả năng truy cập vào đĩa RAM khôi phục trong khi khởi động. Nếu thiết bị sử dụng hình ảnh khôi phục AOSP chưa sửa đổi, bộ nạp khởi động sẽ đọc 32 byte đầu tiên trên phân vùng misc ; nếu dữ liệu ở đó khớp với boot-recovery , bộ nạp khởi động sẽ khởi động vào hình ảnh recovery . Phương pháp này cho phép mọi công việc khôi phục đang chờ xử lý (ví dụ: áp dụng OTA hoặc xóa dữ liệu) tiếp tục hoàn thành.

Để biết chi tiết về nội dung của một khối trong flash được sử dụng để liên lạc bởi recovery và bootloader, hãy tham khảo bootable/recovery/bootloader_message/bootloader_message.h .

Thiết bị có cập nhật A/B

Để hỗ trợ cập nhật OTA trên các thiết bị sử dụng cập nhật A/B , hãy đảm bảo rằng bộ tải khởi động của thiết bị đáp ứng các tiêu chí sau.

Tiêu chí chung

  • Tất cả các phân vùng được cập nhật qua OTA phải có thể cập nhật được trong khi hệ thống chính được khởi động (và không được cập nhật trong quá trình khôi phục).

  • Để khởi động phân vùng system , bộ nạp khởi động chuyển giá trị sau trên dòng lệnh kernel: ro root=/dev/[node] rootwait init=/init .

  • Khung công tác Android có trách nhiệm gọi markBootSuccessful từ HAL. Bộ nạp khởi động không bao giờ được đánh dấu phân vùng là đã khởi động thành công.

Hỗ trợ điều khiển khởi động HAL

Bộ tải khởi động phải hỗ trợ boot_control HAL như được xác định trong hardware/libhardware/include/hardware/boot_control.h ). Trình cập nhật truy vấn điều khiển khởi động HAL , cập nhật khe khởi động hiện không được sử dụng, thay đổi khe khởi động bằng HAL và khởi động lại vào hệ điều hành đã cập nhật. Để biết chi tiết, hãy xem Triển khai điều khiển khởi động HAL .

Hỗ trợ khe cắm

Bộ nạp khởi động phải hỗ trợ chức năng liên quan đến phân vùng và khe cắm, bao gồm:

  • Tên phân vùng phải bao gồm hậu tố xác định phân vùng nào thuộc về một vị trí cụ thể trong bộ nạp khởi động. Đối với mỗi phân vùng như vậy, có một biến tương ứng has-slot: partition base name có giá trị là yes . Các vị trí được đặt tên theo thứ tự bảng chữ cái là a, b, c, v.v. tương ứng với các phân vùng có hậu tố _a , _b , _c , v.v. Bộ tải khởi động sẽ thông báo cho hệ điều hành biết vị trí nào đã được khởi động bằng thuộc tính dòng lệnh androidboot.slot_suffix . Thuộc tính này được đặt thông qua bootconfig cho các thiết bị chạy Android 12 trở lên.

  • Giá trị slot-retry-count được đặt lại thành giá trị dương (thường là 3 ), bằng điều khiển khởi động HAL thông qua lệnh gọi lại setActiveBootSlot hoặc thông qua lệnh fastboot set_active . Khi sửa đổi phân vùng là một phần của khe cắm, bộ nạp khởi động sẽ xóa "khởi động thành công" và đặt lại số lần thử lại cho khe cắm đó.

Bộ nạp khởi động cũng phải xác định khe nào sẽ được tải. Hình này cho thấy một ví dụ về quá trình ra quyết định.

Luồng chia rãnh của bộ nạp khởi động
Hình 1. Luồng chia rãnh của bộ nạp khởi động
  1. Xác định vị trí nào cần thử. Đừng cố tải một vị trí được đánh dấu slot-unbootable . Vị trí này phải nhất quán với các giá trị được fastboot trả về và được gọi là vị trí hiện tại.

  2. Nếu vị trí hiện tại không được đánh dấu là slot-successful và có slot-retry-count = 0 , hãy đánh dấu vị trí hiện tại là slot-unbootable . Sau đó chọn một vị trí khác không được đánh dấu là unbootable và được đánh dấu là slot-successful ; vị trí này bây giờ là vị trí được chọn. Nếu không có khe cắm hiện tại, hãy khởi động vào recovery hoặc hiển thị thông báo lỗi có ý nghĩa cho người dùng.

  3. Chọn boot.img thích hợp và bao gồm đường dẫn sửa phân vùng hệ thống trên dòng lệnh kernel.

  4. Điền tham số slot_suffix dòng lệnh kernel.

  5. Khởi động. Nếu không được đánh dấu slot-successful , hãy giảm slot-retry-count .

Tiện ích fastboot xác định phân vùng nào sẽ flash khi chạy bất kỳ lệnh flash nào. Ví dụ: chạy lệnh fastboot flash system system.img trước tiên truy vấn biến current-slot sau đó ghép kết quả với hệ thống để tạo tên của phân vùng cần được flash ( system_a , system_b , v.v.).

Khi đặt vị trí hiện tại bằng lệnh fastboot set_active hoặc lệnh HAL setActiveBootSlot điều khiển khởi động, bộ nạp khởi động sẽ cập nhật vị trí hiện tại, xóa slot-unbootableslot-successful và đặt lại số lần thử lại (đây là cách duy nhất để xóa slot-unbootable ).

Các thiết bị không có cập nhật A/B

Để hỗ trợ cập nhật OTA trên các thiết bị không sử dụng bản cập nhật A/B (xem Các thiết bị có thể cập nhật không phải A/B ), hãy đảm bảo rằng bộ tải khởi động của thiết bị đáp ứng các tiêu chí sau.

  • Phân vùng recovery phải chứa hình ảnh có khả năng đọc hình ảnh hệ thống từ một số phân vùng được hỗ trợ ( cache , userdata ) và ghi nó vào phân vùng system .

  • Bộ nạp khởi động phải hỗ trợ khởi động lại trực tiếp vào chế độ khôi phục.

  • Nếu cập nhật hình ảnh radio được hỗ trợ, phân vùng recovery cũng có thể flash radio. Điều này có thể được thực hiện theo một trong hai cách:

    • Bộ nạp khởi động nhấp nháy radio. Trong trường hợp này, có thể khởi động lại từ phân vùng khôi phục vào bộ nạp khởi động để hoàn tất cập nhật.

    • Hình ảnh khôi phục nhấp nháy trên radio. Chức năng này có thể được cung cấp dưới dạng thư viện hoặc tiện ích nhị phân.