Implementare bootconfig in Android 12

In Android 12, la funzionalità bootconfig sostituisce le opzioni cmdline del kernel androidboot.* in uso con Android 11 e versioni precedenti. La funzionalità bootconfig è un meccanismo per trasmettere dettagli di configurazione dalla build e dal bootloader ad Android 12.

Questa funzionalità consente di separare i parametri di configurazione per lo spazio utente Android da quelli per il kernel. Spostare i lunghi parametri del kernel androidboot.* nel file bootconfig crea spazio nella cmdline del kernel e lo rende disponibile per l'espansione futura.

Sia il kernel sia lo spazio utente di Android devono supportare bootconfig.

  • Prima release con questo supporto: Android 12
  • Prima versione del kernel con questo supporto: 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 implementarla se esegui l'upgrade dei dispositivi.

Esempi e fonte

Quando visualizzi gli esempi e il codice sorgente in questa sezione, tieni presente che il formato del codice bootconfig è solo leggermente diverso da quello della cmdline 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. La prima uprevs supporta la versione del header di avvio alla versione più recente. Nell'esempio, il primo commit aggiorna (o esegue l'uprev) il supporto della versione alla successiva, la v4. La seconda fa due cose: aggiunge la gestione del bootconfig e mostra l'aggiunta di parametri in fase di runtime:

Esempio di build

Per un esempio di build che mostra le modifiche mkbootimg per la creazione di vendor_boot.img con intestazione di avvio del fornitore v4, consulta mkbootimg changes for bootconfig. Consulta le modifiche di Cuttlefish per eseguire le seguenti operazioni:

Implementazione

I partner devono aggiungere il supporto ai propri bootloader e spostare i parametri androidboot.* al momento della compilazione dalla cmdline del kernel al file bootconfig. Il modo migliore per implementare questa modifica è farlo in modo incrementale. Consulta la sezione Implementazione e convalida incrementali per informazioni su come seguire un processo incrementale.

Se hai apportato modifiche che cercano i parametri androidboot.* nel file /proc/cmdline, indirizzali al file /proc/bootconfig. Le proprietà ro.boot.* vengono impostate con i nuovi valori bootconfig, quindi non è necessario apportare modifiche al codice che le utilizza.

Modifiche alla compilazione

Innanzitutto, esegui l'upgrade della versione dell'intestazione del boot alla versione 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Aggiungi il parametro bootconfig cmdline del kernel. Il kernel cercherà la sezione bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

I parametri bootconfig vengono creati dai parametri nella variabile BOARD_BOOTCONFIG, proprio come il kernel cmdline viene creato da BOARD\_KERNEL\_CMDLINE.

Tutti i parametri androidboot.* possono essere spostati così come sono, ad esempio:

- 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 recupera le informazioni sul layout vendor_boot.img dall'intestazione dell'immagine di avvio del fornitore.

Diagramma del layout di allocazione della memoria di bootconfig

Figura 1. Allocazione della memoria bootconfig per Android 12

Il bootloader crea la sezione bootconfig in memoria. La sezione bootconfig contiene allocazioni di memoria per quanto segue:

  • Parametri
  • Taglia 4 B parameters size
  • Taglia 4 B parameters checksum
  • Stringa magica bootconfig di 12 B (#BOOTCONFIG\n)

I parametri provengono da due origini: parametri noti al momento della compilazione e parametri non noti al momento della compilazione. È necessario aggiungere i parametri sconosciuti.

I parametri noti al momento della build vengono pacchettizzati 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 che non sono noti al momento della compilazione sono noti solo in fase di runtime nel bootloader. Devono essere aggiunti alla fine della sezione dei parametri di bootconfig prima dell'applicazione del trailer di 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 cmdline del kernel mentre vengono aggiunti i parametri bootconfig.

Di seguito sono riportati i passaggi per un'implementazione incrementale con convalida:

  1. Apporta le modifiche al bootloader e alla compilazione, quindi:
    1. Utilizza la variabile BOARD_BOOTCONFIG per aggiungere un nuovo parametro bootconfig.
    2. Mantieni invariati i parametri cmdline del kernel in modo che il dispositivo possa continuare ad avviarsi correttamente. Ciò rende il debug e la convalida molto più semplici.
  2. Verifica il tuo lavoro controllando i contenuti di /proc/bootconfig. Verifica di visualizzare il parametro appena aggiunto dopo l'avvio del dispositivo.
  3. Sposta i parametri androidboot.* dalla cmdline del kernel a bootconfig, utilizzando la variabile BOARD_BOOTCONFIG e il bootloader.
  4. Verifica che ogni parametro esista in /proc/bootconfig E che non siano presenti in /proc/cmdline. Se riesci a verificare questo aspetto, l'implementazione è andata a buon fine.

Considerazioni sull'upgrade e sul downgrade delle 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 il supporto di bootconfig. Se esegui il downgrade a una versione precedente, devono essere utilizzati i parametri cmdline del kernel instead of bootconfig.

Le versioni del kernel 12-5.4 e successive supportano bootconfig. Se esegui il downgrade a una versione precedente(inclusa 11-5.4), devono essere utilizzati i parametri cmdline del kernel.

Gli upgrade da Android 11 e versioni precedenti ad Android 12 e versioni successive possono continuare a utilizzare i parametri cmdline 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. Se il kernel lo supporta, è sempre presente una voce di log per bootconfig.

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 errore, si è verificato un problema durante il caricamento del file bootconfig. Per vedere diversi tipi di errore, visualizza init/main.c.