Implementando Bootconfig en Android 12

En Android 12, la función bootconfig reemplaza las opciones de línea de comando del kernel androidboot.* en uso 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 cargador de arranque a Android 12.

Esta característica proporciona una forma de separar los parámetros de configuración para el espacio de usuario de Android de los del kernel. Mover los extensos parámetros del kernel de androidboot.* al archivo bootconfig crea espacio en la línea de cmd del kernel y lo hace disponible para una fácil expansión futura.

Tanto el kernel como el espacio de usuario de Android deben ser compatibles bootconfig .

  • Primera versión que tiene este soporte: Android 12
  • Primera versión del kernel que tiene este soporte: kernel 12-5.4.xx

Implemente la función bootconfig para nuevos dispositivos que se inicien con una versión de kernel 12-5.10.xx. No necesita implementarlo si está actualizando dispositivos.

Ejemplos y fuente

Al ver los ejemplos y el código fuente en esta sección, tenga en cuenta que el formato del código bootconfig es solo 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 su uso:

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

Ejemplo de cargador de arranque

Para ver un ejemplo de cargador de arranque, consulte la implementación del cargador de arranque de referencia Cuttlefish U-boot. Dos confirmaciones en la referencia se enumeran a continuación. El primero actualiza el soporte de la versión del encabezado de arranque a la última versión. En el ejemplo, la primera confirmación actualiza (o aumenta) el soporte de la versión a la siguiente, v4. El segundo hace dos cosas; agrega el manejo de bootconfig y demuestra cómo agregar parámetros en tiempo 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 arranque del proveedor v4, consulte mkbootimg changes for bootconfig . Vea los cambios de Cuttlefish para hacer lo siguiente:

Implementación

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

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

Construir cambios

Primero, actualice la versión de su encabezado de arranque a la versión 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Agregue el parámetro bootconfig del kernel bootconfig. Esto hace que el núcleo busque la sección bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Los parámetros de configuración de arranque se crean a partir de los parámetros de la variable BOARD_BOOTCONFIG , al igual que la línea de comandos del núcleo se crea a partir de BOARD\_KERNEL\_CMDLINE .

Cualquier parámetro de androidboot.* se puede mover tal cual, de forma similar a lo siguiente:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Cambios en el cargador de arranque

El cargador de arranque configura initramfs antes de saltar al kernel. La configuración de arranque del núcleo busca la sección bootconfig y busca que esté al final de initramfs, con el avance esperado.

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

Diagram of bootconfig memory allocation layout

Figura 1. Asignación de memoria de configuración de arranque de Android 12

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

  • Parámetros
  • Tamaño de parameters size 4 B
  • Suma de parameters checksum de tamaño 4 B
  • Cadena mágica de configuración de arranque de 12 B ( #BOOTCONFIG\n )

Los parámetros provienen de dos orígenes: 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 momento de la 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 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 gestor de arranque. Estos deben agregarse al final de la sección de parámetros de bootconfig antes de que se aplique el tráiler de bootconfig.

Si necesita agregar algún parámetro después de que se haya aplicado el tráiler de bootconfig, sobrescriba el tráiler y vuelva a aplicarlo.

Implementación y validación incrementales

Implemente la función bootconfig de forma incremental siguiendo el proceso que se indica en esta sección. Deje intactos los parámetros cmdline del kernel mientras se agregan los parámetros bootconfig.

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

  1. Realice los cambios en el cargador de arranque y la compilación, luego haga lo siguiente:
    1. Use la variable BOARD_BOOTCONFIG para agregar un nuevo parámetro bootconfig.
    2. Mantenga los parámetros de la línea de comandos del kernel como están, para que el dispositivo pueda continuar arrancando correctamente. Esto hace que la depuración y la validación sean mucho más fáciles.
  2. Verifique su trabajo comprobando el contenido de /proc/bootconfig . Verifique que vea el parámetro recién agregado después de que el dispositivo haya arrancado.
  3. Mueva los parámetros de androidboot.* desde la línea de comandos del kernel a bootconfig, usando la variable BOARD_BOOTCONFIG y el gestor de arranque.
  4. Verifique que cada uno de los parámetros exista en /proc/bootconfig Y que no estén en /proc/cmdline . Si puede verificar esto, su implementación fue exitosa.

Consideraciones de actualización y degradación de OTA

Cuando administre actualizaciones y degradaciones de OTA entre diferentes versiones de Android o diferentes versiones de kernel, se debe tener especial cuidado.

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

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

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

Solución de problemas

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

Salida de registro de ejemplo

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

Si ve un registro de error devuelto, entonces hubo un problema al cargar el archivo bootconfig. Para ver diferentes tipos de errores, consulte init/main.c .