Per implementare 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 della partizione misc
. Se i dati corrispondono a boot-recovery
, il bootloader avvia l'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 gli aggiornamenti A/B, assicurati che il bootloader del dispositivo soddisfi i seguenti criteri.
Criteri generali
Tutte le partizioni aggiornate tramite un OTA devono essere aggiornabili durante l'avvio del sistema principale (e non aggiornate in modalità di ripristino).
Per avviare la partizione
system
, il bootloader passa il seguente valore alla 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 l'HAL di controllo dell'avvio
Il bootloader deve supportare l'HAL boot_control
come definito in
hardware/libhardware/include/hardware/boot_control.h
. L'aggiornamento esegue query sull'HAL di controllo dell'avvio, aggiorna lo slot di avvio non in uso, modifica lo slot attivo utilizzando l'HAL e riavvia il sistema operativo aggiornato. Per maggiori dettagli, consulta
Implementazione dell'HAL di controllo
dell'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 le partizioni appartenente a un determinato slot nel bootloader. Per ogni partizione di questo tipo, esiste una variabile corrispondente
has-slot:partition base name
con un valore diyes
. Gli slot sono denominati in ordine alfabetico come a, b, c e così via, corrispondenti alle partizioni con il suffisso_a
,_b
,_c
e così via. Il bootloader deve informare il sistema operativo dello slot da cui è stato eseguito l'avvio utilizzando la proprietà della riga di comandoandroidboot.slot_suffix
. Questa proprietà viene impostata tramite bootconfig per i dispositivi avviati con Android 12 o versioni successive.Il valore
slot-retry-count
viene reimpostato su un valore positivo (di solito3
), dal controllo di avvio HAL tramite il callbacksetActiveBootSlot
o tramite il comandofastboot set_active
. Quando modifichi una partizione che fa parte di uno slot, il bootloader cancella "avvio riuscito" e reimposta il conteggio dei tentativi per lo slot.
Il bootloader deve anche determinare quale slot caricare. La figura mostra un esempio di processo decisionale.
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 e viene definito slot corrente.Se lo slot corrente non è contrassegnato come
slot-successful
e contiene unslot-retry-count = 0
, contrassegnalo comeslot-unbootable
. Quindi, seleziona un altro intervallo che non è contrassegnato comeunbootable
, ma comeslot-successful
. Questo intervallo è ora selezionato. Se non è disponibile alcuno slot, avvia il recupero o mostra un messaggio di errore significativo all'utente.Seleziona
boot.img
appropriato e includi il percorso della partizione di sistema corretta sulla riga di comando del kernel.Compila il parametro
slot_suffix
della riga di comando del kernel.Avvia. Se non è contrassegnato
slot-successful
, decrementaslot-retry-count
.
L'utilità fastboot
determina la partizione da eseguire quando esegui comandi di flash. Ad esempio, l'esecuzione del comando fastboot flash system system.img
esegue prima una query sulla variabile current-slot
, quindi concatena il risultato
al sistema per generare il nome della partizione da eseguire in modalità flash
(system_a
, system_b
e così via).
Quando imposti lo slot corrente utilizzando il comando set_active
fastboot o il comando setActiveBootSlot
HAL di controllo del boot, il bootloader deve 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 gli aggiornamenti A/B (vedi Dispositivi non A/B aggiornabili), 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 partizionesystem
.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 esegue il flashing della radio. In questo caso, dovrebbe essere possibile riavviare dalla partizione di ripristino al bootloader per completare l'aggiornamento.
L'immagine di ripristino fa lampeggiare la radio.Questa funzionalità può essere fornita come libreria binaria o utilità.