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.
- Разделение
- Группа bar_a
- Раздел
vendor_a - Раздел
product_a - Другие разделы обновлены Баром.
- Раздел
- Группа
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/superlpdump --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;
}