Внедрить виртуальный A/B

Чтобы реализовать виртуальный A/B на новом устройстве или модернизировать уже запущенное устройство, необходимо внести изменения в код, специфичный для устройства.

Создание флагов

Устройства, использующие виртуальные A/B, должны быть настроены как устройства A/B и запускаться с динамическими разделами .

Для устройств, запускаемых с виртуальным A/B, настройте их на наследование базовой конфигурации виртуального устройства A/B:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

Устройствам, запускаемым с виртуальным A/B, требуется только половина размера платы для BOARD_SUPER_PARTITION_SIZE , поскольку слоты B больше не находятся в режиме super. То есть BOARD_SUPER_PARTITION_SIZE должен быть больше или равен сумме (размеру групп обновлений) + накладные расходы , которые, в свою очередь, должны быть больше или равны сумме (размеру разделов) + накладные расходы .

Для Android 13 и более поздних версий, чтобы включить сжатие снимков с помощью Virtual A/B, унаследуйте следующую базовую конфигурацию:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)

Это позволяет создавать снимки пользовательского пространства с помощью Virtual A/B при использовании метода безоперационного сжатия. Затем вы можете настроить метод сжатия на один из поддерживаемых методов: zstd и lz4 . В Android 15 сжатие можно дополнительно настроить в соответствии с потребностями устройства. Дополнительную информацию см. в разделе Точная настройка сжатия .

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

В Android 12, чтобы включить сжатые снимки с помощью Virtual A/B, унаследуйте следующую базовую конфигурацию:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

XOR-сжатие

На устройствах, обновляющихся до Android 13 и более поздних версий, функция сжатия XOR не включена по умолчанию. Чтобы включить сжатие XOR, добавьте следующее в файл .mk устройства.

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true

Сжатие XOR включено по умолчанию для устройств, наследуемых от android_t_baseline.mk .

Объединение пользовательского пространства

В современной версии Virtual A/B (Android T и более поздние версии) процесс слияния снимков происходит полностью в пользовательском пространстве. Это изменение стало возможным благодаря snapuserd и dm-user. На устройствах, запускаемых с Android 13 и выше, объединение пользовательского пространства включено по умолчанию, а для обновления старых устройств это свойство можно установить следующим образом:

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true

Управление загрузкой HAL

HAL управления загрузкой предоставляет OTA-клиентам интерфейс для управления загрузочными слотами. Virtual A/B требует незначительного обновления версии HAL управления загрузкой, поскольку необходимы дополнительные API-интерфейсы для обеспечения защиты загрузчика во время прошивки или сброса настроек. См. IBootControl.hal и Types.hal для получения последней версии определения HAL.

// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };

// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
// Recommended implementation

Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}

Изменения Fstab

Целостность раздела метаданных важна для процесса загрузки, особенно сразу после применения OTA-обновления. Таким образом, раздел метаданных необходимо проверить до того, как first_stage_init смонтирует его. Чтобы это произошло, добавьте флаг check fs_mgr к записи /metadata . Ниже приведен пример:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

Требования ядра

Чтобы включить создание снимков, установите для CONFIG_DM_SNAPSHOT значение true .

Для устройств, использующих F2FS, включите флаг f2fs:export FS_NOCOW_FL в пользовательское исправление ядра, чтобы исправить закрепление файлов. Включите также патч ядра f2fs: support выровненных закрепленных файлов .

Virtual A/B опирается на функции, добавленные в версии ядра 4.3: бит состояния переполнения в целях snapshot и snapshot-merge . Все устройства, запускаемые с Android 9 и более поздних версий, уже должны иметь ядро ​​версии 4.4 или более поздней версии.

Чтобы включить сжатые снимки, минимальная поддерживаемая версия ядра — 4.19. Установите CONFIG_DM_USER=m или CONFIG_DM_USER=y . При использовании первого (модуля) модуль должен быть загружен на виртуальный диск первого этапа. Этого можно добиться, добавив в Makefile устройства следующую строку:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Изменения в инструментах быстрой загрузки

