Чтобы реализовать виртуальный 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 alignment pinned file .
Virtual A/B опирается на функции, добавленные в версии ядра 4.3: бит состояния переполнения в целях snapshot
и snapshot-merge
. Все устройства, запускаемые с Android 9 и более поздними версиями, должны иметь версию ядра 4.4 или более позднюю.
Для включения сжатых снимков минимальная поддерживаемая версия ядра — 4.19. Установите CONFIG_DM_USER=m
или CONFIG_DM_USER=y
. Если используется первый вариант (модуль), модуль должен быть загружен в ramdisk первой стадии. Этого можно добиться, добавив следующую строку в Makefile устройства:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Изменения в инструментах Fastboot
Android 11 вносит следующие изменения в протокол fastboot:
-
getvar snapshot-update-status
— Возвращает значение, которое HAL управления загрузкой передал загрузчику:- Если состояние —
MERGING
, загрузчик должен вернутьmerging
. - Если состояние
SNAPSHOTTED
, загрузчик должен вернутьsnapshotted
. - В противном случае загрузчик должен вернуть
none
.
- Если состояние —
-
snapshot-update merge
— Завершает операцию слияния, загружаясь в recovery/fastbootd при необходимости. Эта команда действительна только еслиsnapshot-update-status
merging
, и поддерживается только в fastbootd. -
snapshot-update cancel
— Устанавливает состояние слияния HAL управления загрузкой наCANCELLED
. Эта команда недействительна, если устройство заблокировано. -
erase
илиwipe
—erase
илиwipe
metadata
,userdata
или раздела, содержащего статус слияния для управления загрузкой HAL, должно проверить статус слияния моментального снимка. Если статус —MERGING
илиSNAPSHOTTED
, устройство должно прервать операцию. -
set_active
— Командаset_active
, которая изменяет активный слот, должна проверить статус слияния снимков. Если статус —MERGING
, устройство должно прервать операцию. Слот можно безопасно изменить в состоянииSNAPSHOTTED
.
Эти изменения предназначены для предотвращения случайного превращения устройства в незагружаемое, но они могут нарушить работу автоматизированных инструментов. Когда команды используются как компонент прошивки всех разделов, например, запуск fastboot flashall
, рекомендуется использовать следующий поток:
- Запрос
getvar snapshot-update-status
. - При
merging
илиsnapshotted
выполните командуsnapshot-update cancel
. - Продолжайте выполнять шаги по перепрошивке.
Сокращение требований к хранению
Устройствам, у которых не выделено полное хранилище A/B в super и которые ожидают использования /data
по мере необходимости, настоятельно рекомендуется использовать инструмент сопоставления блоков. Инструмент сопоставления блоков поддерживает согласованное распределение блоков между сборками, сокращая ненужные записи в снимок. Это описано в разделе Сокращение размера OTA .
Алгоритмы сжатия OTA
Пакеты OTA можно настраивать для различных показателей производительности. Android предоставляет несколько поддерживаемых методов сжатия ( lz4
, zstd
и none
), которые имеют компромиссы между временем установки, использованием пространства COW, временем загрузки и временем слияния снимков. Параметр по умолчанию, включенный для virtual ab со сжатием, — это lz4 compression method
.
Тонкая настройка сжатия
Алгоритмы сжатия можно дополнительно настроить двумя способами: ( уровень сжатия ) (величина сжатия, достигаемая за счет скорости) и ( коэффициент сжатия ) (максимальный размер сжимаемого окна). Уровень сжатия доступен для определенных алгоритмов, таких как zstd
, и изменение уровня влечет за собой компромисс между скоростью и степенью сжатия. Коэффициент сжатия описывает максимальный размер окна сжатия, используемый во время установки OTA. Значение по умолчанию составляет 64k, но его можно переопределить, настроив параметр сборки PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR
. Поддерживаемые коэффициенты сжатия: 4k, 8k, 16k, 32k, 64k, 128k и 256k.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Инкрементное OTA на Pixel 8 Pro
Время установки без фазы после установки | Использование пространства COW | Время загрузки после OTA | Время слияния снимков | |
---|---|---|---|---|
lz4 | 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 | Время слияния снимков | |
---|---|---|---|---|
lz4 | 15 мин 11с | 4,16 ГБ | 17,6 сек. | 82,2 сек. |
зстд | 16 мин 19с | 3,46 ГБ | 21,0 сек. | 106.3 сек. |
никто | 13 мин 33с | 6,39 ГБ | 18,5 сек. | 92,5 сек. |