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 longos parâmetros de kernel androidboot.*
para o arquivo bootconfig cria espaço na cmdline do kernel e o disponibiliza para
expansões futuras.
O kernel e o espaço do usuário do Android precisam oferecer suporte a bootconfig
.
- Primeira versão com suporte: Android 12
- Primeira versão do kernel com suporte: 12-5.4.xx kernel
Implemente o recurso bootconfig para dispositivos novos lançados com uma versão do kernel 12-5.10.xx. Não é necessário implementá-la se você estiver fazendo upgrade dos dispositivos.
Exemplos e origem
Ao visualizar os exemplos e o código-fonte nesta seção, observe que o formato
do código bootconfig
é apenas um pouco diferente do formato da
linha de comando do kernel usada no Android 11 e versões anteriores.
No entanto, a seguinte diferença é importante para o 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 do carregador de inicialização de referência do Cuttlefish. Duas confirmações na referência estão listadas abaixo. O primeiro aumenta o suporte da 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 ambiente de execução:
- Faça a substituição da versão do cabeçalho de inicialização para a versão v4 mais recente.
- Adicione a manipulação 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 faça upgrade) da versão v4 do cabeçalho de inicialização do fornecedor.
- Adicione bootconfig à cmdline do kernel e mova os parâmetros selecionados para bootconfig.
Implementação
Os parceiros precisam adicionar suporte aos carregadores 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 é fazer isso de forma incremental. Consulte a seção Implementação e validação incremental para informações sobre como seguir um processo incremental.
Se você tiver mudanças que pesquisam parâmetros androidboot.*
no arquivo /proc/cmdline, 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
alterações no código usando 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
, de forma semelhante à cmdline do kernel criada em
BOARD\_KERNEL\_CMDLINE
.
Qualquer parâmetro androidboot.*
pode ser movido como está, semelhante ao seguinte:
- 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 a procura 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 da configuração de inicialização 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
- 4 B tamanho
parameters size
- 4 B tamanho
parameters checksum
- String mágica de bootconfig 12 B (
#BOOTCONFIG\n
)
Os parâmetros têm duas origens: parâmetros conhecidos no tempo de build e parâmetros que não são conhecidos no tempo de build. Parâmetros desconhecidos precisam ser adicionados.
Os parâmetros conhecidos no tempo de 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 tempo de build são conhecidos apenas no momento da execução, no carregador de inicialização. Eles precisam ser adicionados ao final da seção de parâmetros bootconfig antes da aplicação do trailer.
Se for necessário 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 incrementalmente, seguindo o processo fornecido nesta seção. Deixe os parâmetros cmdline do kernel intactos enquanto os parâmetros de bootconfig são adicionados.
Estas são as etapas de uma implementação incremental com validação:
- Faça as mudanças no carregador de inicialização e no build. Em seguida, faça o seguinte:
- Use a variável
BOARD_BOOTCONFIG
para adicionar um novo parâmetro de bootconfig. - Mantenha os parâmetros cmdline do kernel como estão para que o dispositivo possa continuar a inicialização corretamente. Isso torna a depuração e a validação muito mais fáceis.
- Use a variável
- Verifique seu trabalho conferindo o conteúdo de
/proc/bootconfig
. Verifique se o parâmetro recém-adicionado aparece após a inicialização do dispositivo. - Mova os parâmetros
androidboot.*
da 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, significa que sua implementação foi bem-sucedida.
Considerações sobre upgrade e downgrade 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 ao bootconfig. Se você fizer downgrade para qualquer versão anterior, os parâmetros cmdline do kernel precisarão ser usados em vez do bootconfig.
As versões 12 a 5.4 e mais recentes do kernel oferecem suporte ao bootconfig. Se você fizer downgrade para qualquer versão anterior a ela(incluindo a 11-5.4), será necessário usar os parâmetros cmdline do kernel.
Os upgrades do Android 11 e versões anteriores para o Android 12 e versões mais recentes podem continuar usando os parâmetros cmdline do kernel. O mesmo se aplica ao upgrade de versões do kernel.
Solução de problemas
Ao executar a etapa de verificação, se você não encontrar os parâmetros esperados
em /proc/bootconfig
, verifique os registros do kernel em logcat
. Sempre vai haver uma entrada de
registro para o bootconfig se o kernel oferecer suporte a ele.
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 erros for retornado, significa que houve um problema ao carregar o bootconfig. Para ver diferentes tipos de erro, consulte init/main.c.