Supporto degli aggiornamenti OTA

Per supportare gli aggiornamenti over-the-air (OTA) , 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 a qualsiasi lavoro di ripristino in sospeso (ad esempio, l'applicazione di un OTA o la rimozione di dati) di continuare fino al completamento.

Per dettagli sul contenuto di un blocco nella flash utilizzato per le comunicazioni dal ripristino e dal bootloader, fare riferimento a 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 OTA dovrebbero essere aggiornabili mentre il sistema principale è avviato (e non aggiornate durante il ripristino).

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

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

Supporto per il controllo di avvio HAL

Il bootloader deve supportare l'HAL boot_control come definito in hardware/libhardware/include/hardware/boot_control.h ). Il programma di aggiornamento interroga l' HAL del controllo di avvio , aggiorna lo slot di avvio non attualmente in uso, modifica lo slot attivo utilizzando l'HAL e si riavvia nel sistema operativo aggiornato. Per i dettagli, vedere Implementazione dell'HAL di controllo di avvio .

Supporto per gli slot

Il bootloader deve supportare le funzionalità relative a partizioni e slot, tra cui:

  • I nomi delle partizioni devono includere un suffisso che identifichi quali partizioni appartengono a un particolare slot nel bootloader. Per ciascuna di queste partizioni, esiste una variabile corrispondente has-slot: partition base name con un valore yes . Gli slot sono denominati in ordine alfabetico come a, b, c, ecc. corrispondenti alle partizioni con il suffisso _a , _b , _c , ecc. Il bootloader dovrebbe informare il 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 che si avviano con Android 12 o versioni successive.

  • Il valore slot-retry-count viene reimpostato su un valore positivo (solitamente 3 ), dall'HAL del controllo di avvio tramite il callback setActiveBootSlot o tramite il comando fastboot set_active . Quando si modifica una partizione che fa parte di uno slot, il bootloader cancella "avviato correttamente" e reimposta il conteggio dei 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 slotting del bootloader
  1. Determina quale slot tentare. Non tentare di caricare uno slot contrassegnato come slot-unbootable . Questo slot dovrebbe essere coerente con i valori restituiti da fastboot e viene definito slot corrente.

  2. Se lo slot corrente non è contrassegnato come slot-successful e ha un slot-retry-count = 0 , contrassegna lo slot corrente come slot-unbootable . Quindi seleziona uno slot diverso che non sia contrassegnato unbootable e sia contrassegnato come slot-successful ; questo slot è ora lo slot selezionato. Se non è disponibile alcuno slot corrente, eseguire l'avvio in ripristino o visualizzare un messaggio di errore significativo all'utente.

  3. Seleziona il boot.img appropriato e includi il percorso per correggere la partizione di sistema sulla riga di comando del kernel.

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

  5. Stivale. Se non contrassegnato slot-successful , decrementa slot-retry-count .

L'utilità fastboot determina quale partizione eseguire il flashing durante l'esecuzione di comandi flash. Ad esempio, eseguendo il comando fastboot flash system system.img interroga prima la variabile current-slot , quindi concatena il risultato in system per generare il nome della partizione che deve essere flashata ( system_a , system_b , ecc.).

Quando si imposta lo slot corrente utilizzando il comando fastboot set_active o il comando HAL setActiveBootSlot del controllo di avvio, il bootloader dovrebbe aggiornare lo slot corrente, cancellare slot-unbootable e slot-successful e reimpostare il conteggio dei tentativi (questo è l'unico modo per cancellare slot-unbootable ).

Dispositivi senza aggiornamenti A/B

Per supportare gli aggiornamenti OTA sui dispositivi che non utilizzano aggiornamenti A/B (vedi Dispositivi aggiornabili non 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 alcune partizioni supportate ( cache , userdata ) e di scriverla nella partizione system .

  • Il bootloader dovrebbe supportare il riavvio direttamente in modalità di ripristino.

  • Se gli aggiornamenti dell'immagine della radio sono supportati, anche la partizione recovery dovrebbe essere in grado di eseguire il flashing della radio. Ciò può essere ottenuto in due modi:

    • Il bootloader lampeggia la radio. In questo caso, dovrebbe essere possibile riavviare dalla partizione di ripristino nel bootloader per completare l'aggiornamento.

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