Implementa bootconfig en Android 12

En Android 12, la función bootconfig reemplaza las opciones de cmdline del kernel androidboot.* que se usan con Android 11 y versiones anteriores. La función bootconfig es un mecanismo para pasar los detalles de configuración de la compilación y el bootloader a Android 12.

Esta función proporciona una manera de separar los parámetros de configuración para el espacio de usuario de Android de aquellos para el kernel. Mover los parámetros largos del kernel androidboot.* al archivo bootconfig crea espacio en la línea de comandos del kernel y lo pone a disposición para una expansión futura.

Tanto el kernel como el espacio de usuario de Android deben admitir bootconfig.

  • Primera versión que tiene esta compatibilidad: Android 12
  • Primera versión de kernel compatible con el kernel 12-5.4.xx.

Se implementó la función bootconfig para los dispositivos nuevos que se inician con una versión de kernel 12-5.10.xx. No es necesario que la implementes si actualizas los dispositivos.

Ejemplos y fuente

Cuando veas los ejemplos y el código fuente en esta sección, ten en cuenta que el formato del código bootconfig solo es ligeramente diferente del formato de la línea de comandos del kernel que se usa en Android 11 y versiones anteriores. Sin embargo, la siguiente diferencia es importante para tu uso:

  • Los parámetros deben estar separados por la secuencia de escape de línea nueva \n, no por espacios.

Ejemplo de bootloader

Para ver un ejemplo de bootloader, consulta la implementación del bootloader de referencia de U-boot de Cuttlefish. A continuación, se enumeran dos confirmaciones de la referencia. El primero aumenta la compatibilidad de la versión del encabezado de inicio a la versión más reciente. En el ejemplo, la primera confirmación actualiza (o aumenta) la compatibilidad de la versión a la siguiente, v4. El segundo hace dos cosas: agrega el control de bootconfig y demuestra cómo agregar parámetros durante el tiempo de ejecución:

Ejemplo de compilación

Para ver un ejemplo de compilación que muestra los cambios de mkbootimg para compilar el vendor_boot.img con el encabezado de arranque del proveedor v4, consulta mkbootimg changes for bootconfig. Consulta los cambios de Cuttlefish para hacer lo siguiente:

Implementación

Los socios deben agregar compatibilidad a sus bootloaders y mover sus parámetros androidboot.* de tiempo de compilación de la línea de comandos del kernel al archivo bootconfig. La mejor manera de implementar este cambio es hacerlo de forma incremental. Consulta la sección Implementación y validación incrementales para obtener información sobre cómo seguir un proceso incremental.

Si tienes cambios que buscan parámetros androidboot.* en el archivo /proc/cmdline, diríjelos al archivo /proc/bootconfig. Las propiedades ro.boot.* se establecen con los nuevos valores bootconfig, por lo que no necesitas realizar cambios en el código que usa esas propiedades.

Cambios en la compilación

Primero, aumenta la versión de tu encabezado de inicio a la versión 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Agrega el parámetro cmdline del kernel bootconfig. Esto hace que el kernel busque la sección bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Los parámetros de bootconfig se crean a partir de los parámetros de la variable BOARD_BOOTCONFIG, al igual que el cmdline del kernel se crea a partir de BOARD\_KERNEL\_CMDLINE.

Cualquier parámetro androidboot.* se puede mover como está, de manera similar a lo siguiente:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Cambios en el bootloader

El bootloader configura initramfs antes de saltar al kernel. La configuración de inicio del kernel busca la sección bootconfig y comprueba que esté al final de initramfs, con el tráiler esperado.

El bootloader obtiene la información de diseño vendor_boot.img del encabezado de la imagen de arranque del proveedor.

Diagrama del diseño de asignación de memoria de bootconfig

Figura 1: Asignación de memoria de bootconfig de Android 12

El bootloader crea la sección bootconfig en la memoria. La sección bootconfig contiene asignaciones de memoria para lo siguiente:

  • Parámetros
  • Tamaño de 4 B: parameters size
  • Tamaño 4 B parameters checksum
  • Cadena mágica de bootconfig de 12 B (#BOOTCONFIG\n)

Los parámetros provienen de dos fuentes: parámetros conocidos en el momento de la compilación y parámetros que no se conocen en el momento de la compilación. Se deben agregar parámetros desconocidos.

Los parámetros conocidos en el tiempo de compilación se empaquetan al final de la imagen vendor_boot en la sección bootconfig. El tamaño de la sección se almacena (como bytes) en el campo de encabezado de arranque del proveedor vendor_bootconfig_size.

Los parámetros que no se conocen en el momento de la compilación solo se conocen en el tiempo de ejecución en el bootloader. Se deben agregar al final de la sección de parámetros de bootconfig antes de aplicar el remolque de bootconfig.

Si necesitas agregar algún parámetro después de aplicar el remolque de bootconfig, reemplaza el remolque y vuelve a aplicarlo.

Implementación y validación incrementales

Implementa la función bootconfig de manera incremental siguiendo el proceso que se indica en esta sección. No modifiques los parámetros de cmdline del kernel mientras se agregan los parámetros de bootconfig.

Estos son los pasos para una implementación incremental, con validación:

  1. Realiza los cambios en el bootloader y compila, y, luego, haz lo siguiente:
    1. Usa la variable BOARD_BOOTCONFIG para agregar un nuevo parámetro de bootconfig.
    2. Mantén los parámetros de cmdline del kernel como están, de modo que el dispositivo pueda seguir iniciando correctamente. Esto facilita mucho la depuración y la validación.
  2. Verifica tu trabajo revisando el contenido de /proc/bootconfig. Verifica que veas el parámetro agregado recientemente después de que se inicie el dispositivo.
  3. Mueve los parámetros androidboot.* de la línea de comandos del kernel a bootconfig con la variable BOARD_BOOTCONFIG y el bootloader.
  4. Verifica que cada uno de los parámetros exista en /proc/bootconfig Y que no estén en /proc/cmdline. Si puedes verificar esto, significa que la implementación se realizó correctamente.

Consideraciones sobre la actualización y el cambio a una versión inferior por OTA

Cuando administras actualizaciones y versiones anteriores por OTA entre diferentes versiones de Android o diferentes versiones del kernel, debes tener especial cuidado.

Android 12 es la primera versión compatible con bootconfig. Si se realiza una baja de versión a una versión anterior, se deben usar los parámetros de línea de comandos del kernel en lugar de bootconfig.

Las versiones de kernel 12-5.4 y posteriores admiten bootconfig. Si se realiza una versión inferior a cualquier versión anterior(incluida la 11-5.4), se deben usar los parámetros de línea de comandos del kernel.

Las actualizaciones de Android 11 y versiones anteriores a Android 12 y versiones posteriores pueden seguir usando los parámetros de línea de comandos del kernel. Lo mismo ocurre con la actualización de las versiones del kernel.

Solución de problemas

Cuando realices el paso de verificación, si no ves los parámetros esperados en /proc/bootconfig, revisa los registros del kernel en logcat. Siempre hay una entrada de registro presente para bootconfig si el kernel la admite.

Ejemplo de resultado de registro

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

Si ves que se muestra un registro de errores, significa que hubo un problema al cargar el archivo de configuración de inicio. Para ver los diferentes tipos de errores, consulta init/main.c.