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à 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 phân vùng động trong quá trình cập nhật dành cho các thiết bị A/B đang đã ra mắt với khả năng hỗ trợ phân vùng động, dành cho các thiết bị chạy Android 9 và thấp hơn.

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 nhập 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 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 fstab.

Trong phân vùng super, có hai vùng siêu dữ liệu, được đánh số 0 và 1, tương ứng với Khe A/B cho phân vùng. Trong trang này, các vị trí siêu dữ liệu được được gọi là Metadata S (nguồn) và Metadata T (mục tiêu). Tương tự, đượ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 đọc dung lượng cho các phân vùng này trong quá trình cập nhật, vì vậy, bạn không thể xoá các phân vùng này.

Các phân vùng thuộc về nhóm cập nhật. Xem 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
    • Thanh_a của nhóm
      • Phân vùng vendor_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 lại từ bản nâng cấp trước)
    • Nhóm bar_b (còn lại từ bả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ừ 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 đượ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 vào thiết bị của bạn. 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 động siêu dữ liệu phân vùng super.
    1. Tải phạm vi cho phân vùng động nguồn từ Siêu dữ liệu Nam Đặt M là siêu dữ liệu được tải.
    2. Xoá nhóm mục tiêu và phân vùng (ví dụ: foo_t; bar_t) từ M sao cho M chứa chỉ những 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 cập nhật.
      Bạn có thể xem kích thước của mỗi phân vùng trong new_partition_info.
    4. Ghi M vào Metadata T.
    5. Ánh xạ các phân vùng đã thêm trên trình ánh xạ thiết bị ở chế độ 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 liên kết thiết bị dưới dạng 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 bản cập nhật delta cho tất cả thiết bị khối tại mục tiêu vị trí.
    3. Gắn kết 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. 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 phải: 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 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. Xem update_metadata.proto để xem 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;
}