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, đổi kích thước và xoá các 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 đã ra mắt có hỗ trợ phân vùng động, đối với 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 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 liệt kê:

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

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

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

Sau đâ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
    • Group 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 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
      • 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ể 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ị. Ví dụ:

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

Cập nhật chuỗi hội thoại

  1. Khởi chạy siêu dữ liệu phân vùng super.
    1. Tải các phạm vi cho các phân vùng động nguồn từ Metadata S. Giả sử 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 các nhóm và phân vùng mục tiêu theo trường dynamic_partition_metadata trong tệp kê khai bản cập nhật.
      Bạn có thể xem kích thước của từng phân vùng 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ị 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. Điều này là cần thiết cho việc tải từ nguồn bên 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 bản cập nhật gia tăng cho tất cả các thiết bị khối tại khe cắm đích.
    3. Gắn các phân vùng để chạy tập lệnh sau khi cài đặt, rồi huỷ gắn các phân vùng.
  3. Huỷ liên kết các phân vùng đích.

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

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

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

Khi thực hiện quy trình cập nhật qua mạng (OTA) trên thiết bị A/B có phân vùng động hoặc thiết bị A/B đang thêm tính năng hỗ trợ cho 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ã bên dưới cho biết thông tin bổ sung về tệp kê khai 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;
}