In Android 12, la funzione bootconfig sostituisce le opzioni della cmdline del kernel androidboot.*
in uso con Android 11 e versioni precedenti. La funzione bootconfig è un meccanismo per passare i dettagli di configurazione dalla build e dal bootloader ad Android 12.
Questa funzionalità fornisce un modo per 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 sulla linea cmd del kernel e lo rende disponibile per una facile espansione futura.
Sia il kernel che lo spazio utente Android devono supportare bootconfig
.
- Prima versione con questo supporto: Android 12
- Prima versione del kernel con questo supporto: kernel 12-5.4.xx
Implementare la funzione bootconfig per i nuovi dispositivi avviati con una versione del kernel 12-5.10.xx. Non è necessario implementarlo se stai aggiornando i dispositivi.
Esempi e fonte
Mentre visualizzi gli esempi e il codice sorgente in questa sezione, tieni presente che il formato del codice bootconfig
è solo leggermente diverso dal formato del cmdline del kernel utilizzato 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, vedere l'implementazione del bootloader di riferimento di Cuttlefish U-boot. Di seguito sono elencati due commit nel riferimento. Il primo aggiorna il supporto della versione dell'intestazione di avvio all'ultima versione. Nell'esempio, il primo commit aggiorna (o uprev) il supporto della versione a quello successivo, v4. Il secondo fa due cose; aggiunge la gestione di bootconfig e mostra l'aggiunta di parametri in fase di esecuzione:
- Aggiorna il supporto della versione dell'intestazione di avvio all'ultima versione v4 .
- Aggiungi la gestione bootconfig .
Esempio di costruzione
Per un esempio di build che mostra le modifiche a mkbootimg
per vendor_boot.img
con l'intestazione di avvio del fornitore v4, vedere mkbootimg changes for bootconfig
. Vedere le modifiche alle Seppie per effettuare le seguenti operazioni:
- Utilizzare (o eseguire l'uprev a) la versione v4 dell'intestazione di avvio del fornitore .
- Aggiungi
bootconfig to the kernel cmdline and move selected parameters to bootconfig
.
Implementazione
I partner devono aggiungere il supporto ai loro bootloader e spostare i parametri androidboot.*
di build-time dal cmdline del kernel al file bootconfig. Il modo migliore per implementare questa modifica è farlo in modo incrementale; vedere la sezione Implementazione e convalida incrementali per informazioni su come seguire un processo incrementale.
Se hai modifiche che cercano nel file /proc/cmdline i parametri androidboot.*
, puntale invece al file /proc/bootconfig. Le proprietà ro.boot.*
sono impostate con i nuovi valori di bootconfig
, quindi non è necessario apportare modifiche al codice utilizzando tali proprietà.
Costruisci modifiche
Innanzitutto, aggiorna la versione dell'intestazione di avvio alla versione 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Aggiungi il parametro cmdline del kernel bootconfig
. Questo fa sì che il kernel cerchi la sezione bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
I parametri di bootconfig vengono creati dai parametri nella variabile BOARD_BOOTCONFIG
, proprio come il cmdline del kernel viene creato da BOARD\_KERNEL\_CMDLINE
.
Qualsiasi parametro androidboot.*
può essere spostato così com'è, in modo simile al seguente:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Modifiche al bootloader
Il bootloader imposta initramfs
prima di passare al kernel. La configurazione di avvio del kernel cerca la sezione bootconfig e cerca che si trovi alla fine di initramfs,
con il trailer previsto.
Il bootloader ottiene le informazioni sul layout vendor_boot.img
dall'intestazione dell'immagine di avvio del fornitore.
Figura 1. Allocazione della memoria di bootconfig di Android 12
Il bootloader crea la sezione bootconfig in memoria. La sezione bootconfig contiene allocazioni di memoria per quanto segue:
- Parametri
- 4 Dimensioni
parameters size
B - 4 Somma di
parameters checksum
di dimensione B - 12 B stringa magica bootconfig (
#BOOTCONFIG\n
)
I parametri provengono da due origini: parametri noti in fase di compilazione e parametri non noti in fase di compilazione. È necessario aggiungere parametri sconosciuti.
I parametri noti in fase di compilazione vengono inseriti in un pacchetto alla fine dell'immagine vendor_boot
nella sezione bootconfig. La dimensione della sezione viene memorizzata (come byte) nel campo dell'intestazione di avvio del fornitore vendor_bootconfig_size
.
I parametri che non sono noti in fase di compilazione sono noti solo in fase di esecuzione nel bootloader. Questi devono essere aggiunti alla fine della sezione dei parametri di bootconfig prima che venga applicato il trailer di bootconfig.
Se è necessario aggiungere parametri dopo l'applicazione del trailer di bootconfig, sovrascrivere il trailer e riapplicarlo.
Implementazione e validazione incrementali
Implementare la funzione bootconfig in modo incrementale seguendo il processo descritto in questa sezione. Lascia inalterati i parametri del cmdline del kernel mentre vengono aggiunti i parametri di bootconfig.
Questi i passaggi per un'implementazione incrementale, con validazione:
- Apporta il bootloader e le modifiche alla build, quindi procedi come segue:
- Utilizzare la variabile
BOARD_BOOTCONFIG
per aggiungere un nuovo parametro bootconfig. - Mantieni i parametri del cmdline del kernel così come sono, in modo che il dispositivo possa continuare ad avviarsi correttamente. Ciò semplifica notevolmente il debug e la convalida.
- Utilizzare la variabile
- Verifica il tuo lavoro controllando il contenuto di
/proc/bootconfig
. Verifica di visualizzare il parametro appena aggiunto dopo l'avvio del dispositivo. - Sposta i parametri
androidboot.*
dalla cmdline del kernel a bootconfig, usando la variabileBOARD_BOOTCONFIG
e il bootloader. - Verifica che ciascuno dei parametri esista in
/proc/bootconfig
E che non siano in/proc/cmdline
. Se puoi verificarlo, l'implementazione è riuscita.
Considerazioni sull'aggiornamento e il downgrade di OTA
Quando gestisci aggiornamenti e downgrade OTA tra diverse versioni di Android o diverse versioni del kernel, è necessario prestare particolare attenzione.
Android 12 è la prima versione con supporto per bootconfig. Se si esegue il downgrade a una versione precedente, è necessario utilizzare i parametri del cmdline del kernel invece di bootconfig.
Le versioni del kernel 12-5.4 e successive supportano bootconfig. Se si esegue il downgrade a una versione precedente (inclusa 11-5.4), è necessario utilizzare i parametri del cmdline del kernel.
Gli aggiornamenti da Android 11 e versioni precedenti ad Android 12 e versioni successive possono continuare a utilizzare i parametri della cmdline del kernel. Lo stesso vale per l'aggiornamento 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
. C'è sempre una voce di registro presente per bootconfig se il kernel lo supporta.
Esempio di output del registro
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Se viene visualizzato un registro degli errori restituito, si è verificato un problema durante il caricamento di bootconfig. Per visualizzare diversi tipi di errore, visualizza init/main.c .