Implementazione di Bootconfig in Android 12

In Android 12, la funzionalità bootconfig sostituisce le opzioni della riga cmdline del kernel androidboot.* in uso con Android 11 e versioni precedenti. La funzionalità bootconfig è un meccanismo per trasferire 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 Android da quelli per il kernel. Lo spostamento dei lunghi parametri del kernel androidboot.* nel file bootconfig crea spazio sulla riga 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 che ha questo supporto: Android 12
  • Prima versione del kernel che ha questo supporto: kernel 12-5.4.xx

Implementa la funzionalità 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 della riga 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, vedere l'implementazione del bootloader di riferimento Cuttlefish U-boot. Due commit nel riferimento sono elencati di seguito. Il primo aggiorna il supporto della versione dell'intestazione di avvio alla versione più recente. Nell'esempio, il primo commit aggiorna (o uprev) il supporto della versione a quella successiva, v4. Il secondo fa due cose; aggiunge la gestione del bootconfig e dimostra l'aggiunta di parametri in fase di esecuzione:

Esempio di costruzione

Per un esempio di build che mostra le modifiche mkbootimg per creare vendor_boot.img con l'intestazione di avvio del fornitore v4, vedere mkbootimg changes for bootconfig . Vedi le modifiche a Cuttlefish per effettuare le seguenti operazioni:

Implementazione

I partner devono aggiungere supporto ai propri bootloader e spostare i parametri androidboot.* in fase di compilazione dalla riga cmd del kernel al file bootconfig. Il modo migliore per implementare questo cambiamento è farlo in modo incrementale; vedere la sezione Implementazione e convalida incrementale per informazioni su come seguire un processo incrementale.

Se sono presenti modifiche che cercano parametri androidboot.* nel file /proc/cmdline, indirizzarle invece al file /proc/bootconfig. Le proprietà ro.boot.* vengono impostate con i nuovi valori 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 bootconfig vengono creati dai parametri nella variabile BOARD_BOOTCONFIG , proprio come la cmdline del kernel viene creata 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 l' 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.

Diagram of bootconfig memory allocation layout

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 parameters size di dimensione B
  • 4 parameters checksum della 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 conosciuti in fase di compilazione vengono inseriti alla fine dell'immagine vendor_boot nella sezione bootconfig. La dimensione della sezione viene archiviata (in 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 bootconfig, sovrascrivere il trailer e riapplicarlo.

Implementazione e convalida incrementali

Implementare la funzionalità bootconfig in modo incrementale seguendo il processo indicato in questa sezione. Lasciare intatti i parametri della riga cmdline del kernel mentre vengono aggiunti i parametri bootconfig.

Questi sono i passaggi per un'implementazione incrementale, con convalida:

  1. Crea il bootloader e crea le modifiche, quindi procedi come segue:
    1. Utilizzare la variabile BOARD_BOOTCONFIG per aggiungere un nuovo parametro bootconfig.
    2. Mantenere i parametri della riga cmdline del kernel così come sono, 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 il contenuto di /proc/bootconfig . Verifica di visualizzare il parametro appena aggiunto dopo l'avvio del dispositivo.
  3. Spostare i parametri androidboot.* dalla riga cmd del kernel a bootconfig, utilizzando la variabile BOARD_BOOTCONFIG e il bootloader.
  4. Verificare che ciascuno dei parametri esista in /proc/bootconfig E che non siano in /proc/cmdline . Se puoi verificarlo, l'implementazione ha avuto successo.

Considerazioni sull'aggiornamento e il downgrade dell'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 bootconfig. Se si effettua il downgrade a qualsiasi versione precedente, è necessario utilizzare i parametri cmdline del kernel anziché bootconfig.

Le versioni del kernel 12-5.4 e successive supportano bootconfig. Se si effettua il downgrade a qualsiasi versione precedente (inclusa la 11-5.4), è necessario utilizzare i parametri della riga cmd del kernel.

Gli aggiornamenti da Android 11 e versioni precedenti ad Android 12 e versioni successive possono continuare a utilizzare i parametri della riga 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 . È sempre presente una voce di registro 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 restituito un registro degli errori, si è verificato un problema durante il caricamento del bootconfig. Per vedere diversi tipi di errore, visualizza init/main.c .