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 del kernel androidboot.*
extensos al archivo bootconfig crea espacio en la línea de comandos del kernel y lo deja disponible para futuras expansiones.
Tanto el kernel como el espacio del 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 lancen con una versión de kernel 12-5.10.xx. No es necesario que lo implementes si actualizas los dispositivos.
Ejemplos y fuente
Cuando veas los ejemplos y el código fuente de 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 separarse con la secuencia de escape de línea nueva
\n
, no con espacios.
Ejemplo de bootloader
Para ver un ejemplo de bootloader, consulta la implementación de referencia del bootloader de U-boot de Cuttlefish. A continuación, se enumeran dos confirmaciones en la referencia. El primer uprev actualiza 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 versión) la compatibilidad de versiones a la siguiente, la v4. El segundo 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 versión v4 más reciente.
- Agrega el control de bootconfig.
Compila el ejemplo
Para ver un ejemplo de compilación que muestre los cambios de mkbootimg
para compilar 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:
- Usa (o actualiza a) la versión v4 del encabezado de inicio del proveedor.
- Agrega bootconfig a la línea de comandos del kernel y mueve los parámetros seleccionados a bootconfig.
Implementación
Los socios deben agregar compatibilidad 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 de 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 de 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 la línea de comandos 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 similar a como se crea la línea de comandos del kernel a partir de 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 bootloader
El cargador de arranque configura initramfs
antes de saltar 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 cargador de arranque 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 en Android 12
El cargador 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 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: los parámetros conocidos en el momento de la compilación y los parámetros que no se conocen en el momento de la compilación. Se deben agregar los 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 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 del cargador de arranque. 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 haya aplicado el tráiler de bootconfig, reemplaza el tráiler y vuelve a aplicarlo.
Implementación y validación incrementales
Implementa la función de bootconfig de forma incremental siguiendo el proceso que se indica en esta sección. Deja los parámetros de la línea de comandos 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 cargador de arranque y la compilación, y, luego, haz lo siguiente:
- Usa la variable
BOARD_BOOTCONFIG
para agregar un parámetro de bootconfig nuevo. - Mantén los parámetros de la línea de comandos del kernel tal como están para que el dispositivo pueda seguir iniciando 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 inicie el dispositivo. - Mueve los parámetros
androidboot.*
de la línea de comandos del kernel a bootconfig, usando la variableBOARD_BOOTCONFIG
y el bootloader. - Verifica que cada uno de los parámetros exista en
/proc/bootconfig
Y 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 inferior por OTA
Cuando administras actualizaciones y reversiones 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 revierte a una versión anterior, se deben usar los parámetros de la línea de comandos del kernel en lugar de bootconfig.
Las versiones de kernel 12-5.4 y posteriores admiten bootconfig. Si se revierte a una versión anterior a esa(incluida la 11-5.4), se deben usar parámetros de la línea de comandos del kernel.
Las actualizaciones de Android 11 y versiones anteriores a Android 12 y versiones posteriores pueden seguir usando parámetros de la línea de comandos del kernel. Lo mismo sucede 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
, consulta los registros del kernel en logcat
. Siempre hay una entrada de registro 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 ves un registro de errores, significa que hubo un problema al cargar el bootconfig. Para ver los diferentes tipos de errores, consulta init/main.c.