SDV folgt dem standardmäßigen Android-Ansatz für nahtlose A/B-Systemupdates. Die AOSP-Dokumentation gilt hauptsächlich für SDV. Auf dieser Seite wird die Verwendung speziell für SDV und bekannte gute Pfade zum Erstellen und Anwenden von Updatepaketen beschrieben.
Das SDV ist für die Verwendung von nicht virtuellen A/B-Updates konfiguriert. Informationen zum Konfigurieren und Auslösen von A/B-Updates für eine benutzerdefinierte /oem_ab-Partition aus einem Dienst-Bundle finden Sie unter OEM-A/B-Partitionsupdates.
Boot Control HAL implementieren
Das SDV Core-Image für Cuttlefish (sdv_core_cf) bietet eine Standardimplementierung der Boot Control HAL basierend auf hardware/interfaces/boot/aidl/default/. Andere Bootloader müssen die HAL implementieren, um A/B-Updates zu unterstützen.
Weitere Informationen findest du in der AOSP-Dokumentation im Abschnitt Boot Control HAL implementieren. Sie können bootctl verwenden, das in den Debug-SDV-Images (eng und userdebug) enthalten ist, um die Implementierung zu testen.
OTA-Paket generieren
Weitere Informationen finden Sie unter OTA-Pakete erstellen. Die Anleitung auf dieser Seite folgt der AOSP-Dokumentation mit geringfügigen Abweichungen.
Vollständige Aktualisierung
Aus dem Repository-Stammverzeichnis:
source build/envsetup.sh && lunch sdv_core_cf-aosp_current-userdebug
mkdir dist_output
m dist DIST_DIR=dist_output
Diese Befehle erzeugen Zieldateien im Verzeichnis dist_output. Bei lokalen Builds von sdv_core_cf ist dies normalerweise sdv_core_cf-target_files-$USER.zip.
Zum Erstellen eines OTA-Pakets musst du ota_from_target_files verwenden. Anders als im AOSP wird das Paket nicht als Teil von m dist erstellt.
m ota_from_target_files
ota_from_target_files \
dist_output/sdv_core_cf-target_files-$USER.zip \
ota_update.zip
Inkrementelles Update
Gleicher ota_from_target_files-Aufruf wie im AOSP:
ota_from_target_files \
-i PREVIOUS-sdv_core_cf-target_files.zip \
dist_new/sdv_core_cf-target_files-$USER.zip \
incremental_ota_update.zip
OTA-Paket installieren
Updates werden über den Dienst update_engine installiert. Debug-SDV-Builds enthalten update_engine_client, mit dem der Updateprozess debuggt und getestet werden kann.
Führe den folgenden Befehl aus, um ein OTA-Paket zu installieren:
system/update_engine/scripts/update_device.py ota_update.zip
Wenn das Update korrekt installiert wurde (der endgültige Status ist UPDATE_STATUS_UPDATED_NEED_REBOOT und das Ergebnis ist ErrorCode::kSuccess), wird das Update beim nächsten Neustart aktiviert.
Versionsverwaltung
Für Systemupdates verwendet SDV die OTA-Paketmetadaten von Android, um festzustellen, ob ein OTA-Paket die Anforderungen erfüllt und installiert werden kann.
Auch für APEX folgt SDV den Konzepten von Android in Bezug auf die Aktualisierbarkeit. Daher kann ein APEX aktualisiert werden, wenn es sich nicht um ein Bootstrap-APEX handelt. Bootstrap-APEX muss über Systemupdates aktualisiert werden und entweder:
- Die deklarierte Version ist höher als die vorinstallierte Version und beide sind größer oder gleich 1.
oder
- Die deklarierte Version ist ein nicht vorinstalliertes APEX und die Version ist höher als die Version in der Sperrliste, falls aufgeführt.
SDV wird in der Regel auf mehreren Systemen in einem Netzwerk bereitgestellt. Daher müssen Sie dafür sorgen, dass Aktualisierungen an einem einzelnen System korrekt ausgeführt werden. Trotzdem ist damit nicht garantiert, dass alle Systeme richtig kommunizieren können.
Ebenso wichtig ist es, das gesamte Netzwerk zu aktualisieren. Dazu müssen Updates für Dienst-Bundles entweder gleichzeitig auf allen Maschinen bereitgestellt werden oder die Updates dürfen keine funktionsgefährdenden Änderungen enthalten. Beispielsweise inkompatible Änderungen an der Schnittstelle.
SDV bietet zwar keine Tools zum Erkennen inkompatibler Änderungen, aber in unseren Richtlinien wird beschrieben, wie Sie Änderungen an Schnittstellen abgleichen und welche Best Practices für die Bereitstellung der Änderungen erforderlich sind.
Darüber hinaus unterstützt SDV Rollback-Mechanismen für System- und APEX-Updates. Wenn das System unbeabsichtigt in einen unbefriedigenden Zustand wechselt, können wir den letzten bekannten zufriedenstellenden Zustand wiederherstellen.