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 valoreyes
. 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 comandoandroidboot.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 (solitamente3
), dall'HAL del controllo di avvio tramite il callbacksetActiveBootSlot
o tramite il comandofastboot 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.
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.Se lo slot corrente non è contrassegnato come
slot-successful
e ha unslot-retry-count = 0
, contrassegna lo slot corrente comeslot-unbootable
. Quindi seleziona uno slot diverso che non sia contrassegnatounbootable
e sia contrassegnato comeslot-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.Seleziona il
boot.img
appropriato e includi il percorso per correggere la partizione di sistema sulla riga di comando del kernel.Compila il parametro
slot_suffix
della riga di comando del kernel.Stivale. Se non contrassegnato
slot-successful
, decrementaslot-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 partizionesystem
.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.