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ürCleanupPreviousUpdateAction
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
) ohneAVB_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.
- Legen Sie
CONFIG_DM_VERITY_AVB=n
im Kernel fest. - 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).