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à offre un modo per separare i parametri di configurazione per lo spazio utente Android da quelli per il kernel. Lo spostamento dei parametri del kernel androidboot.*
nel file bootconfig crea spazio nella riga di comando del kernel e lo rende
disponibile per l'espansione futura.
Sia il kernel che lo spazio utente Android devono supportare bootconfig
.
- Prima release con questo supporto: Android 12
- Prima versione del kernel che supporta questa funzionalità: kernel 12-5.4.xx
Implementa la funzionalità bootconfig per i nuovi dispositivi lanciati con una versione del kernel 12-5.10.xx. Non è necessario implementarlo se esegui l'upgrade dei dispositivi.
Esempi e origine
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 per la 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 aggiornamento porta la versione dell'intestazione di avvio all'ultima versione. Nell'esempio, il primo commit aggiorna (o aumenta) il supporto della versione alla successiva, la v4. Il secondo esegue due operazioni: aggiunge la gestione di bootconfig e mostra l'aggiunta di parametri in fase di runtime:
- Esegui l'upgrade del supporto della versione dell'intestazione di avvio all'ultima versione v4.
- Aggiungi la gestione di bootconfig.
Crea esempio
Per un esempio di build che mostra le modifiche a 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:
- Utilizza (o esegui l'upgrade a) la versione 4 dell'intestazione di avvio del fornitore.
- 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 compilazione 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, esegui l'upgrade della 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
, proprio come la riga di comando del kernel viene creata da BOARD\_KERNEL\_CMDLINE
.
Qualsiasi parametro androidboot.*
può essere spostato così com'è, in modo simile a quanto segue:
- 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 verifica che si trovi alla fine di initramfs,
con il trailer previsto.
Il bootloader riceve le informazioni sul layout 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 quanto segue:
- Parametri
- 4 Dimensione B
parameters size
- 4 Dimensione B
parameters checksum
- 12 B bootconfig magic string (
#BOOTCONFIG\n
)
I parametri provengono da due origini: parametri noti al momento della build e parametri non noti al momento della build. È necessario aggiungere i parametri sconosciuti.
I parametri noti al momento della creazione vengono inclusi alla fine dell'immagine vendor_boot
nella sezione bootconfig. Le dimensioni della sezione sono memorizzate (in byte)
nel campo dell'intestazione di avvio del fornitore vendor_bootconfig_size
.
I parametri non noti al momento della build sono noti solo al 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 applicalo di nuovo.
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 di bootconfig.
Di seguito sono riportati i passaggi per un'implementazione incrementale, con convalida:
- Apporta le modifiche al bootloader e alla build, poi esegui le seguenti operazioni:
- Utilizza la variabile
BOARD_BOOTCONFIG
per aggiungere un nuovo parametro bootconfig. - Mantieni i parametri della riga di comando del kernel così come sono, 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 di visualizzare il parametro appena aggiunto dopo l'avvio del dispositivo. - Sposta i parametri
androidboot.*
dalla riga di comando del kernel a bootconfig, utilizzando la variabileBOARD_BOOTCONFIG
e il bootloader. - Verifica che ciascuno dei parametri esista in
/proc/bootconfig
E che non si trovi in/proc/cmdline
. Se riesci a verificarlo, l'implementazione è andata a buon fine.
Considerazioni sull'upgrade e sul downgrade OTA
Quando gestisci upgrade e downgrade OTA tra diverse versioni di Android o diverse versioni del kernel, devi prestare particolare attenzione.
Android 12 è la prima versione con supporto di 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), devono essere utilizzati 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 verifica, se non vedi i parametri previsti
in /proc/bootconfig
, controlla i log del kernel in logcat
. Se il kernel lo supporta, è sempre presente una voce di log per bootconfig.
Output di log di esempio
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Se viene restituito un log degli errori, si è verificato un problema durante il caricamento di bootconfig. Per visualizzare diversi tipi di errori, consulta init/main.c.