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. Si mueves los parámetros extensos del kernel androidboot.* al archivo bootconfig, se creará espacio en la cmdline del kernel y estará disponible para su expansión futura.

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

  • Primera versión compatible con Android 12
  • Primera versión de kernel compatible con el kernel 12-5.4.xx.

Implementa la función bootconfig para dispositivos nuevos que se lancen con una versión de kernel 12-5.10.xx. No es necesario que lo implementes si actualizas dispositivos.

Ejemplos y fuente

A medida que ves los ejemplos y el código fuente en esta sección, ten en cuenta que el formato del código bootconfig solo difiere ligeramente 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 en 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. La segunda realiza dos acciones: agrega el control de bootconfig y demuestra cómo agregar parámetros en el entorno de ejecución:

Ejemplo de compilación

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

Implementación

Los socios deben agregar compatibilidad a sus bootloaders y mover sus parámetros de tiempo de compilación androidboot.* de la cmdline del kernel al archivo bootconfig. La mejor manera de implementar este cambio es hacerlo de manera 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, apúntalos al archivo /proc/bootconfig. Las propiedades de ro.boot.* se establecen con los valores de bootconfig nuevos, por lo que no es necesario que realices 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 bootconfig se crean a partir de los parámetros en la variable BOARD_BOOTCONFIG, al igual que la cmdline del kernel se crea desde 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 el initramfs antes de saltar al kernel. La configuración de inicio del kernel busca la sección bootconfig y la busca al final de initramfs, con el avance 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 4 B parameters size
  • Tamaño 4 B parameters checksum
  • 12 B cadena mágica bootconfig (#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 del encabezado de inicio del proveedor vendor_bootconfig_size.

Los parámetros que no se conocen al momento de la compilación solo se conocen en el entorno de ejecución en el bootloader. Estos deben agregarse al final de la sección de parámetros bootconfig antes de que se aplique el avance de bootconfig.

Si necesitas agregar algún parámetro después de que se haya aplicado el avance de bootconfig, reemplaza el avance 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. Deja los parámetros de cmdline del kernel intactos mientras se agregan los parámetros bootconfig.

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

  1. Realiza el bootloader y los cambios de compilación. Luego, haz lo siguiente:
    1. Usa la variable BOARD_BOOTCONFIG para agregar un nuevo parámetro bootconfig.
    2. Mantén los parámetros de cmdline del kernel como están para que el dispositivo pueda continuar iniciándose de forma correcta. Esto facilita 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 haya iniciado el dispositivo.
  3. Mueve los parámetros androidboot.* del cmdline 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é en /proc/cmdline. Si puedes verificarlo, quiere decir que la implementación se realizó de forma correcta.

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

Cuando administras actualizaciones inalámbricas y cambios a versiones anteriores entre diferentes versiones de Android o diferentes versiones de kernel, debes tener especial cuidado.

Android 12 es la primera versión compatible con bootconfig. Si cambias a una versión anterior, se deben usar los parámetros cmdline del kernel en lugar de bootconfig.

Las versiones de kernel 12 a 5.4 y posteriores admiten bootconfig. Si se cambia a una versión inferior(incluida la 11-5.4), se deben usar los parámetros de cmdline del kernel.

Las actualizaciones de Android 11 y versiones anteriores a Android 12 y versiones posteriores pueden seguir usando los parámetros de cmdline del kernel. Lo mismo ocurre con la actualización de versiones de 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 cuando se cargaba el bootconfig. Para ver diferentes tipos de errores, consulta init/main.c.