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 detalles de configuración de la compilación y del 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 extensos del kernel androidboot.* al archivo bootconfig crea espacio en la cmdline del kernel y lo hace disponible para futuras expansiones.
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 del kernel que tiene esta compatibilidad: kernel 12-5.4.xx
Implementa la función bootconfig para nuevos dispositivos que se lanzan con una versión del kernel 12-5.10.xx. No es necesario que la implementes si actualizas dispositivos.
Ejemplos y fuente
Mientras ves 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 cmdline 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 de bootloader de referencia de Cuttlefish U-boot. A continuación, se enumeran dos confirmaciones en la referencia. La primera actualiza la compatibilidad de la versión del encabezado de inicio a la última versión. En el ejemplo, la primera confirmación actualiza (o uprevs) la compatibilidad de la versión a la siguiente, v4. La segunda hace dos cosas: agrega el control de bootconfig y muestra cómo agregar parámetros en el tiempo de ejecución:
- Actualiza la compatibilidad de la versión del encabezado de inicio a la última versión v4 versión.
- Agrega el control de bootconfig handling.
Ejemplo de compilación
Para ver un ejemplo de compilación que muestre los cambios de mkbootimg para compilar el
vendor_boot.img con el encabezado de inicio del proveedor v4, consulta mkbootimg changes for
bootconfig.
Consulta los cambios de Cuttlefish para hacer lo siguiente:
- Usa (o actualiza a) la versión v4 del encabezado de inicio del proveedor.
- Agrega bootconfig a la cmdline del kernel y mueve los parámetros seleccionados a bootconfig.
Implementación
Los socios deben agregar compatibilidad a sus bootloaders y mover sus parámetros androidboot.* de tiempo de compilación de la cmdline 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ígelos al archivo /proc/bootconfig. Las propiedades ro.boot.* se establecen con los nuevos valores bootconfig, por lo que no es necesario que realices cambios en el código que usa esas propiedades.
Cambios en la compilación
Primero, actualiza la versión del encabezado de inicio a la versión 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Agrega el parámetro de 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 manera similar a como se crea la cmdline del kernel a partir de BOARD\_KERNEL\_CMDLINE.
Cualquier parámetro androidboot.* se puede mover tal 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 pasar al kernel. La configuración de inicio del
kernel
busca la sección bootconfig y espera que esté al final de
initramfs, con el tráiler esperado.
El bootloader obtiene la información de diseño de vendor_boot.img del encabezado de la imagen de arranque del proveedor.
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
parameters sizede tamaño de 4 Bparameters checksumde tamaño de 4 B- Cadena mágica de bootconfig de 12 B (
#BOOTCONFIG\n)
Los parámetros provienen de dos fuentes: parámetros conocidos en el tiempo de compilación y parámetros que no se conocen en el tiempo de 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 (en bytes) en el campo vendor_bootconfig_size del encabezado de inicio del proveedor.
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. Estos se deben agregar al final de la sección de parámetros de bootconfig antes de que se aplique el tráiler de bootconfig.
Si necesitas agregar parámetros después de que se aplicó el tráiler de bootconfig, anula el tráiler y vuelve a aplicarlo.
Implementación y validación incrementales
Implementa la función bootconfig de forma incremental siguiendo el proceso que se indica en esta sección. Deja los parámetros de cmdline del kernel sin modificar mientras se agregan los parámetros de bootconfig.
Estos son los pasos para una implementación incremental, con validación:
- Realiza los cambios en el bootloader y la compilación, y luego haz lo siguiente:
- Usa la variable
BOARD_BOOTCONFIGpara agregar un nuevo parámetro de bootconfig. - Mantén los parámetros de cmdline del kernel tal como están para que el dispositivo pueda seguir iniciándose correctamente. Esto facilita mucho la depuración y la validación.
- Usa la variable
- Verifica tu trabajo revisando el contenido de
/proc/bootconfig. Verifica que veas el parámetro recién agregado después de que se haya iniciado el dispositivo. - Mueve los parámetros
androidboot.*de la cmdline del kernel a bootconfig, usando la variableBOARD_BOOTCONFIGy el bootloader. - Verifica que cada uno de los parámetros exista en
/proc/bootconfigY que no estén en/proc/cmdline. Si puedes verificar esto, tu implementación se realizó correctamente.
Consideraciones sobre la actualización y el cambio a una versión anterior de OTA
Cuando administres las actualizaciones y los cambios a versiones anteriores de 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 cambias a una versión anterior, se deben usar parámetros de cmdline del kernel en lugar de bootconfig.
Las versiones del kernel 12-5.4 y posteriores admiten bootconfig. Si cambias a una versión anterior(incluida la 11-5.4), se deben usar parámetros de cmdline del kernel.
Las actualizaciones de Android 11 y versiones anteriores a Android 12 y versiones posteriores pueden seguir usando parámetros de cmdline del kernel. Lo mismo sucede con la actualización de 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 lo admite.
Ejemplo de resultado del registro
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Si ves un registro de errores, significa que hubo un problema al cargar el bootconfig. Para ver diferentes tipos de errores, consulta init/main.c.