Triển khai bản cập nhật qua mạng không dây

Để triển khai bản cập nhật qua mạng không dây (OTA), trình tải khởi động phải có khả năng truy cập vào ổ đĩa RAM khôi phục trong quá trình khởi động. Nếu thiết bị sử dụng hình ảnh khôi phục AOSP chưa sửa đổi, thì trình tải 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, trình tải khởi động sẽ khởi động vào hình ảnh recovery. Phương thức 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 xoá dữ liệu) có thể tiếp tục hoàn tất.

Để biết thông tin chi tiết về nội dung của một khối trong flash dùng cho hoạt động giao tiếp qua quá trình khôi phục và trình tải khởi động, hãy tham khảo bootable/recovery/bootloader_message/bootloader_message.h.

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

Để hỗ trợ cập nhật qua mạng không dây (OTA) trên những thiết bị sử dụng bản cập nhật A/B, hãy đảm bảo rằng trình tải khởi động 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 thông qua OTA đều có thể cập nhật trong khi hệ thống chính khởi động (và không cập nhật trong quá trình khôi phục).

  • Để khởi động phân vùng system, trình tải khởi động sẽ chuyển giá trị sau vào dòng lệnh hạt nhân: ro root=/dev/[node] rootwait init=/init.

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

Hỗ trợ HAL (Lớp trừu tượng phần cứng) điều khiển khởi động

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

Hỗ trợ vị trí

Trình tải khởi động phải hỗ trợ chức năng liên quan đến các phân vùng và khe, bao gồm:

  • Tên phân vùng phải bao gồm một hậu tố xác định những phân vùng thuộc một vị trí cụ thể trong trình tải khởi động. Đối với mỗi phân vùng như vậy, có một biến has-slot:partition base name tương ứng có giá trị là yes. Các ô đượ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. Trình tải khởi động phải thông báo cho hệ điều hành 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 cấu hình khởi động đối với các thiết bị chạy Android 12 trở lên.

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

Trình tải khởi động cũng phải xác định khe để tải. Hình này minh hoạ một quy trình quyết định mẫu.

Quy trình phân vùng của trình tải khởi động
Hình 1. Quy trình phân vùng của trình tải khởi động
  1. Xác định vị trí để thử. Đừng cố tải một vị trí được đánh dấu là slot-unbootable. Vị trí này phải nhất quán với các giá trị mà tính năng khởi động nhanh trả về và được gọi là vị trí hiện tại.

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

  3. Chọn boot.img thích hợp và đưa vào đườ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 của dòng lệnh nhân.

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

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

Khi đặt khe hiện tại bằng lệnh set_active khởi động nhanh hoặc lệnh HAL setActiveBootSlot cho chế độ khởi động nhanh, trình tải khởi động phải cập nhật vị trí hiện tại, xoá slot-unbootableslot-successful, đồng thời đặt lại số lần thử lại (đây là cách duy nhất để xoá slot-unbootable).

Thiết bị không có bản cập nhật A/B

Để hỗ trợ cập nhật qua mạng không dây (OTA) trên những thiết bị không dùng bản cập nhật A/B (xem phần Thiết bị không thể cập nhật A/B), hãy đảm bảo trình tải khởi động của thiết bị đáp ứng những tiêu chí sau.

  • Phân vùng recovery phải chứa một 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 hình ảnh đó vào phân vùng system.

  • Trình tải khởi động sẽ hỗ trợ việc khởi động ngay vào chế độ khôi phục.

  • Nếu tính năng cập nhật hình ảnh vô tuyến được hỗ trợ, thì phân vùng recovery cũng phải có thể cài đặt ROM cho đài phát. Bạn có thể thực hiện việc này bằng một trong hai cách:

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

    • Hình ảnh khôi phục sẽ nhấp nháy đài phát.Bạn có thể cung cấp chức năng này dưới dạng một thư viện hoặc tiện ích nhị phân.