Aggiornamenti di sistema A/B

SDV segue l'approccio standard di Android per gli aggiornamenti di sistema A/B (senza interruzioni). La documentazione AOSP si applica principalmente a SDV. Questa pagina descrive l'utilizzo specifico di SDV e i percorsi noti per la creazione e l'applicazione dei pacchetti di aggiornamento.

Al momento, SDV è configurato per utilizzare gli aggiornamenti A/B non virtuali.

Implementare l'HAL di controllo dell'avvio

L'immagine SDV Core per Cuttlefish (sdv_core_cf) fornisce un'implementazione standard dell'HAL di controllo dell'avvio basata su hardware/interfaces/boot/aidl/default/. Gli altri bootloader devono implementare l'HAL per supportare gli aggiornamenti A/B.

Per maggiori dettagli, consulta la sezione Implementare l'HAL di controllo dell'avvio della documentazione AOSP. Puoi utilizzare bootctl incluso nelle immagini SDV di debug (eng e userdebug) per testare l'implementazione.

Generare un pacchetto OTA

Per saperne di più, consulta: Creare pacchetti OTA. Le istruzioni riportate in questa pagina seguono la documentazione AOSP con piccole modifiche.

Aggiornamento completo

Dalla radice del repository:

source build/envsetup.sh && lunch sdv_core_cf-trunk_staging-userdebug
mkdir dist_output
m dist DIST_DIR=dist_output

Questi comandi producono file di destinazione nella directory dist_output. Per le build locali di sdv_core_cf, in genere si tratta di sdv_core_cf-target_files-$USER.zip.

Per generare un pacchetto OTA, devi utilizzare ota_from_target_files. A differenza di AOSP, il pacchetto non viene creato come parte di m dist.

m ota_from_target_files
ota_from_target_files \
  dist_output/sdv_core_cf-target_files-$USER.zip \
  ota_update.zip

Aggiornamento incrementale

Stessa chiamata ota_from_target_files di 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

Installare un pacchetto OTA

Gli aggiornamenti vengono installati utilizzando il servizio update_engine. Le build di debug di SDV includono update_engine_client, che può essere utilizzato per eseguire il debug e testare la procedura di aggiornamento.

Per installare un pacchetto OTA, esegui:

system/update_engine/scripts/update_device.py ota_update.zip

Se l'aggiornamento viene installato correttamente (lo stato finale è UPDATE_STATUS_UPDATED_NEED_REBOOT e il risultato è ErrorCode::kSuccess), verrà attivato al riavvio successivo.

Controllo delle versioni

Per gli aggiornamenti di sistema, SDV utilizza i metadati del pacchetto OTA di Android per determinare se un pacchetto OTA soddisfa i requisiti e può essere installato.

Anche per APEX, SDV segue i concetti di Android relativi all'aggiornabilità. Pertanto, un APEX può essere aggiornato quando non è un bootstrap APEX. Gli APEX di bootstrap devono essere aggiornati tramite gli aggiornamenti di sistema e:

  • La versione dichiarata è superiore alla versione preinstallata ed entrambe sono maggiori o uguali a 1,

oppure

  • La versione dichiarata è un APEX non preinstallato e la versione è superiore a quella nella lista bloccata, se presente.

SDV viene in genere eseguito il deployment su più sistemi in una rete. Pertanto, devi assicurarti che gli aggiornamenti apportati a un singolo sistema vengano eseguiti correttamente. Tuttavia, questa attenzione non garantisce che tutti i sistemi possano comunicare correttamente.

È altrettanto fondamentale aggiornare l'intera rete, il che richiede che gli aggiornamenti dei bundle di servizi vengano eseguiti il deployment su tutte le macchine contemporaneamente o che non contengano modifiche che causano interruzioni. Ad esempio, modifiche incompatibili all'interfaccia.

Sebbene SDV non fornisca strumenti per rilevare le modifiche incompatibili, le nostre linee guida descrivono come riconciliare le modifiche apportate alle interfacce, nonché le best practice necessarie per eseguire il deployment delle modifiche.

Inoltre, SDV supporta i meccanismi di rollback per gli aggiornamenti di sistema e APEX. Se il sistema entra involontariamente in uno stato insoddisfacente, possiamo recuperare l'ultimo stato soddisfacente noto.