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
nella partizione misc. Se i dati corrispondono a boot-recovery, il
bootloader esegue l'avvio nell'immagine recovery. Questo metodo consente di completare qualsiasi lavoro di ripristino in attesa (ad esempio l'applicazione di un aggiornamento OTA o la rimozione dei dati).
Per informazioni dettagliate sui contenuti di un blocco nella memoria flash utilizzato per le comunicazioni da ripristino e dal 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 aggiornamento OTA devono essere aggiornabili durante l'avvio del sistema principale (e non aggiornate nel 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
markBootSuccessfuldall'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. Il programma di aggiornamento esegue una 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, vedi
Implementare l'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 appartenenti a un determinato slot nel bootloader. Per ogni partizione di questo tipo, esiste una variabile corrispondente
has-slot:partition base namecon un valore diyes. Gli slot sono denominati alfabeticamente come a, b, c e così via, corrispondenti alle partizioni con il suffisso_a,_b,_ce così via. Il bootloader deve comunicare al sistema operativo lo slot avviato utilizzando la proprietà della riga di comandoandroidboot.slot_suffix. Questa proprietà viene impostata tramite bootconfig per i dispositivi lanciati con Android 12 o versioni successive.Il valore
slot-retry-countviene reimpostato su un valore positivo (in genere3), tramite l'HAL di controllo dell'avvio tramite il callbacksetActiveBootSloto tramite il comandofastboot set_active. Quando modifichi una partizione che fa parte di uno slot, il bootloader cancella "avviato correttamente" e reimposta il numero di tentativi per lo slot.
Il bootloader deve anche determinare quale slot caricare. La figura mostra un esempio di processo decisionale.
Determina lo slot da tentare. Non tentare di caricare uno slot contrassegnato come
slot-unbootable. Questo slot deve essere coerente con i valori restituiti da fastboot e viene chiamato slot corrente.Se lo slot corrente non è contrassegnato come
slot-successfule ha un valoreslot-retry-count = 0, contrassegnalo comeslot-unbootable. Seleziona un altro slot non contrassegnato comeunbootablee contrassegnato comeslot-successful. Questo slot è ora lo slot selezionato. Se non è disponibile alcuno slot corrente, esegui l'avvio in modalità di ripristino o mostra all'utente un messaggio di errore significativo.Seleziona il file
boot.imgappropriato e includi il percorso della partizione di sistema corretta nella riga di comando del kernel.Compila il parametro
slot_suffixdella riga di comando del kernel.Avvia. Se non è contrassegnato come
slot-successful, decrementaslot-retry-count.
L'utilità fastboot determina la partizione da flashare quando esegui i comandi 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 flashare (system_a, system_b e così via).
Quando imposti lo slot corrente utilizzando il comando fastboot set_active o il comando HAL di controllo dell'avvio setActiveBootSlot, il bootloader deve aggiornare lo slot corrente, cancellare slot-unbootable e slot-successful e reimpostare il numero di 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 aggiornabili non A/B), assicurati che il bootloader del dispositivo soddisfi i seguenti criteri.
La partizione
recoverydeve contenere un'immagine in grado di leggere un'immagine di sistema da una partizione supportata (cache,userdata) e scriverla nella partizionesystem.Il bootloader deve supportare l'avvio diretto in modalità di ripristino.
Se sono supportati gli aggiornamenti delle immagini radio, la partizione
recoverydeve essere in grado di flashare la radio. Questa operazione può essere eseguita in due modi:Il bootloader flasha la radio. In questo caso, dovrebbe essere possibile riavviare dalla partizione di ripristino al bootloader per completare l'aggiornamento.
L'immagine di ripristino flasha la radio. Questa funzionalità può essere fornita come libreria binaria o utilità.