Esta página describe el esquema de control de versiones para imágenes de kernel genéricas (GKI). Una imagen de kernel genérica (GKI) tiene un identificador único llamado versión del kernel. La versión del kernel consta de la versión de la interfaz del módulo del kernel (KMI) y el subnivel. La versión del kernel es específica de la imagen que se publica, mientras que la versión KMI representa la interfaz desde la que se crea una versión. Una versión de KMI puede admitir múltiples versiones del kernel. Una versión del kernel está vinculada a una sola versión de KMI. En el improbable caso de que sea necesario cambiar la interfaz del módulo del kernel, la generación de KMI se repite para reflejar el cambio en la versión de KMI.
Resumen de términos
La siguiente tabla resume los términos importantes utilizados en esta página y para las actualizaciones de GKI.
Nombre | Símbolo | Ejemplo | Descripción |
---|---|---|---|
Lanzamiento del núcleo | sufijo wxy-zzz-k | 5.4.42-android12-0-foo | Identificador único para una versión de GKI. Este es el valor devuelto por uname . |
Versión KMI | wx-zzz-k | 5.4-android12-0 | Describe la interfaz del módulo del kernel (KMI) entre GKI y los módulos del kernel cargables dinámicamente (DLKM). |
Subnivel | y | 42 | Describe el orden de lanzamiento de las versiones del kernel dentro de la misma versión de KMI. |
La siguiente tabla enumera otros términos relacionados como referencia.
Nombre | Símbolo | Ejemplo | Descripción |
---|---|---|---|
wxy | wxy | 5.4.42 | Para obtener más información, consulte Makefiles del kernel de Linux (busque "KERNELRELEASE"). wxy se utiliza directamente en todo este documento. Esto también se conoce comúnmente como número de versión de tres partes . El término utilizado en VINTF, versión del kernel , puede causar confusión con otros términos, especialmente w . Esta variable se denomina kernel_version_tuple en libkver . Esta tupla no debe verse disminuida por ninguna actualización, incluida OTA o la línea principal. |
rama del núcleo | zzz-wx | android12-5.4 | Este término se utiliza en tipos de ramas comunes del kernel . |
Versión | w | 5 | Este término no se utiliza en este documento. Esta variable se denomina versión en libkver . |
Nivel de parche | X | 4 | Este término no se utiliza en este documento. Esta variable se conoce como patch_level en libkver . |
Lanzamiento de Android | zzz | android12 | Este es el número de versión de Android (postre) al que está asociado el kernel. Al comparar el campo El número de versión de Android no debe verse disminuido por ninguna actualización, incluida OTA o la línea principal. |
generación KMI | k | 0 | Este es un número adicional agregado para hacer frente a eventos improbables. Si una corrección de un error de seguridad requiere cambios en el KMI dentro de la misma versión de Android, se aumenta una generación de KMI. El número de generación de KMI comienza con 0. |
Diseño de versiones
Lanzamiento del núcleo
Definición
Para los dispositivos que se envían con GKI, la versión del kernel se define de la siguiente manera:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
Para obtener más información, consulte Determinar la versión del kernel desde un dispositivo .
El siguiente es un ejemplo de una versión del kernel.
5.4.42-android12-0-00544-ged21d463f856
Descripción
La versión del kernel es el ID único de una versión de GKI. Si dos archivos binarios de GKI tienen la misma versión del kernel, deben ser idénticos en bytes.
Una versión del kernel consta de una versión KMI, un subnivel y un sufijo. A los efectos de este documento, se ignora el sufijo posterior a la generación de KMI.
Versión KMI
Definición
La versión de KMI se define de la siguiente manera:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
Tenga en cuenta que el subnivel y
no forma parte de la versión KMI. Para el ejemplo de la versión Kernel , la versión KMI es:
5.4-android12-0
Descripción
La versión KMI describe la interfaz del módulo del kernel (KMI) entre GKI y los módulos del kernel cargables dinámicamente (DLKM).
Si dos versiones del kernel tienen la misma versión de KMI, implementan la misma interfaz del módulo del kernel. Los DLKM que son compatibles con uno también lo son con el otro.
La versión de KMI no debe verse disminuida por ninguna actualización OTA.
Subnivel
El subnivel, y
, describe el orden de lanzamiento de las versiones del kernel dentro de la misma versión de KMI.
Para dos versiones del kernel que tienen la misma versión de KMI pero tienen el subnivel Y1 e Y2 respectivamente:
- Si Y1 es menor o igual que Y2, un dispositivo que ejecuta Y1 puede recibir una actualización a Y2.
- Si Y1 es mayor que Y2, un dispositivo que ejecuta Y1 no se puede actualizar a Y2.
Es decir, si la versión de KMI no cambia, ninguna actualización OTA debe disminuir el subnivel.
Determinar la liberación del kernel desde un dispositivo
La versión completa del kernel se puede encontrar ejecutando uname -r
o uname(2)
con el siguiente fragmento de código:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
Un resultado de ejemplo es:
5.4.42-android12-0-00544-ged21d463f856
A los efectos de este documento, todo lo posterior a la generación de KMI se ignora al extraer información del kernel. Más formalmente, la salida de uname -r
se analiza con la siguiente expresión regular (asumiendo que zzz siempre comienza con "android"):
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
La información ignorada puede incluir información como el número de compilación de ci.android.com , la cantidad de parches en la parte superior del kernel de referencia y los hashes SHA de la confirmación de git.
libkver
La biblioteca, libkver, proporciona una interfaz C++ para analizar la versión del kernel o una cadena de versión KMI. Para obtener una lista de API que expone libkver, consulte packages/modules/Gki/libkver/include/kver
.
Cheques VINTF
Para Android 11 o versiones anteriores, la parte de lanzamiento de Android de la versión KMI se especifica manualmente en el manifiesto del dispositivo por parte de los fabricantes del dispositivo. Para obtener más información, consulte Reglas de coincidencia del kernel VINTF .
Desde Android S, la parte de lanzamiento de Android de la versión KMI se puede extraer del kernel e inyectar en el manifiesto del dispositivo en el momento de la compilación.
Debido a que los requisitos de configuración del kernel generalmente no cambian, no es necesario codificar k
dentro de la matriz de compatibilidad. Sin embargo, en el improbable caso de que sea necesario cambiar el requisito de configuración del kernel, asegúrese de lo siguiente:
- Se elimina el requisito correspondiente de la matriz de compatibilidad.
- Se agregan pruebas VTS adicionales para verificar los nuevos requisitos condicionados a la generación de KMI.
Versión de la imagen de arranque en metadatos OTA
Incluso si la imagen de arranque se actualiza a través de OTA, debe estar empaquetada en el formato de carga útil OTA, payload.bin
. La carga útil OTA codifica un campo version
para cada partición. Cuando update_engine
maneja una carga útil OTA, compara este campo para garantizar que la partición no se degrade.
Para evitar confusiones, el campo version
de la partición de inicio en los metadatos OTA se llama boot image version
.
Debido a que el disco ram siempre se crea desde cero, usar la marca de tiempo del disco ram es suficiente para describir toda la imagen de arranque. No es necesario codificar la versión del kernel en la versión de la imagen de inicio, a menos que esté uniendo una imagen de inicio antigua a un nuevo binario del kernel en el futuro.
Antes de una actualización OTA, el cliente OTA verifica la versión de la imagen de inicio de la misma manera que cualquier otra partición.