OTA cho thiết bị A/B có phân vùng động

Android 10 hỗ trợ phân vùng động , một hệ thống phân vùng không gian người dùng có thể tạo, thay đổi kích thước và hủy phân vùng trong quá trình cập nhật qua mạng (OTA).

Trang này mô tả cách thay đổi kích thước phân vùng động trong quá trình cập nhật cho các thiết bị A/B khởi chạy có hỗ trợ phân vùng động, dành cho các thiết bị chạy Android 9 trở xuống .

Lý lịch

Có một super phân vùng trên thiết bị. Phân vùng này không có hậu tố khe cắm. Thiết bị khối phải tồn tại cùng với mục blk_device cho /misc trong fstab . Ví dụ: nếu tệp fstab kê:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

Sau đó, thiết bị khối cho super phải tồn tại trong /dev/block/bootdevice/by-name/super , nhưng super phân vùng không cần phải được liệt kê trong tệp fstab .

Trong super phân vùng có 2 slot siêu dữ liệu được đánh số 0 và 1 tương ứng với các slot A/B cho phân vùng. Trong trang này, các vùng siêu dữ liệu được gọi là Siêu dữ liệu S (nguồn) và Siêu dữ liệu T (đích). Tương tự, các phân vùng được gọi là system_s , vendor_t , v.v.

Trước khi nâng cấp, Siêu dữ liệu S chứa thông tin về các phân vùng động đang được sử dụng (thường là system_s , vendor_s , product_s , v.v.). Hệ thống đọc phạm vi của các phân vùng này trong quá trình cập nhật nên không thể xóa chúng.

Các phân vùng thuộc nhóm cập nhật . Xem Triển khai phân vùng động để biết chi tiết.

Sau đây là một ví dụ về siêu dữ liệu trên thiết bị.

  • Siêu dữ liệu 0
    • Nhóm foo_a
      • system_a phân vùng_a
      • Phân vùng product_services_a
      • Các phân vùng khác được Foo cập nhật
    • Nhóm thanh_a
      • vendor_a phân vùng_a
      • Phân vùng product_a
      • Các phân vùng khác được Bar cập nhật
    • Nhóm foo_b (còn sót lại từ lần nâng cấp trước)
    • Nhóm bar_b (còn sót lại từ lần nâng cấp trước)
  • Siêu dữ liệu 1
    • Nhóm foo_a (còn sót lại từ lần nâng cấp trước)
    • Nhóm bar_a (còn sót lại từ lần nâng cấp trước)
    • Nhóm foo_b
      • system_b phân vùng_b
      • Phân vùng product_services_b
      • Các phân vùng khác được Foo cập nhật
    • Nhóm bar_b
      • vendor_b phân vùng_b
      • Phân vùng product_b
      • Các phân vùng khác được Bar cập nhật

Bạn có thể sử dụng công cụ lpdump (mã nguồn trong system/extras/partition_tools ) để kết xuất siêu dữ liệu trên thiết bị của mình. Ví dụ:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Luồng cập nhật

  1. Khởi tạo super dữ liệu phân vùng.
    1. Tải phạm vi cho các phân vùng động nguồn từ Siêu dữ liệu S. Đặt M là siêu dữ liệu được tải.
    2. Xóa các nhóm và phân vùng mục tiêu (ví dụ: foo_t , bar_t ) khỏi M để M chỉ chứa các phân vùng và nhóm có hậu tố _s .
    3. Thêm các nhóm mục tiêu và phân vùng theo trường dynamic_partition_metadata trong bảng kê khai cập nhật.
      Kích thước của mỗi phân vùng có thể được tìm thấy trong new_partition_info .
    4. Viết M vào siêu dữ liệu T.
    5. Ánh xạ các phân vùng đã thêm trên trình ánh xạ thiết bị dưới dạng có thể ghi.
  2. Áp dụng bản cập nhật trên các thiết bị khối.
    1. Nếu cần, hãy ánh xạ các phân vùng nguồn trên trình ánh xạ thiết bị dưới dạng chỉ đọc. Điều này là cần thiết cho việc tải phụ vì các phân vùng nguồn không được ánh xạ trước khi cập nhật.
    2. Áp dụng bản cập nhật đầy đủ hoặc delta cho tất cả các thiết bị khối tại vị trí mục tiêu.
    3. Gắn các phân vùng để chạy tập lệnh sau cài đặt, sau đó ngắt kết nối các phân vùng.
  3. Bỏ ánh xạ các phân vùng mục tiêu.

Trước và sau khi cập nhật, các thuộc tính hệ thống sau phải có giá trị tương ứng:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

Thêm nhóm và phân vùng vào bảng kê khai cập nhật

Khi thực hiện cập nhật OTA trên thiết bị A/B có phân vùng động hoặc thiết bị A/B đang thêm hỗ trợ cho phân vùng động, bạn cần thêm nhóm và phân vùng vào bảng kê khai cập nhật. Đoạn mã bên dưới hiển thị thông tin bổ sung về bảng kê khai cập nhật để hỗ trợ các phân vùng động. Xem update_metadata.proto để biết tài liệu chi tiết về từng trường.

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}