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 la configuración
de la compilación y el bootloader hasta 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. Cómo mover el kernel androidboot.*
largo
al archivo bootconfig crea espacio en la cmdline del kernel y hace que
estarán disponibles para una 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.
Se implementó la función bootconfig para los dispositivos nuevos que se inician con una versión de kernel 12-5.10.xx. No es necesario que lo implementes si actualizas dispositivos.
Ejemplos y fuente
Cuando veas 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
cmdline de 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 el bootloader de referencia de U-boot de Cuttlefish. para implementarlos. A continuación, se enumeran dos confirmaciones en la referencia. La primera actualización 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 actualiza) la compatibilidad de la versión a la siguiente, la v4. El segundo hace dos cosas: agrega el control de bootconfig y demuestra cómo agregar parámetros durante 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 bootconfig y administración.
Ejemplo de compilación
Para ver un ejemplo de compilación que muestra los cambios de mkbootimg
para compilar el vendor_boot.img
con el encabezado de arranque del proveedor v4, consulta mkbootimg changes for
bootconfig
.
Consulta los cambios de Cuttlefish para lo siguiente:
- Usar (o aumentar los ingresos) la versión del encabezado de inicio del proveedor v4
- 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 transferir su tiempo de compilación.
Parámetros androidboot.*
del cmdline del kernel a 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 androidboot.*
en el archivo /proc/cmdline
de parámetros, apúntalas al archivo /proc/bootconfig
en su lugar. El ro.boot.*
se establecen con los nuevos valores de bootconfig
, por lo que no necesitas hacer
cambios en el código usando 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
La variable BOARD_BOOTCONFIG
, al igual que a partir de la cual se crea la cmdline del kernel
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 initramfs
antes de saltar al kernel. El kernel
configuración de inicio
busca la sección bootconfig y busca que esté al final de
initramfs,
con el avance esperado.
El bootloader obtiene la información de diseño vendor_boot.img
del proveedor.
encabezado de imagen de arranque.
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 de 4 B:
parameters size
- Tamaño de 4 B:
parameters checksum
- 12 B cadena mágica bootconfig (
#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 parámetros desconocidos.
Los parámetros conocidos en el tiempo de compilación se empaquetan al final de vendor_boot
.
en la sección bootconfig. El tamaño de la sección se almacena (como bytes) en el campo de encabezado de arranque 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 bootloader. Se deben agregar al final de la sección de parámetros de bootconfig antes de aplicar el remolque de bootconfig.
Si necesitas agregar algún parámetro después de que se haya aplicado el avance de bootconfig, reemplazar el avance y volver a aplicarlo.
Implementación y validación incrementales
Para implementar la función de bootconfig de forma incremental, sigue el proceso que se indica en esta sección. No modifiques los parámetros de cmdline del kernel mientras la 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_BOOTCONFIG
para agregar un nuevo parámetro de bootconfig. - Mantén los parámetros de cmdline del kernel como están, para que el dispositivo puedan continuar iniciando correctamente. Esto facilita mucho la depuración y la validación.
- Usa la variable
- Verifica tu trabajo revisando el contenido de
/proc/bootconfig
. Verificar que veas el parámetro agregado recientemente después de que se haya iniciado el dispositivo. - Mueve los parámetros
androidboot.*
de la línea de comandos del kernel a bootconfig con 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 verificarlo, tu implementación tuvo éxito.
Consideraciones sobre la actualización y el cambio a una versión inferior mediante OTA
Cuando administras actualizaciones y versiones anteriores por OTA entre diferentes versiones de Android o diferentes versiones de kernel, debes tener especial cuidado.
Android 12 es la primera versión con compatibilidad con bootconfig. Si se realiza una baja de versión a una versión anterior, se deben usar los parámetros de cmdline del kernel en lugar de bootconfig.
Las versiones de kernel 12-5.4 y posteriores admiten bootconfig. Si se realiza una versión inferior a cualquier versión anterior (incluida la 11-5.4), se deben usar los parámetros de línea de comandos del kernel.
Las actualizaciones de Android 11 y versiones anteriores a Android 12 y versiones posteriores pueden seguir usando los parámetros de línea de comandos 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
, verifica los registros del kernel en logcat
. Siempre hay un registro
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 que se muestra un registro de errores, significa que hubo un problema al cargar el archivo de configuración de inicio. Para ver los diferentes tipos de errores, consulta init/main.c: