Android 10 支援動態分區,這是一種使用者空間分區系統,可在無線 (OTA) 更新期間建立、調整大小及刪除分區。
本頁面說明如何在更新期間為支援動態分割區的 A/B 裝置調整動態分割區大小,適用於搭載 Android 9 以下版本的裝置。
背景
裝置上有一個 super
分區。這個
分區沒有為運算單元後置字串。封鎖裝置必須存在於
有 blk_device
項目出現在「/misc
」
fstab
。舉例來說,如果 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_s
、
vendor_s
、product_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
更新流程
- 初始化
super
分區中繼資料。- 從中繼資料 S 載入來源動態分區的範圍。讓 M 為已載入的中繼資料。
-
從 M 中移除目標群組和分區 (例如
foo_t
、bar_t
),讓 M 只包含帶有_s
後置詞的分區和群組。 -
根據以下資源新增目標群組和分區:
更新項目中的
dynamic_partition_metadata
欄位 資訊清單。
您可以在new_partition_info
中找到每個分區的大小。 - 將 M 寫入中繼資料 T。
- 將裝置對應工具上新增的分區對應到可寫入的分區。
- 在區塊裝置上套用更新。
- 視需要將裝置對應器上的來源分區設為唯讀。您必須進行側載,因為原始碼 不會對應更新前的分區。
- 對目標的所有封鎖裝置套用完整或差異更新 。
- 掛接分區以執行安裝後指令碼,然後 卸載分區。
- 取消對應目標分區。
更新前後,下列系統屬性應具有各自的值:
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; }