OTA для устройств A/B с динамическими разделами

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

Поток обновления

  1. Инициализируйте метаданные super .
    1. Загрузите экстенты для исходных динамических разделов из метаданных 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

Добавьте группы и разделы в манифест обновления

При выполнении обновления 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;
}