Implementare gli aggiornamenti OTA

Per implementare gli aggiornamenti OTA (over-the-air), il bootloader deve essere in grado di accedere a un disco RAM di ripristino durante l'avvio. Se il dispositivo utilizza un'immagine di ripristino AOSP non modificata, il bootloader legge i primi 32 byte sulla partizione misc; se i dati corrispondono a boot-recovery, il bootloader si avvia nell'immagine recovery. Questo metodo consente di continuare il completamento di eventuali attività di recupero in sospeso (ad esempio, l'applicazione di un'agenzia di viaggi online o la rimozione di dati).

Per maggiori dettagli sui contenuti di un blocco in Flash utilizzato per le comunicazioni da parte del ripristino e del bootloader, consulta bootable/recovery/bootloader_message/bootloader_message.h.

Dispositivi con aggiornamenti A/B

Per supportare gli aggiornamenti OTA sui dispositivi che utilizzano aggiornamenti A/B, assicurati che il bootloader del dispositivo soddisfi i seguenti criteri.

Criteri generali

  • Tutte le partizioni aggiornate tramite un'OTA dovrebbero essere aggiornabili mentre il sistema principale è in fase di avvio (e non devono essere aggiornate durante il ripristino).

  • Per avviare la partizione system, il bootloader passa il seguente valore nella riga di comando del kernel: ro root=/dev/[node] rootwait init=/init.

  • È responsabilità del framework Android chiamare markBootSuccessful dall'HAL. Il bootloader non deve mai contrassegnare una partizione come avviata correttamente.

Supporto per il controllo dell'avvio HAL

Il bootloader deve supportare l'HAL boot_control come definito in hardware/libhardware/include/hardware/boot_control.h. Il programma di aggiornamento esegue una query sull'HAL per il controllo dell'avvio, aggiorna lo slot di avvio non in uso, modifica lo slot attivo tramite l'HAL e si riavvia nel sistema operativo aggiornato. Per maggiori dettagli, consulta Implementazione del controllo di avvio HAL.

Supporto per gli slot

Il bootloader deve supportare funzionalità relative alle partizioni e agli slot, tra cui:

  • I nomi delle partizioni devono includere un suffisso che identifichi le partizioni appartenenti a un determinato slot nel bootloader. Per ogni partizione di questo tipo, esiste una variabile corrispondente has-slot:partition base name con il valore yes. Gli slot sono denominati in ordine alfabetico a, b, c e così via corrispondenti alle partizioni con il suffisso _a, _b, _c e così via. Il bootloader deve comunicare al sistema operativo quale slot è stato avviato utilizzando la proprietà della riga di comando androidboot.slot_suffix. Questa proprietà viene impostata tramite bootconfig per i dispositivi con Android 12 o versioni successive.

  • Il valore slot-retry-count viene reimpostato su un valore positivo (di solito 3), dal controllo di avvio HAL tramite il callback setActiveBootSlot o tramite il comando fastboot set_active. Quando modifichi una partizione che fa parte di uno slot, il bootloader cancella lo stato "Avvio riuscito" e reimposta il conteggio dei nuovi tentativi per lo slot.

Il bootloader dovrebbe anche determinare quale slot caricare. La figura mostra un esempio di processo decisionale.

Flusso di slot del bootloader
Figura 1. Flusso di slot del bootloader
  1. Determina quale slot tentare. Non tentare di caricare un'area contrassegnata come slot-unbootable. Questo slot deve essere coerente con i valori restituiti da fastboot ed è indicato come slot corrente.

  2. Se l'area attuale non è contrassegnata come slot-successful e ha slot-retry-count = 0, contrassegnala come slot-unbootable. Poi seleziona un'altra area che non sia contrassegnata come unbootable e contrassegnata come slot-successful; questa area è ora quella selezionata. Se non è disponibile alcun slot corrente, avvia il ripristino o visualizza un messaggio di errore significativo per l'utente.

  3. Seleziona il valore boot.img appropriato e includi il percorso della partizione di sistema corretta nella riga di comando del kernel.

  4. Compila il parametro slot_suffix della riga di comando del kernel.

  5. Avvio. Se non viene contrassegnato come slot-successful, diminuisci slot-retry-count.

L'utilità fastboot determina quale partizione eseguire il flashing quando si eseguono comandi Flash. Ad esempio, l'esecuzione del comando fastboot flash system system.img prima esegue una query sulla variabile current-slot, quindi concatena il risultato al sistema per generare il nome della partizione da lampeggiare (system_a, system_b e così via).

Quando imposti lo slot attuale utilizzando il comando fastboot set_active o il comando boot Control HAL setActiveBootSlot, il bootloader deve aggiornare lo slot attuale, cancellare slot-unbootable e slot-successful e reimpostare il numero di nuovi tentativi (questo è l'unico modo per cancellare slot-unbootable).

Dispositivi senza aggiornamenti A/B

Per supportare gli aggiornamenti OTA sui dispositivi che non utilizzano gli aggiornamenti A/B (vedi Dispositivi non aggiornabili A/B), assicurati che il bootloader del dispositivo soddisfi i seguenti criteri.

  • La partizione recovery deve contenere un'immagine in grado di leggere un'immagine di sistema da una partizione supportata (cache, userdata) e di scriverla nella partizione system.

  • Il bootloader dovrebbe supportare l'avvio diretto in modalità di ripristino.

  • Se gli aggiornamenti delle immagini radio sono supportati, anche la partizione recovery deve essere in grado di far lampeggiare la radio. Questa operazione può essere eseguita in due modi:

    • Il bootloader fa lampeggiare la radio. In questo caso, dovrebbe essere possibile eseguire di nuovo il riavvio dalla partizione di ripristino nel bootloader per completare l'aggiornamento.

    • L'immagine di ripristino fa lampeggiare la radio.Questa funzionalità può essere fornita come libreria binaria o utilità.