No Android 12, o recurso bootconfig substitui as
opções de cmdline do kernel androidboot.*
em uso no Android 11
e em 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 na linha de comando do kernel e o disponibiliza para expansão futura.
O kernel e o espaço do usuário do Android precisam ser compatíveis com bootconfig
.
- Primeira versão com esse suporte: Android 12
- Primeira versão do kernel com esse suporte: kernel 12-5.4.xx
Implemente o recurso bootconfig para novos dispositivos lançados com uma versão do kernel 12-5.10.xx. Não é necessário implementar se você estiver fazendo upgrade de dispositivos.
Exemplos e origem
Ao analisar 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 em 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
, não por espaços.
Exemplo de carregador de inicialização
Para um exemplo de carregador de inicialização, consulte a implementação do carregador de inicialização de referência do U-boot do Cuttlefish. Confira abaixo duas confirmações na referência. O primeiro uprev atualiza o suporte ao cabeçalho de inicialização para a versão mais recente. No exemplo, o primeiro commit atualiza (ou faz uprev) o suporte de 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 tempo de execução:
- Faça uprev do suporte à versão do cabeçalho de inicialização para a versão v4 mais recente.
- Adicione o processamento do bootconfig.
Criar exemplo
Para um exemplo de build que mostra mudanças de mkbootimg
para criar o
vendor_boot.img
com o cabeçalho de inicialização do fornecedor v4, consulte mkbootimg changes for
bootconfig
.
Confira as mudanças no Cuttlefish para fazer o seguinte:
- Use (ou faça uprev para) a versão 4 do cabeçalho de inicialização do fornecedor.
- Adicione bootconfig à linha de comando do kernel e mova os parâmetros selecionados para bootconfig.
Implementação
Os parceiros precisam adicionar suporte aos bootloaders e mover os parâmetros androidboot.*
do tempo de build da linha de comando 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 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, faça o uprev da 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 de linha de comando do kernel bootconfig
. Isso faz com que o kernel procure a seção
bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
Os parâmetros bootconfig são criados com base nos parâmetros da variável BOARD_BOOTCONFIG
, assim como a linha de comando do kernel é criada com base 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 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 do 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
- 4 B tamanho
parameters size
- 4 B tamanho
parameters checksum
- String mágica de bootconfig 12 B (
#BOOTCONFIG\n
)
Os parâmetros vêm de duas fontes: parâmetros conhecidos no momento da criação e parâmetros desconhecidos. Os parâmetros desconhecidos precisam ser adicionados.
Os parâmetros conhecidos no momento da criação são empacotados no final da imagem vendor_boot
na seção "bootconfig". O tamanho da seção é armazenado (em 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 tempo de execução no bootloader. Eles precisam ser adicionados ao final da seção de parâmetros do bootconfig antes que o trailer do bootconfig seja aplicado.
Se você precisar adicionar parâmetros depois que o trailer bootconfig for aplicado, substitua e reaplique o trailer.
Implementação e validação incrementais
Implemente o recurso bootconfig de forma incremental seguindo o processo descrito nesta seção. Deixe os parâmetros da linha de comando 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 as mudanças no carregador de inicialização e na build e faça o seguinte:
- Use a variável
BOARD_BOOTCONFIG
para adicionar um novo parâmetro bootconfig. - Mantenha os parâmetros da linha de comando 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.*
da linha de comando 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ê conseguir verificar isso, a 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 do kernel, é preciso tomar cuidado especial.
O Android 12 é a primeira versão com suporte para bootconfig. Se você fizer downgrade para uma versão anterior, use parâmetros de linha de comando do kernel em vez de bootconfig.
As versões do kernel 12-5.4 e mais recentes são compatíveis com o bootconfig. Se você fizer downgrade para qualquer versão anterior a essa(incluindo 11-5.4), será necessário usar parâmetros de linha de comando do kernel.
As atualizações do Android 11 e versões anteriores para o Android 12 e versões mais recentes podem continuar usando parâmetros da linha de comando do kernel. O mesmo vale para o upgrade das versões do kernel.
Solução de problemas
Quando você realiza a etapa verify, se não encontrar os parâmetros esperados em /proc/bootconfig
, verifique os registros do kernel em logcat
. Sempre há uma entrada de
registro para bootconfig se o kernel for compatível com 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, houve um problema ao carregar a bootconfig. Para conferir diferentes tipos de erros, acesse init/main.c.