O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Implementando Bootconfig no Android 12

Em Android 12, o recurso bootconfig substitui o androidboot.* Opções do kernel cmdline em uso com o Android 11 e inferiores. O recurso bootconfig é um mecanismo para passar detalhes de configuração do build e bootloader para o Android 12.

Este recurso fornece uma maneira de separar os parâmetros de configuração para o espaço do usuário do Android daqueles para o kernel. Movendo o longa androidboot.* Parâmetros do kernel para o arquivo bootconfig cria espaço no cmdline kernel e torna disponível para expansão futura fácil.

Tanto o kernel e o espaço do usuário suporte deve Android bootconfig .

  • Primeira versão que tem este suporte: Android 12
  • Primeira versão do kernel que tem este suporte: kernel 12-5.4.xx

Implementar o recurso bootconfig para novos dispositivos de lançamento com uma versão do kernel 12-5.10.xx. Você não precisa implementá-lo se estiver atualizando dispositivos.

Exemplos e fonte

Como você visualizar o código exemplos e fonte nesta seção, nota que o formato do bootconfig código é apenas ligeiramente diferente do formato do cmdline kernel usado no Android 11 e inferiores. No entanto, a seguinte diferença é importante para o seu uso:

  • Os parâmetros devem ser separados pela sequência de escape nova linha \n , não por espaços.

Exemplo de bootloader

Para obter um exemplo do carregador de inicialização, consulte a implementação do carregador de inicialização de referência de inicialização U do Cuttlefish. Dois commits na referência estão listados abaixo. O primeiro atualiza o suporte da versão do cabeçalho de inicialização para a versão mais recente. No exemplo, o primeiro commit atualiza (ou uprevs) o suporte de versão para o próximo, v4. O segundo faz duas coisas; adiciona manipulação de bootconfig e demonstra a adição de parâmetros em tempo de execução:

Exemplo de construção

Para um exemplo de construção que mostra mkbootimg mudanças para construir o vendor_boot.img com o fornecedor de inicialização do cabeçalho v4, ver mkbootimg changes for bootconfig . Consulte as alterações do choco para fazer o seguinte:

Implementação

Os parceiros devem adicionar suporte aos seus bootloaders e mover seu tempo de construção androidboot.* Parâmetros do cmdline kernel para o arquivo bootconfig. A melhor maneira de implementar essa mudança é fazê-lo de forma incremental; ver a implementação e validação incremental seção para informações sobre seguindo um processo incremental.

Se você tiver alterações que buscam a proc / cmdline arquivo / para androidboot.* Parâmetros, ponto-los para o arquivo / proc / bootconfig vez. O ro.boot.* Propriedades são definidas com as novas bootconfig valores, assim você não precisará fazer alterações para o código usando essas propriedades.

Construir Mudanças

Primeiro, atualize sua 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 bootconfig parâmetro de kernel cmdline. 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 do BOARD_BOOTCONFIG variável, bem como o cmdline kernel é criado a partir BOARD\_KERNEL\_CMDLINE .

Qualquer androidboot.* parâmetros pode ser movido como é, semelhante ao seguinte:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Mudanças no bootloader

O bootloader configura os initramfs antes de saltar para o kernel. Os inicialização do kernel configuração pesquisas para a seção bootconfig, e olha para que seja no final de initramfs, com o trailer esperado.

O bootloader recebe o vendor_boot.img informações de layout do cabeçalho imagem Vendedor de inicialização.

Diagram of bootconfig memory allocation layout

Alocação de memória 12 bootconfig Figura 1. Android

O bootloader 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
  • 12 B corda bootconfig mágica ( #BOOTCONFIG\n )

Os parâmetros vêm de duas fontes: Parâmetros conhecidos no momento da construção e parâmetros que não são conhecidos no momento da construção. Parâmetros desconhecidos devem ser adicionados.

Parâmetros conhecidos no tempo de construção são embalados no interior da extremidade do vendor_boot imagem na secção bootconfig. O tamanho da secção é armazenada (como bytes) no fornecedor bota cabeçalho campo vendor_bootconfig_size .

Os parâmetros que não são conhecidos em tempo de construção são conhecidos apenas em tempo de execução no bootloader. Eles devem ser adicionados ao final da seção de parâmetros do bootconfig antes que o trailer do bootconfig seja aplicado.

Se você precisar adicionar qualquer parâmetro após o trailer do bootconfig ter sido aplicado, sobrescreva o trailer e reaplique-o.

Implementação e validação incrementais

Implemente o recurso bootconfig de forma incremental, seguindo o processo fornecido nesta seção. Deixe os parâmetros do 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:

  1. Faça o bootloader e construir mudanças, em seguida, faça o seguinte:
    1. Use o BOARD_BOOTCONFIG variável para adicionar um novo parâmetro bootconfig.
    2. Mantenha os parâmetros do cmdline do kernel do jeito que estão, para que o dispositivo possa continuar a inicializar corretamente. Isso torna a depuração e a validação muito mais fáceis.
  2. Verifique o seu trabalho, verificando o conteúdo de /proc/bootconfig . Verifique se você vê o parâmetro recém-adicionado após a inicialização do dispositivo.
  3. Mova o androidboot.* Parâmetros do cmdline kernel para bootconfig, usando o BOARD_BOOTCONFIG variável eo bootloader.
  4. Verifique se cada um dos parâmetros existe no /proc/bootconfig e não que eles estão em /proc/cmdline . Se você puder verificar isso, sua implementação foi bem-sucedida.

OTA upgrade e downgrade considerações

Ao gerenciar upgrades e downgrades OTA entre diferentes versões do Android ou diferentes versões do kernel, deve-se tomar cuidado especial.

O Android 12 é a primeira versão com suporte para bootconfig. Se for fazer o downgrade para qualquer versão anterior, os parâmetros do cmdline do kernel devem ser usados ​​em vez do bootconfig.

As versões de kernel 12-5.4 e posteriores oferecem suporte a bootconfig. Se for fazer downgrade para qualquer versão anterior (incluindo 11-5.4), os parâmetros cmdline do kernel devem ser usados.

As atualizações do Android 11 e anteriores para o Android 12 e posteriores podem continuar usando os parâmetros cmdline do kernel. O mesmo vale para atualizar as versões do kernel.

Solução de problemas

Quando você executar a etapa de verificar, se você não vê os parâmetros esperados em /proc/bootconfig , verifique os logs do kernel em logcat . Sempre há uma entrada de log presente para bootconfig se o kernel suportar.

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 você vir um log de erro retornado, houve um problema ao carregar o bootconfig. Para ver diferentes tipos de erros, visualizar o init / main.c .