Um ein virtuelles A/B auf einem neuen Gerät zu implementieren oder ein bereits veröffentlichtes Gerät nachzurüsten, müssen Änderungen am gerätespezifischen Code vornehmen.
Build-Flags
Geräte mit virtuellem A/B müssen als A/B konfiguriert werden Gerät und muss mit dem dynamisch Partitionen
Geräte, die mit virtuellem A/B gestartet werden, müssen festlegen, dass das virtuelle A/B übernommen wird. Konfiguration der Gerätebasis:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Geräte, die mit virtuellem A/B auf den Markt kommen, benötigen nur halb so viel Boardgröße
BOARD_SUPER_PARTITION_SIZE
, weil sich B-Slots nicht mehr im Super Chat befinden. Das heißt:
BOARD_SUPER_PARTITION_SIZE
muss größer oder gleich sein
sum(Größe der Aktualisierungsgruppen) + Aufwand, die wiederum größer sein müssen
ist als oder gleich sum(size of partitions) +over.
Bei Android 13 und höher wird die komprimierte Ansicht aktiviert. für Snapshots mit virtuellem A/B wird die folgende Basiskonfiguration übernommen:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/android_t_baseline.mk)
Dies ermöglicht Userspace-Snapshots mit virtuellem A/B bei Verwendung einer No-Op
Komprimierungsmethode. Anschließend können Sie die Komprimierungsmethode auf eine der
unterstützten Methoden gz
, zstd
und lz4
.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
Um bei Android 12 komprimierte Snapshots mit Virtuelles A/B, übernehmen Sie die folgende Basiskonfiguration:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
XOR-Komprimierung
Bei Geräten mit einem Upgrade auf Android 13 und höher
Die XOR-Komprimierungsfunktion ist nicht
ist standardmäßig aktiviert. Fügen Sie zur Aktivierung der XOR-Komprimierung Folgendes zur
.mk
-Datei.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
Die XOR-Komprimierung ist standardmäßig für Geräte aktiviert, die Werte von
android_t_baseline.mk
Zusammenführung von Userspaces
Bei Geräten mit einem Upgrade auf Android 13 und höher
Vorgang zum Zusammenführen von Userspaces, wie unter Device Mapper beschrieben
Layering wird nicht durch
Standardeinstellung. Fügen Sie die folgende Zeile in die .mk
des Geräts ein, um das Zusammenführen von Nutzerbereichen zu aktivieren
Datei:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
Das Zusammenführen von Benutzerbereichen ist standardmäßig auf Geräten aktiviert, die mit 13 und höher.
Bootsteuerungs-HAL
Über die Bootsteuerung HAL bietet eine Schnittstelle für OTA-Clients zur Steuerung von Boot-Slots. Virtuelles A/B erfordert ein Upgrade der Nebenversion des HAL für die Bootsteuerung, da zusätzliche APIs sind erforderlich, damit der Bootloader während des Flashens oder Zurücksetzens auf die Werkseinstellungen geschützt ist. Weitere Informationen finden Sie unter iBootControl.hal und types.hal finden Sie die neueste Version der HAL-Definition.
// 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-Änderungen
Die Integrität der Metadatenpartition
ist entscheidend für den Bootvorgang.
vor allem direkt nach der OTA-Aktualisierung. Die Metadatenpartition muss also
geprüft werden, bevor first_stage_init
es bereitstellt. Fügen Sie dazu den
check
-Flag „fs_mgr“ für den Eintrag für /metadata
. Im Folgenden finden Sie
Beispiel:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Kernel-Anforderungen
Setzen Sie CONFIG_DM_SNAPSHOT
auf true
, um die Snapshot-Funktion zu aktivieren.
Fügen Sie bei Geräten mit F2FS das Flag f2fs: export FS_NOCOW_FL to user, um das Anpinnen von Dateien zu beheben. Fügen Sie den f2fs: support ausgerichteten angepinnten file.
Virtual A/B basiert auf Funktionen, die in der Kernel-Version 4.3 hinzugefügt wurden: dem Overflow
Statusbit in den Zielen snapshot
und snapshot-merge
fest. Alle Geräte werden gestartet
mit Android 9 oder höher sollte bereits die Kernel-Version 4.4 oder höher haben.
Zum Aktivieren komprimierter Snapshots wird mindestens Kernel-Version 4.19 unterstützt.
Legen Sie CONFIG_DM_USER=m
oder CONFIG_DM_USER=y
fest. Wenn Sie die erste Variante (ein Modul) verwenden,
muss das Modul in die Ramdisk in der ersten Phase geladen werden. Dies kann erreicht werden, indem
Fügen Sie dem Makefile des Geräts die folgende Zeile hinzu:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Retrofit auf Geräten mit Upgrade auf Android 11
Beim Upgrade auf Android 11 können Geräte, die mit dynamischen Partitionen auf den Markt gekommen sind, das virtuelle A/B nachrüsten. Der Aktualisierungsprozess ist größtenteils derselbe wie bei Geräte, die mit virtuellem A/B auf den Markt gebracht wurden, mit einigen geringfügigen Unterschieden:
Speicherort der COW-Dateien – Für Startgeräte verwendet der OTA-Client den des gesamten verfügbaren Leerraums in der Superpartition, bevor er Speicherplatz in
/data
Für nachrüstbare Geräte ist immer genug Platz in der -Partition, sodass die COW-Datei niemals auf/data
erstellt wird.Funktions-Flags während der Build-Phase: Bei Geräten, die mit Virtual A/B nachgerüstet werden,
PRODUCT_VIRTUAL_AB_OTA
undPRODUCT_VIRTUAL_AB_OTA_RETROFIT
sind festgelegt antrue
, wie hier gezeigt:(call inherit-product, \
(SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
Superpartitionsgröße: Geräte, die mit virtuellem A/B gestartet werden, können reduziert werden.
BOARD_SUPER_PARTITION_SIZE
, weil sich B-Slots nicht im Superbereich befinden -Partition an. Geräte, die auf virtuelles A/B umrüsten, behalten die alte Super Partition bei Größe, sodassBOARD_SUPER_PARTITION_SIZE
größer oder gleich 2 * sum(size of update groups) + Overhead, der wiederum größer oder gleich 2 * sum(size of partitions) + .
Bootloader-Änderungen
Während des Zusammenführungsschritts eines Updates enthält /data
die einzige gesamte Instanz des
Android-Betriebssystem Sobald die Migration gestartet wurde, werden system
, vendor
und
product
Partitionen sind unvollständig, bis der Kopiervorgang abgeschlossen ist. Wenn das Gerät
währenddessen auf die Werkseinstellungen zurückgesetzt werden, entweder durch Wiederherstellung
kann das Gerät nicht gestartet werden.
Schließen Sie vor dem Löschen von /data
die Zusammenführung bei der Wiederherstellung oder im Rollback ab.
Gerätestatus:
- Wenn der neue Build zuvor erfolgreich gestartet wurde, schließen Sie die Migration ab.
- Andernfalls führen Sie ein Rollback zur alten Anzeigenfläche durch:
<ph type="x-smartling-placeholder">
- </ph>
- Führen Sie bei dynamischen Partitionen ein Rollback zum vorherigen Status durch.
- Stellen Sie bei statischen Partitionen den aktiven Slot auf den alten Slot ein.
Sowohl der Bootloader als auch fastbootd
können die Partition /data
löschen, wenn
Gerät entsperrt ist. fastbootd
kann zwar den Abschluss der Migration erzwingen, das
Bootloader funktioniert nicht. Der Bootloader weiß nicht, ob sich eine Zusammenführung in
oder welche Blöcke in /data
die Betriebssystempartitionen darstellen. Geräte müssen
Verhindern, dass der Nutzer das Gerät unwissentlich funktionsunfähig macht (Back-up)
Dazu gehen Sie so vor:
- Implementieren Sie den Boot-Control-HAL, damit der Bootloader den festgelegten Wert lesen kann
mit der Methode
setSnapshotMergeStatus()
. - Wenn der Zusammenführungsstatus
MERGING
oderSNAPSHOTTED
lautet und der Slot wurde in den neu aktualisierten Slot geändert, dann wird eine Anfrage zum Löschenuserdata
,metadata
oder die Partition, in der der Zusammenführungsstatus gespeichert ist, muss im Bootloader abgelehnt wird. - Implementieren Sie den Befehl
fastboot snapshot-update cancel
, damit Nutzer signalisiert dem Bootloader, dass er diesen Schutzmechanismus umgehen möchte. - Ändere die benutzerdefinierten Flash-Tools oder -Skripte so, dass beim Flashen des gesamten Geräts
fastboot snapshot-update cancel
ausgegeben wird. Diese Ausgabe ist sicher, weil Durch das Flashen des gesamten Geräts wird das OTA-Update entfernt. Tools können diesen Befehl erkennen zur Laufzeit durch Implementieren vonfastboot getvar snapshot-update-status
. Dieses können Sie zwischen Fehlerbedingungen unterscheiden.
Beispiel
struct VirtualAbState {
uint8_t StructVersion;
uint8_t MergeStatus;
uint8_t SourceSlot;
};
bool ShouldPreventUserdataWipe() {
VirtualAbState state;
if (!ReadVirtualAbState(&state)) ...
return state.MergeStatus == MergeStatus::MERGING ||
(state.MergeStatus == MergeStatus::SNAPSHOTTED &&
state.SourceSlot != CurrentSlot()));
}
Änderungen an Fastboot-Tools
Android 11 nimmt folgende Änderungen am Fastboot-Modus vor Protokoll:
getvar snapshot-update-status
: gibt den Wert zurück, den der Bootvorgang HAL, der an den Bootloader übermittelt wird: <ph type="x-smartling-placeholder">- </ph>
- Wenn der Status
MERGING
lautet, muss der Bootloadermerging
zurückgeben. - Wenn der Status
SNAPSHOTTED
lautet, muss der Bootloadersnapshotted
zurückgeben. - Andernfalls muss der Bootloader
none
zurückgeben.
- Wenn der Status
snapshot-update merge
: Führt einen Zusammenführungsvorgang aus und startet. Wiederherstellung bzw. Fastbootd ein, wenn nötig. Dieser Befehl ist nur gültig, wennsnapshot-update-status
istmerging
und wird nur in Fastbootd unterstützt.snapshot-update cancel
: Legt den Zusammenführungsstatus der HAL der Bootsteuerung aufCANCELLED
. Dieser Befehl ist ungültig, wenn das Gerät gesperrt ist.erase
oderwipe
: Einerase
oderwipe
vonmetadata
,userdata
oder Eine Partition mit dem Zusammenführungsstatus für den HAL der Bootsteuerung sollte überprüft werden. Status der Snapshot-Zusammenführung. Lautet der StatusMERGING
oderSNAPSHOTTED
, sollte der Vorgang abgebrochen werden.set_active
: Einset_active
-Befehl, mit dem der aktive Slot geändert wird sollte der Status der Snapshot-Zusammenführung überprüft werden. Wenn der StatusMERGING
lautet, sollte der Vorgang abgebrochen werden. Der Slot kann sicher imSNAPSHOTTED
.
Durch diese Änderungen soll verhindert werden, dass ein Gerät versehentlich nicht mehr bootfähig ist.
aber sie können automatisierte Tools stören. Wenn die Befehle als
zum Flashen aller Partitionen, wie z. B. fastboot flashall
,
wird empfohlen, den folgenden Ablauf zu verwenden:
- Abfrage
getvar snapshot-update-status
. - Wenn
merging
odersnapshotted
, gibsnapshot-update cancel
aus. - Fahren Sie dann mit den blinkenden Schritten fort.
Speicheranforderungen reduzieren
Geräte, die keinen vollen A/B-Speicher in Super zugewiesen haben und für die ein
um bei Bedarf /data
zu verwenden, wird dringend empfohlen, die Blockzuordnung zu verwenden.
. Das Blockzuordnungstool sorgt für einheitliche
Blockzuweisungen zwischen Builds.
unnötige Schreibvorgänge in den Snapshot reduzieren. Dies wird unter Reduzierung
OTA-Größe:
OTA-Komprimierungsmethoden
OTA-Pakete können für verschiedene Leistungsmesswerte abgestimmt werden. Android bietet
mehrere unterstützte Komprimierungsmethoden (gz
, lz4
, zstd
und none
), die
Kompromisse zwischen Installationszeit, COW-Speichernutzung, Startzeit und Snapshot.
Zeitpunkt der Zusammenführung. Die Standardoption für virtuelle Abs mit Komprimierung ist die
gz compression method
(Hinweis: Die relative Leistung zwischen den Komprimierungsmethoden.
variiert je nach CPU-Geschwindigkeit und Speicherdurchsatz.
auf dem Gerät. Für alle unten generierten OTA-Pakete ist PostInstall deaktiviert, was
verlangsamt die Startzeit leicht. Die dynamische Gesamtpartitionsgröße einer
Das vollständige Kontingent ohne Komprimierung beträgt 4,81 GB.
Inkrementelles OTA-Update auf Pixel 6 Pro
Installationszeit ohne Phase nach der Installation | COW-Speichernutzung | Nach OTA-Startzeit | Zeitpunkt der Snapshot-Zusammenführung | |
---|---|---|---|---|
GZ | 24 Min. | 1,18 GB | 40,2 Sek. | 45,5 Sek. |
lz4 | 13 Min. | 1,49 GB | 37,4 Sek. | 37,1 Sek. |
Keine | 13 Min. | 2,90 GB | 37,6 Sek. | 40,7 Sek. |
Vollständiges OTA-Update auf Pixel 6 Pro
Installationszeit ohne Phase nach der Installation | COW-Speicherplatznutzung | Nach OTA-Startzeit | Zeitpunkt der Snapshot-Zusammenführung | |
---|---|---|---|---|
GZ | 23 Min. | 2,79 GB | 24,9 Sek. | 41,7 Sek. |
lz4 | 12 Min. | 3,46 GB | 20,0 Sek. | 25,3 Sek. |
Keine | 10 Min. | 4,85 GB | 20,6 Sek. | 29,8 Sek. |