Virtuelle A/B-Patches implementieren

Führen Sie die folgenden Patches per Cherry-Picking aus, um die folgenden bekannten Probleme zu beheben.

Zuweisbaren Speicherplatz beim Sideloading richtig prüfen

Das Sideloading eines vollständigen OTA-Pakets auf einem virtuellen A/B-Gerät mit einer Superpartition, deren Größe kleiner als *2 × Summe(Größe der Updategruppen)* ist, kann mit dem folgenden Fehler im Wiederherstellungsprotokoll /tmp/recovery.log fehlschlagen:

The maximum size of all groups with suffix _b (...) has exceeded half of allocatable space for dynamic partitions ...

Hier ein Beispiel für das Log:

[INFO:dynamic_partition_control_android.cc(1020)] Will overwrite existing partitions. Slot A may be unbootable until update finishes!
[...]
[ERROR:dynamic_partition_control_android.cc(803)] The maximum size of all groups with suffix _b (2147483648) has exceeded half of allocatable space for dynamic partitions 1073741824.

Wenn dieses Problem auftritt, wähle CL1399393 aus, erstelle das Image neu und flashe die Boot-Partition oder die Recovery-Partition, wenn das Gerät Recovery nicht als Boot verwendet.

Segmentierungsfehler beim Zusammenführen beheben

Nach der Anwendung eines OTA-Updates stürzt CleanupPreviousUpdateAction während des VAB-Merge-Vorgangs ab, wenn update_engine_client --cancel aufgerufen wird. Ein potenzieller Wild-Pointer-Fehler tritt auch auf, wenn markSlotSuccessful spät eintrifft.

Das Problem wurde durch Hinzufügen der Funktion StopActionInternal behoben. CleanupPreviousUpdateAction bricht ausstehende Aufgaben beim Beenden ab. Es wird eine Variable verwaltet, die die Aufgaben-ID der ausstehenden Aufgabe im Nachrichtenloop verfolgt. Beim Beenden wird die ausstehende Aufgabe abgebrochen, um einen Segmentierungsfehler zu vermeiden.

Achten Sie darauf, dass die folgenden Änderungen in Ihrem Android 11-Quellbaum enthalten sind, um SIGSEGV-Abstürze in update_engine während des Zusammenführens zu beheben:

  • CL 1439792 (Voraussetzung für CL 1439372)
  • CL 1439372 (CleanupPreviousUpdateAction: cancel pending tasks on destroy)
  • CL 1663460 (Behebung des potenziellen Wild-Pointer-Fehlers, wenn markSlotSuccessful spät eintrifft)

Vorzeitiges Zusammenführen von „update_engine“ verhindern

Wenn ein Gerät mit Android 11 oder höher gestartet wird und der Startvorgang abgeschlossen ist, ruft update_engine die Funktionen ScheduleWaitMarkBootSuccessful() und WaitForMergeOrSchedule() auf. Dadurch wird der Zusammenführungsprozess gestartet. Das Gerät wird jedoch mit dem alten Slot neu gestartet. Da die Zusammenführung bereits begonnen hat, kann das Gerät nicht mehr hochgefahren werden und ist nicht mehr funktionsfähig.

Nehmen Sie die folgenden Änderungen an Ihrem Quellbaum vor. CL 1664859 ist optional.

  • CL 1439792 (Voraussetzung für CL 1439372)
  • CL 1439372 (CleanupPreviousUpdateAction: cancel pending tasks on destroy)
  • CL 1663460 (Behebung des potenziellen Wild-Pointer-Fehlers, wenn markSlotSuccessful spät eintrifft)
  • CL 1664859 (optional – fügen Sie unittest für CleanupPreviousUpdateAction hinzu)

Korrekte dm-verity-Konfiguration sicherstellen

Unter Android 11 und höher können Geräte versehentlich mit den folgenden dm-verity-Optionen konfiguriert werden:

  • CONFIG_DM_VERITY_AVB=y im Kernel
  • Der Bootloader ist für die Verwendung eines beliebigen Verity-Modus konfiguriert (z. B. AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE) ohne AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO.

Bei dieser Gerätekonfiguration führt jeder Verity-Fehler dazu, dass die vbmeta-Partition beschädigt wird und Geräte, die nicht A/B-Geräte sind, nicht mehr funktionieren. Wenn ein Merge gestartet wurde, können A/B-Geräte ebenfalls nicht mehr funktionieren. Verwenden Sie nur den AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO-Verity-Modus.

  1. Legen Sie CONFIG_DM_VERITY_AVB=n im Kernel fest.
  2. Konfigurieren Sie Geräte stattdessen für die Verwendung des Modus AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO.

Weitere Informationen finden Sie in der Verity-Dokumentation unter dm-verity-Fehler beheben.

Prüfen, ob die zusammengeführte Datei richtig konfiguriert ist

Wenn Sie System- und Anbieter-Images separat erstellen und dann merge_target_files verwenden, um sie zusammenzuführen, werden virtuelle A/B-Konfigurationen möglicherweise während des Zusammenführungsvorgangs fälschlicherweise entfernt. Um zu prüfen, ob die Virtual A/B-Konfigurationen in der zusammengeführten Zieldatei korrekt sind, wenden Sie die folgenden Patches an: CL 2084183 (merge identical key/val pairs in dynamic partition info).

Erforderliche Komponenten aktualisieren

Ab Android 13 wurde snapuserd von der Vendor-Ramdisk in die generische Ramdisk verschoben. Wenn Ihr Gerät auf Android 13 aktualisiert wird, kann es sein, dass sowohl die Vendor-Ramdisk als auch die generische Ramdisk eine Kopie von snapuserd enthalten. In diesem Fall ist für Virtual A/B die Systemkopie von snapuserd erforderlich. Damit die richtige Kopie von snapuserd vorhanden ist, wende CL2031243 an (kopiere snapuserd in first_stage_ramdisk).