針對具有動態分區的 A/B 裝置進行 OTA

Android 10 支援動態分區,這是一種使用者空間分區系統,可在無線 (OTA) 更新期間建立、調整大小及刪除分區。

本頁面說明如何在更新期間為支援動態分割區的 A/B 裝置調整動態分割區大小,適用於搭載 Android 9 以下版本的裝置。

背景

裝置上有一個 super 分區。這個 分區沒有為運算單元後置字串。封鎖裝置必須存在於 有 blk_device 項目出現在「/miscfstab。舉例來說,如果 fstab 檔案列出:

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

然後,super的封鎖裝置必須已存在 /dev/block/bootdevice/by-name/super,但 有 super 個分區不需要列於 fstab 檔案。

super 分區中有兩個 中繼資料運算單元,編號 0 和 1,對應至 分區 A/B 運算單元。在這個頁面中,中繼資料運算單元為 稱為 Metadata S (來源) 和 Metadata T (目標)。同樣地 分區稱為 system_s vendor_t,依此類推。

在升級之前,中繼資料 S 會包含 使用的動態分區 (通常為 system_svendor_sproduct_s 等)。系統會在更新期間讀取這些區隔的範圍,因此無法刪除。

分割區屬於更新群組。詳情請見 導入 動態分區

裝置上的中繼資料範例如下。

  • 中繼資料 0
    • 群組 foo_a
      • 分區 system_a
      • 分割區 product_services_a
      • Foo 更新其他分區
    • 群組長條_a
      • 分割區 vendor_a
      • 分區 product_a
      • 由 Bar 更新的其他分區
    • 群組 foo_b (上次升級時遺留)
    • 群組 bar_b (上次升級時遺留)
  • 中繼資料 1
    • 群組「foo_a」(沿用先前升級授權)
    • 群組「bar_a」(沿用先前升級授權)
    • 群組 foo_b
      • 分區 system_b
      • 分割區 product_services_b
      • Foo 更新其他分區
    • 群組 bar_b
      • 分割區 vendor_b
      • 分區 product_b
      • 已透過長條更新其他分區

您可以使用 lpdump 工具 (原始碼位於 system/extras/partition_tools) 轉儲 。例如:

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

更新流程

  1. 初始化 super 分區中繼資料。
    1. 從中繼資料 S 載入來源動態分區的範圍。讓 M 為已載入的中繼資料。
    2. 從 M 中移除目標群組和分區 (例如 foo_tbar_t),讓 M 只包含帶有 _s 後置詞的分區和群組。
    3. 根據以下資源新增目標群組和分區: 更新項目中的 dynamic_partition_metadata 欄位 資訊清單。
      您可以在 new_partition_info 中找到每個分區的大小。
    4. 將 M 寫入中繼資料 T。
    5. 將裝置對應工具上新增的分區對應到可寫入的分區。
  2. 在區塊裝置上套用更新。
    1. 視需要將裝置對應器上的來源分區設為唯讀。您必須進行側載,因為原始碼 不會對應更新前的分區。
    2. 對目標的所有封鎖裝置套用完整或差異更新 。
    3. 掛接分區以執行安裝後指令碼,然後 卸載分區。
  3. 取消對應目標分區。

更新前後,下列系統屬性應具有各自的值:

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

在更新資訊清單中新增群組和分區

在含有動態分區的 A/B 裝置上執行 OTA 更新時, 新增支援動態分區的 A/B 裝置 必須在更新資訊清單中加入群組和分區。以下程式碼片段顯示更新資訊清單的其他資訊,以支援動態分區。如需各欄位的詳細說明文件,請參閱 update_metadata.proto

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;
}