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 для разделов. На этой странице слоты метаданных называются 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/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;
}