Беспроводное обновление для устройств с поддержкой A/B-обновлений и динамическими разделами

Android 10 поддерживает динамические разделы – систему разделов пользовательского пространства, которая позволяет создавать, изменять размер и удалять разделы во время беспроводных обновлений.

На этой странице рассказывается, как изменить размер динамических разделов во время обновления на устройствах 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 для разделов. На этой странице слоты метаданных называются "Метаданные S (источник)" и "Метаданные 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
      • Другие разделы, обновленные Bard
    • Группа foo_b (осталась после предыдущего обновления)
    • Группа bar_b (осталась после предыдущего обновления)
  • Метаданные 1
    • Группа foo_a (осталась после предыдущего обновления)
    • Группа bar_a (осталась после предыдущего обновления)
    • Группа foo_b
      • Раздел system_b
      • Раздел product_services_b
      • Другие разделы, обновленные пользователем Foo
    • Группа bar_b
      • Раздел vendor_b
      • Раздел product_b
      • Другие разделы, обновленные Bard

Вы можете использовать инструмент 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. Загрузите экстенты для исходных динамических разделов из Metadata S. Пусть M – загруженные метаданные.
    2. Удалите целевые группы и разделы (например, foo_t, bar_t) из M, чтобы в 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 и динамическими разделами или на устройстве с разделами 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;
}