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

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 для разделов. На этой странице слоты метаданных называются Метаданные S (источник) и Метаданные T (цель). Аналогичным образом разделы называются system_s , vendor_t и т. д.

Перед обновлением метаданные S содержат информацию об используемых динамических разделах (обычно system_s , vendor_s , product_s и т. д.). Система считывает экстенты этих разделов во время обновления, поэтому их невозможно удалить.

Разделы принадлежат группам обновлений . Подробности см. в разделе «Реализация динамических разделов» .

Ниже приведен пример метаданных на устройстве.

  • Метаданные 0
    • Группа foo_a
      • system_a разделов_a
      • Раздел product_services_a
      • Другие разделы обновлены Foo
    • Группа bar_a
      • vendor_a
      • Раздел product_a
      • Другие разделы обновлены Баром
    • Группа foo_b (осталась от предыдущего обновления)
    • Группа bar_b (осталась от предыдущего обновления)
  • Метаданные 1
    • Группа foo_a (осталась от предыдущего обновления)
    • Группа bar_a (осталась от предыдущего обновления)
    • Группа foo_b
      • system_b разделов_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

Обновление потока

  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;
}