In Android 12, la funzionalità bootconfig sostituisce le opzioni della riga di comando del kernel androidboot.* in uso con Android 11 e versioni precedenti. La funzionalità bootconfig è un meccanismo per trasmettere i dettagli di configurazione dalla build e dal bootloader ad Android 12.
Questa funzionalità consente di separare i parametri di configurazione per lo spazio utente di Android da quelli per il kernel. Lo spostamento dei lunghi parametri del kernel androidboot.* nel file bootconfig crea spazio nella riga di comando del kernel e lo rende disponibile per future espansioni.
Sia il kernel sia lo spazio utente di Android devono supportare bootconfig.
- Prima release con questo supporto: Android 12
- Prima versione kernel con questo supporto: kernel 12-5.4.xx
Implementa la funzionalità bootconfig per i nuovi dispositivi che vengono lanciati con una versione kernel 12-5.10.xx. Non è necessario implementarla se esegui l'upgrade dei dispositivi.
Esempi e codice sorgente
Quando visualizzi gli esempi e il codice sorgente in questa sezione, tieni presente che il formato del codice bootconfig è solo leggermente diverso dal formato della riga di comando del kernel utilizzata in Android 11 e versioni precedenti.
Tuttavia, la seguente differenza è importante per il tuo utilizzo:
- I parametri devono essere separati dalla sequenza di escape di nuova riga
\n, non da spazi.
Esempio di bootloader
Per un esempio di bootloader, consulta l'implementazione del bootloader di riferimento U-boot di Cuttlefish. Di seguito sono elencati due commit nel riferimento. Il primo aggiorna la versione del supporto dell'intestazione di avvio all'ultima versione. Nell'esempio, il primo commit aggiorna (o uprev) il supporto della versione a quella successiva, v4. Il secondo esegue due operazioni: aggiunge la gestione di bootconfig e mostra come aggiungere parametri in fase di runtime:
- Aggiorna la versione del supporto dell'intestazione di avvio all'ultima versione v4 versione.
- Aggiungi la gestione di bootconfig.
Esempio di build
Per un esempio di build che mostra le modifiche di mkbootimg per creare
vendor_boot.img con l'intestazione di avvio del fornitore v4, consulta mkbootimg changes for
bootconfig.
Consulta le modifiche di Cuttlefish per eseguire le seguenti operazioni:
- Utilizza (o aggiorna a) la versione dell'intestazione di avvio del fornitore v4.
- Aggiungi bootconfig alla riga di comando del kernel e sposta i parametri selezionati in bootconfig.
Implementazione
I partner devono aggiungere il supporto ai propri bootloader e spostare i parametri androidboot.* in fase di build dalla riga di comando del kernel al file bootconfig. Il modo migliore per implementare questa modifica è farlo in modo incrementale. Per informazioni su come seguire una procedura incrementale, consulta la sezione
Implementazione e convalida incrementali
.
Se hai modifiche che cercano i parametri androidboot.* nel file /proc/cmdline, indirizzali al file /proc/bootconfig. Le proprietà ro.boot.* sono impostate con i nuovi valori bootconfig, quindi non devi apportare modifiche al codice che utilizza queste proprietà.
Modifiche alla build
Innanzitutto, aggiorna la versione dell'intestazione di avvio alla versione 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Aggiungi il parametro della riga di comando del kernel bootconfig. In questo modo, il kernel cerca la sezione bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
I parametri bootconfig vengono creati dai parametri nella variabile BOARD_BOOTCONFIG, in modo simile alla riga di comando del kernel creata da BOARD\_KERNEL\_CMDLINE.
Tutti i parametri androidboot.* possono essere spostati così come sono, in modo simile al seguente:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Modifiche al bootloader
Il bootloader configura initramfs prima di passare al kernel. La configurazione di avvio del
kernel
cerca la sezione bootconfig e si aspetta che si trovi alla fine di
initramfs, con il trailer previsto.
Il bootloader ottiene le informazioni sul layout di vendor_boot.img dall'intestazione dell'immagine di avvio del fornitore.
Figura 1. Allocazione della memoria bootconfig di Android 12
Il bootloader crea la sezione bootconfig in memoria. La sezione bootconfig contiene le allocazioni di memoria per:
- Parametri
parameters sizedi 4 Bparameters checksumdi 4 B- Stringa magica bootconfig di 12 B (
#BOOTCONFIG\n)
I parametri provengono da due fonti: parametri noti in fase di build e parametri non noti in fase di build. I parametri sconosciuti devono essere aggiunti.
I parametri noti in fase di build vengono inseriti alla fine dell'immagine vendor_boot nella sezione bootconfig. Le dimensioni della sezione vengono memorizzate (in byte) nel campo dell'intestazione di avvio del fornitore vendor_bootconfig_size.
I parametri non noti in fase di build sono noti solo in fase di runtime nel bootloader. Questi devono essere aggiunti alla fine della sezione dei parametri bootconfig prima che venga applicato il trailer bootconfig.
Se devi aggiungere parametri dopo l'applicazione del trailer bootconfig, sovrascrivi il trailer e riapplicalo.
Implementazione e convalida incrementali
Implementa la funzionalità bootconfig in modo incrementale seguendo la procedura descritta in questa sezione. Lascia invariati i parametri della riga di comando del kernel mentre vengono aggiunti i parametri bootconfig.
Di seguito sono riportati i passaggi per un'implementazione incrementale, con convalida:
- Apporta le modifiche al bootloader e alla build, quindi:
- Utilizza la variabile
BOARD_BOOTCONFIGper aggiungere un nuovo parametro bootconfig. - Mantieni invariati i parametri della riga di comando del kernel, in modo che il dispositivo possa continuare ad avviarsi correttamente. In questo modo, il debug e la convalida sono molto più semplici.
- Utilizza la variabile
- Verifica il tuo lavoro controllando i contenuti di
/proc/bootconfig. Verifica che il parametro appena aggiunto sia visibile dopo l'avvio del dispositivo. - Sposta i parametri
androidboot.*dalla riga di comando del kernel a bootconfig, utilizzando la variabileBOARD_BOOTCONFIGe il bootloader. - Verifica che ciascuno dei parametri esista in
/proc/bootconfigE che non si trovi in/proc/cmdline. Se riesci a verificare questa condizione, l'implementazione è andata a buon fine.
Considerazioni sull'upgrade e il downgrade OTA
Quando gestisci gli upgrade e i downgrade OTA tra versioni diverse di Android o versioni del kernel diverse, devi prestare particolare attenzione.
Android 12 è la prima versione con supporto bootconfig. Se esegui il downgrade a una versione precedente, devi utilizzare i parametri della riga di comando del kernel anziché bootconfig.
Le versioni del kernel 12-5.4 e successive supportano bootconfig. Se esegui il downgrade a una versione precedente(inclusa la 11-5.4), devi utilizzare i parametri della riga di comando del kernel.
Gli upgrade da Android 11 e versioni precedenti ad Android 12 e versioni successive possono continuare a utilizzare i parametri della riga di comando del kernel. Lo stesso vale per l'upgrade delle versioni del kernel.
Risoluzione dei problemi
Quando esegui il passaggio di verifica, se non vedi i parametri previsti in /proc/bootconfig, controlla i log del kernel in logcat. È sempre presente una voce di log per bootconfig se il kernel lo supporta.
Esempio di output del log
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Se viene restituito un log di errori, si è verificato un problema durante il caricamento di bootconfig. Per visualizzare i diversi tipi di errori, consulta init/main.c.