Implementar o bootconfig no Android 12

No Android 12, o recurso bootconfig substitui as opções de cmdline do kernel androidboot.* em uso com o 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. Como mover o kernel androidboot.* longo para o arquivo bootconfig cria espaço na cmdline do kernel e faz para disponibilizá-los 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

Implementar o recurso bootconfig para dispositivos novos lançados com a versão 12-5.10.xx versão do kernel. Não é necessário implementá-la se você estiver fazendo upgrade dos 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 o carregador de referência do Cuttlefish U-boot implementação. Duas confirmações na referência estão listadas abaixo. A primeira atualização aumenta o suporte à versão do cabeçalho de inicialização para a versão mais recente. No exemplo, o primeiro confirmar atualizações (ou aumentar) 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:

Exemplo de build

Em um exemplo de build que mostra mudanças no mkbootimg para criar o vendor_boot.img com cabeçalho de inicialização do fornecedor v4, consulte mkbootimg changes for bootconfig. Consulte as mudanças do Cuttlefish para fazer o seguinte:

Implementação

Os parceiros devem adicionar suporte aos carregadores de inicialização e mover o tempo de compilação Parâmetros androidboot.* da linha de comando do kernel para o bootconfig . A melhor maneira de implementar essa mudança é fazê-lo de forma incremental. consulte Seção Implementação e validação incrementais para saber como seguir um processo incremental.

Se você tiver mudanças que pesquisem androidboot.* no arquivo /proc/cmdline parâmetros, aponte-os 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 bootconfig são criados a partir dos parâmetros no A variável BOARD_BOOTCONFIG, assim como a cmdline do kernel, é criada a partir de 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 fornecedor. no cabeçalho da imagem de inicialização.

Diagrama do layout de alocação de memória do bootconfig

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. 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 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. Parâmetros desconhecidos precisam ser adicionados.

Os parâmetros conhecidos no tempo de build são empacotados no final do vendor_boot imagem 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ó são conhecidos no ambiente de execução carregador de inicialização. Eles precisam ser adicionados ao final da seção de parâmetros bootconfig antes da aplicação do trailer do bootconfig.

Se for preciso adicionar parâmetros depois da aplicação do trailer bootconfig, substituir o trailer e aplicá-lo novamente.

Implementação e validação incrementais

Implemente o recurso bootconfig incrementalmente, seguindo o processo fornecido em 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 de uma implementação incremental com validação:

  1. Faça alterações no carregador de inicialização e no build e faça o seguinte:
    1. Usar a variável BOARD_BOOTCONFIG para adicionar um novo bootconfig .
    2. Mantenha os parâmetros de cmdline do kernel como estão, para que o dispositivo continue inicializando corretamente. Isso torna a depuração e a validação muito mais fácil.
  2. Verifique seu trabalho conferindo o conteúdo de /proc/bootconfig. Verifique se o parâmetro recém-adicionado aparece depois que o dispositivo é inicializado.
  3. Mova os parâmetros androidboot.* do cmdline do kernel para bootconfig usando a variável BOARD_BOOTCONFIG e o carregador de inicialização.
  4. 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 OTA

Ao gerenciar upgrades e downgrades OTA entre diferentes versões do Android ou diferentes versões do kernel, é necessário ter 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 a 5.4 e mais recentes do kernel oferecem suporte ao bootconfig. Se fizer downgrade para qualquer versão anterior a ela(incluindo a 11-5.4), os parâmetros de cmdline do kernel devem ser usados.

Upgrades do Android 11 e versões anteriores para o Android 12 e versões mais recentes podem continuar usando parâmetros 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á um registro entrada presente para bootconfig se o kernel permitir.

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 conferir diferentes tipos de erro, consulte init/main.c padrão.