Android 10 поддерживает динамические разделы — систему разбиения пользовательского пространства, которая может создавать, изменять размер и удалять разделы во время обновлений по беспроводной сети (OTA).
На этой странице описывается, как изменить размер динамических разделов во время обновления для устройств A/B, выпущенных с поддержкой динамических разделов, для устройств под управлением Android 9 и более ранних версий .
Фон
На устройстве есть один super
. Этот раздел не имеет суффикса slot. Блочное устройство должно существовать вместе с записью 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
и т. д.
До обновления Metadata S содержит информацию об используемых динамических разделах (обычно system_s
, vendor_s
, product_s
и т. д.). Система считывает экстенты для этих разделов во время обновления, поэтому их нельзя удалить.
Разделы принадлежат к группам обновления . Подробности см. в разделе Реализация динамических разделов .
Ниже приведен пример метаданных на устройстве.
- Метаданные 0
- Группа
foo_a
- Раздел
system_a
- Раздел
product_services_a
- Другие разделы обновлены Foo
- Раздел
- Группа bar_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
- Другие разделы обновлены пользователем Bar
- Раздел
- Группа
Вы можете использовать инструмент 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 — загруженные метаданные.
- Удалите целевые группы и разделы (например,
foo_t
,bar_t
) из M, чтобы M содержал только разделы и группы с суффиксом_s
. - Добавьте целевые группы и разделы в соответствии с полем
dynamic_partition_metadata
в манифесте обновления.
Размер каждого раздела можно найти вnew_partition_info
. - Записать M в метаданные T.
- Отобразите добавленные разделы на устройстве сопоставления как доступные для записи.
- Примените обновление на блочных устройствах.
- При необходимости отобразите исходные разделы на устройстве-картографе как только для чтения. Это необходимо для загрузки извне, поскольку исходные разделы не отображаются до обновления.
- Применить полное или дельта-обновление ко всем блочным устройствам в целевом слоте.
- Смонтируйте разделы для запуска послеустановочного скрипта, а затем размонтируйте разделы.
- Отмените сопоставление целевых разделов.
До и после обновления следующие системные свойства должны иметь соответствующие значения:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Добавьте группы и разделы в манифест обновления
При выполнении обновления OTA на устройстве A/B с динамическими разделами или на устройстве 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; }