Implementación de Bootconfig en Android 12

En Android 12, la función bootconfig reemplaza las opciones de línea de cmd del kernel androidboot.* que se usan con Android 11 y versiones anteriores. La función bootconfig es un mecanismo para pasar detalles de configuración desde la compilación y el gestor de arranque a Android 12.

Esta característica proporciona una manera 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 androidboot.* al archivo bootconfig crea espacio en la línea cmd del kernel y lo deja disponible para una fácil expansión futura.

Tanto el kernel como el espacio de usuario de Android deben admitir 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 del kernel 12-5.10.xx. No es necesario 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 cmd del kernel utilizada 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. A continuación se enumeran dos confirmaciones en la referencia. 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 uprevs) la versión compatible con la siguiente, v4. El segundo hace dos cosas; agrega manejo de bootconfig y demuestra cómo agregar parámetros en tiempo de ejecución:

Ejemplo de construcción

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

Implementación

Los socios deben agregar soporte a sus cargadores de arranque y mover sus parámetros androidboot.* en tiempo de compilación desde la línea cmd 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 incremental 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.* , apúntelos al archivo /proc/bootconfig. Las propiedades ro.boot.* se configuran con los nuevos valores bootconfig , por lo que no es necesario realizar cambios en el código que utiliza esas propiedades.

Cambios de compilación

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 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 , de forma muy parecida a como la línea cmd del kernel se crea desde BOARD\_KERNEL\_CMDLINE .

Cualquier parámetro 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 gestor de arranque configura initramfs antes de saltar al kernel. La configuración de arranque del kernel 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 vendor_boot.img del encabezado de la imagen de inicio 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
  • 4 parameters size de tamaño B tamaño
  • parameters checksum de tamaño 4 B
  • 12 B cadena mágica de 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 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 inicio 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 avance de bootconfig.

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

Implementación y validación incrementales

Implemente la función bootconfig de forma incremental siguiendo el proceso indicado en esta sección. Deje los parámetros de la línea cmd del kernel intactos mientras se agregan los parámetros de bootconfig.

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

  1. Realice cambios en el gestor de arranque y la compilación, luego haga lo siguiente:
    1. Utilice la variable BOARD_BOOTCONFIG para agregar un nuevo parámetro bootconfig.
    2. Mantenga los parámetros de la línea cmdline del kernel tal como están, para que el dispositivo pueda continuar arrancando correctamente. Esto facilita mucho la depuración y la validación.
  2. Verifique su trabajo revisando el contenido de /proc/bootconfig . Verifique que vea el parámetro recién agregado después de que se haya iniciado el dispositivo.
  3. Mueva los parámetros androidboot.* desde la línea cmd 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 gestionas actualizaciones y degradaciones OTA entre diferentes versiones de Android o diferentes versiones del kernel, se debe tener especial cuidado.

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

Las versiones del kernel 12-5.4 y posteriores admiten bootconfig. Si se degrada a cualquier versión anterior a esa (incluida la 11-5.4), se deben utilizar los parámetros de la línea de cmd del kernel.

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

Solución de problemas

Cuando realiza 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.

Ejemplo de salida de registro

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

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