No Android 12, o recurso bootconfig substitui as
opções de cmdline do kernel androidboot.*
em uso no Android 11
e versões anteriores. O recurso bootconfig é um mecanismo para transmitir detalhes de configuração
do build e do carregador de inicialização para o Android 12.
Esse recurso fornece uma maneira de separar os parâmetros de configuração do espaço
do usuário do Android daqueles do espaço do kernel. Mover os parâmetros longos do kernel androidboot.*
para o arquivo bootconfig cria espaço no cmdline do kernel e o
disponibiliza para expansão futura.
O kernel e o espaço do usuário do Android precisam oferecer suporte a bootconfig
.
- Primeira versão com esse suporte: Android 12
- Primeira versão do kernel com esse suporte: kernel 12-5.4.xx
Implementamos o recurso bootconfig para novos dispositivos lançados com uma versão 12-5.10.xx do kernel. Não é necessário implementar esse recurso se você estiver fazendo upgrade de dispositivos.
Exemplos e origem
Ao conferir os exemplos e o código-fonte nesta seção, observe que o formato
do código bootconfig
é apenas um pouco diferente do formato do
kernel cmdline usado no Android 11 e versões anteriores.
No entanto, a seguinte diferença é importante para seu uso:
- Os parâmetros precisam ser separados pela sequência de escape de nova linha
\n
, e não por espaços.
Exemplo de carregador de inicialização
Para conferir um exemplo de carregador de inicialização, consulte a implementação de carregador de inicialização de referência do Cuttlefish U-boot. Confira abaixo duas confirmações na referência. O primeiro uprev atualiza o suporte à versão do cabeçalho de inicialização para a versão mais recente. No exemplo, a primeira confirmação atualiza (ou aumenta) o suporte da versão para a próxima, v4. O segundo faz duas coisas: adiciona o processamento de bootconfig e demonstra a adição de parâmetros no momento da execução:
- Faça a substituição da versão do cabeçalho de inicialização para a versão v4 mais recente.
- Adicione o processamento de bootconfig.
Exemplo de build
Para conferir um exemplo de build que mostra mudanças no mkbootimg
para criar o
vendor_boot.img
com o cabeçalho de inicialização v4 do fornecedor, consulte mkbootimg changes for
bootconfig
.
Consulte as mudanças do Cuttlefish para fazer o seguinte:
- Use (ou atualize para) o cabeçalho de inicialização do fornecedor versão v4.
- Adicione bootconfig ao cmdline do kernel e mova os parâmetros selecionados para bootconfig.
Implementação
Os parceiros precisam adicionar suporte aos carregador de inicialização e mover os parâmetros
androidboot.*
do tempo de build do cmdline do kernel para o arquivo
bootconfig. A melhor maneira de implementar essa mudança é de forma incremental. Consulte a seção
Implementação e validação incrementais
para saber como seguir um processo incremental.
Se você tiver mudanças que pesquisam o arquivo /proc/cmdline para parâmetros androidboot.*
, aponte-as para o arquivo /proc/bootconfig
. As propriedades ro.boot.*
são definidas com os novos valores bootconfig
. Portanto, não é necessário fazer
mudanças no código que usa essas propriedades.
Mudanças no build
Primeiro, aumente a versão do cabeçalho de inicialização para a versão 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Adicione o parâmetro cmdline do kernel bootconfig
. Isso faz com que o kernel procure
a seção bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
Os parâmetros de bootconfig são criados com base nos parâmetros na
variável BOARD_BOOTCONFIG
, assim como a cmdline do kernel é criada em
BOARD\_KERNEL\_CMDLINE
.
Todos os parâmetros androidboot.*
podem ser movidos como estão, como neste exemplo:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Mudanças no carregador de inicialização
O carregador de inicialização configura o initramfs
antes de pular para o kernel. A configuração de inicialização
do kernel
procura a seção bootconfig e verifica se ela está no final de
initramfs,
com o trailer esperado.
O carregador de inicialização recebe as informações de layout vendor_boot.img
do cabeçalho
da imagem de inicialização do fornecedor.
Figura 1. Alocação de memória de bootconfig do Android 12
O carregador de inicialização cria a seção bootconfig na memória. A seção bootconfig contém alocações de memória para o seguinte:
- Parâmetros
- Tamanho 4 B
parameters size
- Tamanho 4 B
parameters checksum
- String mágica de bootconfig de 12 B (
#BOOTCONFIG\n
)
Os parâmetros vêm de duas fontes: parâmetros conhecidos no momento do build e parâmetros que não são conhecidos no momento do build. É preciso adicionar parâmetros desconhecidos.
Os parâmetros conhecidos no momento do build são empacotados no final da imagem vendor_boot
na seção bootconfig. O tamanho da seção é armazenado (como bytes)
no campo de cabeçalho de inicialização do fornecedor vendor_bootconfig_size
.
Os parâmetros que não são conhecidos no momento da criação só são conhecidos no momento da execução no bootloader. Eles precisam ser adicionados ao final da seção de parâmetros de bootconfig antes que o trailer de bootconfig seja aplicado.
Se você precisar adicionar parâmetros depois da aplicação do trailer bootconfig, substitua o trailer e aplique-o novamente.
Implementação e validação incrementais
Implemente o recurso bootconfig de forma incremental seguindo o processo descrito nesta seção. Deixe os parâmetros de cmdline do kernel intactos enquanto os parâmetros de bootconfig são adicionados.
Estas são as etapas para uma implementação incremental, com validação:
- Faça alterações no carregador de inicialização e no build e faça o seguinte:
- Use a variável
BOARD_BOOTCONFIG
para adicionar um novo parâmetro de bootconfig. - Mantenha os parâmetros de cmdline do kernel como estão, para que o dispositivo continue inicializando corretamente. Isso facilita muito a depuração e a validação.
- Use a variável
- Verifique seu trabalho conferindo o conteúdo de
/proc/bootconfig
. Verifique se o parâmetro recém-adicionado aparece depois que o dispositivo é inicializado. - Mova os parâmetros
androidboot.*
do cmdline do kernel para bootconfig usando a variávelBOARD_BOOTCONFIG
e o carregador de inicialização. - Verifique se cada um dos parâmetros existe em
/proc/bootconfig
E se eles não estão em/proc/cmdline
. Se você puder verificar isso, sua implementação terá sido bem-sucedida.
Considerações sobre upgrade e downgrade por OTA
Ao gerenciar upgrades e downgrades OTA entre diferentes versões do Android ou diferentes versões do kernel, tenha cuidado especial.
O Android 12 é a primeira versão com suporte a bootconfig. Se você fizer downgrade para qualquer versão anterior, os parâmetros de cmdline do kernel precisam ser usados em vez de bootconfig.
As versões 12-5.4 e mais recentes do kernel oferecem suporte a bootconfig. Se você fizer downgrade para uma versão anterior(incluindo 11-5.4), os parâmetros de cmdline do kernel precisarão ser usados.
Os upgrades do Android 11 e versões anteriores para o Android 12 e versões mais recentes podem continuar usando os parâmetros de cmdline do kernel. O mesmo vale para o upgrade de versões do kernel.
Solução de problemas
Ao realizar a etapa verificar, se os parâmetros esperados não aparecerem
em /proc/bootconfig
, verifique os registros do kernel em logcat
. Sempre há uma entrada de registro
para bootconfig se o kernel oferecer suporte a ela.
Exemplo de saída de registro
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Se um registro de erro for retornado, houve um problema ao carregar o bootconfig. Para conferir diferentes tipos de erros, consulte init/main.c.