Android 11 вносит следующие изменения в протокол быстрой загрузки:

  • getvar snapshot-update-status — Возвращает значение, которое HAL управления загрузкой сообщил загрузчику:
    • Если состояние MERGING , загрузчик должен вернуть merging .
    • Если состояние SNAPSHOTTED , загрузчик должен вернуть snapshotted .
    • В противном случае загрузчик должен вернуть none .
  • snapshot-update merge — завершает операцию слияния, загружаясь при необходимости в Recovery/fastbootd. Эта команда действительна только в том случае, если snapshot-update-statusmerging , и поддерживается только в fastbootd.
  • snapshot-update cancel — устанавливает статус слияния HAL элемента управления загрузкой в CANCELLED . Эта команда недействительна, когда устройство заблокировано.
  • erase или wipeerase или wipe metadata , userdata или раздела, содержащего статус слияния для HAL управления загрузкой, должен проверять статус слияния моментальных снимков. Если статус MERGING или SNAPSHOTTED , устройство должно прервать операцию.
  • set_active — команда set_active , изменяющая активный слот, должна проверять статус слияния моментальных снимков. Если статус MERGING , устройство должно прервать операцию. Слот можно безопасно изменить в состоянии SNAPSHOTTED .

Эти изменения призваны предотвратить случайную невозможность загрузки устройства, но они могут помешать работе автоматизированных инструментов. Когда команды используются как компонент прошивки всех разделов, например, при запуске fastboot flashall , рекомендуется использовать следующий порядок действий:

  1. Запросить getvar snapshot-update-status .
  2. В случае merging или snapshotted выполните snapshot-update cancel .
  3. Продолжайте мигать.

Уменьшите требования к хранению

Устройствам, у которых нет полного хранилища A/B, выделенного в super, и которые планируют использовать /data по мере необходимости, настоятельно рекомендуется использовать инструмент сопоставления блоков. Инструмент сопоставления блоков обеспечивает единообразие распределения блоков между сборками, сокращая ненужные записи в снимок. Это описано в разделе «Уменьшение размера OTA» .

Алгоритмы ОТА-сжатия

Пакеты OTA можно настроить под различные показатели производительности. Android предоставляет несколько поддерживаемых методов сжатия ( lz4 , zstd и none ), которые имеют компромисс между временем установки, использованием пространства COW, временем загрузки и временем слияния снимков. Опцией по умолчанию, включенной для виртуального ab со сжатием, является lz4 compression method .

Точная настройка сжатия

Алгоритмы сжатия можно дополнительно настроить с помощью двух методов: ( уровень сжатия ) (степень сжатия, достигаемая за счет скорости) и ( коэффициент сжатия ) (максимальный размер сжимаемого окна). Уровень сжатия доступен для определенных алгоритмов, таких как zstd , и изменение уровня влечет за собой компромисс между скоростью и степенью сжатия. Коэффициент сжатия описывает максимальный размер окна сжатия, используемый во время установки OTA. По умолчанию установлено значение 64 КБ, но его можно переопределить, настроив параметр сборки PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR . Поддерживаемые коэффициенты сжатия 4k, 8k, 16k, 32k, 64k, 128k и 256k.

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Дополнительный OTA на Pixel 8 Pro

Время установки без учета постустановочной фазы Использование пространства COW Время загрузки после OTA Время слияния снимков
лз4 18 мин 15 с 2,5 ГБ 32,7 сек. 98,6 сек.
ЗСТД 24 мин 49 с 2,05 ГБ 36,3 сек. 133,2 сек.
никто 16 минут 42 секунды 4,76 ГБ 28,7 сек. 76,6 сек.

Полное OTA на Pixel 8 Pro

Время установки без учета постустановочной фазы Использование пространства COW Время загрузки после OTA Время слияния снимков
лз4 15 минут 11 секунд 4,16 ГБ 17,6 сек. 82,2 сек.
ЗСТД 16 минут 19 секунд 3,46 ГБ 21,0 сек. 106,3 сек.
никто 13 минут 33 секунды 6,39 ГБ 18,5 сек. 92,5 сек.