OTA cho các 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, đổi kích thước và huỷ phân vùng trong quá trình cập nhật qua mạng không dây (OTA).

Trang này mô tả cách đổi kích thước cá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 với tính năng hỗ trợ phân vùng động, cho các thiết bị chạy Android 9 trở xuống.

Thông tin khái quát

Có một phân vùng super trên thiết bị. Phân vùng này không có hậu tố khe. 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 liệt kê:

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

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

Trong phân vùng super, có hai khe siêu dữ liệu, được đánh số 0 và 1, tương ứng với khe A/B cho các phân vùng. Trong trang này, các khe 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, Metadata 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 sẽ đọc phần mở rộng của các phân vùng này trong quá trình cập nhật, nên bạn không thể xoá phần mở rộng.

Các phân vùng thuộc về nhóm cập nhật. Hãy xem phần Triển khai phân vùng động để biết thông tin chi tiết.

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

  • Siêu dữ liệu 0
    • Nhóm foo_a
      • Phân vùng system_a
      • Phân vùng product_services_a
      • Các phân vùng khác do Foo cập nhật
    • Nhóm bar_a
      • Phân vùng vendor_a
      • Phân vùng product_a
      • Các phân vùng khác do Bar cập nhật
    • Nhóm foo_b (còn lại từ lần nâng cấp trước)
    • Nhóm bar_b (còn lại từ lần nâng cấp trước)
  • Siêu dữ liệu 1
    • Nhóm foo_a (còn lại từ lần nâng cấp trước)
    • Nhóm bar_a (còn lại từ bản nâng cấp trước)
    • Nhóm foo_b
      • Phân vùng system_b
      • Phân vùng product_services_b
      • Các phân vùng khác do Foo cập nhật
    • Nhóm bar_b
      • Phân vùng vendor_b
      • Phân vùng product_b
      • Các phân vùng khác do 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

Cập nhật quy trình

  1. Khởi chạy siêu dữ liệu phân vùng super.
    1. Tải các giới hạn cho các phân vùng động nguồn từ S siêu dữ liệu. Gọi M là siêu dữ liệu đã tải.
    2. Xoá các nhóm mục tiêu và phân vùng (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 nhóm mục tiêu và phân vùng theo trường dynamic_partition_metadata trong tệp kê khai cập nhật.
      Bạn có thể tìm thấy kích thước của mỗi phân vùng trong new_partition_info.
    4. Ghi M vào Metadata T.
    5. Liên kết các phân vùng đã thêm trên trình liên kết 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ị bị chặn.
    1. Nếu cần, hãy liên kết các phân vùng nguồn trên trình liên kết thiết bị ở chế độ chỉ có thể đọc. Điều này là cần thiết để tải không qua cửa hàng vì các phân vùng nguồn không được liên kết 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ả thiết bị khối tại khe mục tiêu.
    3. Gắn các phân vùng để chạy tập lệnh sau khi cài đặt, sau đó tháo các phân vùng đó.
  3. Huỷ liên kết 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 đây sẽ có cá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 tệp kê khai bản cập nhật

Khi thực hiện cập nhật OTA trên thiết bị A/B có các phân vùng động hoặc thiết bị A/B đang thêm tính năng hỗ trợ cho các phân vùng động, bạn cần thêm các nhóm và phân vùng vào tệp kê khai cập nhật. Đoạn mã dưới đây cho thấy thông tin bổ sung về tệp kê khai bản cập nhật để hỗ trợ các phân vùng động. Hãy 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;
}