Control de versiones de GKI

En esta página, se describe el esquema de control de versiones para imágenes genéricas de kernel (GKI). R Imagen genérica del kernel (GKI) tiene un identificador único llamado versión de kernel. La versión de kernel consiste en de la versión de la interfaz del módulo de kernel (KMI) y el subnivel. El kernel es específica de la imagen que se lanza, mientras que la versión de KMI representa la interfaz de la que se compila una versión. Una versión de KMI puede ser compatible múltiples versiones de kernel. Una versión de kernel está vinculada a una sola versión de KMI. En el improbable evento en el que se deba cambiar la interfaz del módulo de kernel, el KMI generación de demanda se itera para reflejar el cambio en la versión de KMI.

Resumen de las condiciones

En la siguiente tabla, se resumen los términos importantes que se usan en esta página y para ver las actualizaciones de GKI.

Nombre Símbolo Ejemplo Descripción
Lanzamiento de kernel w.x.y-zzz-k-sufijo 5.4.42-android12-0-foo Es el identificador único de una versión de GKI. Este es el valor que devuelve uname.
Versión de KMI w.x-zzz-k 5.4-android12-0 Describe la interfaz del módulo de kernel (KMI) entre GKI y módulos de kernel de carga dinámica (DLKM).
Subnivel y 42 Describe el orden de lanzamiento de las versiones de kernel dentro del misma versión de KMI.

En la siguiente tabla, se incluyen otros términos relacionados como referencia.

Nombre Símbolo Ejemplo Descripción
w.x.y w.x.y 5.4.42

Para obtener más información, consulta Archivos makefile del kernel de Linux (busca “KERNELRelease”).

w.x.y se usa directamente en este documento. También se conocido como el número de versión de tres partes. El término utilizado en VINTF, versión del kernel, puede confundir con otros términos. en especial w.

Esta variable se conoce como kernel_version_tuple en libkver.

Esta tupla no se debe reducir con ninguna actualización, incluidas las actualizaciones OTA o línea principal.

Rama del kernel zzz-w.x android12-5.4 Este término se utiliza en Tipos comunes de rama de kernel
Versión w 5 Este término no se usa en este documento. Esta variable se conoce como version en libkver.
Nivel de parche x 4 Este término no se usa en este documento. Esta variable se conoce como patch_level en libkver.
Versión de Android zzz Android12

Este es el número de versión de Android (desert) con el que está asociado el kernel. tus amigos.

Cuando se compara el campo AndroidRelease, la parte numérica es extraída de la cadena para compararla.

El número de versión de Android no debe reducirse con ninguna actualización, lo que incluye OTA o línea principal.

Generación de KMI k 0

Este es un número adicional para abordar con problemas eventos. Si una corrección de errores de seguridad requiere cambios en el KMI dentro del mismo versión de Android, aumenta la generación de KMI.

El número de generación de KMI comienza con 0.

Diseño del control de versiones

Lanzamiento de kernel

Definición

En el caso de los dispositivos que se incluyen con GKI, la versión de 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, consulta Determinación de la versión de kernel desde un dispositivo.

El siguiente es un ejemplo de una versión de 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 binarios de GKI tienen la misma versión de kernel, deben ser idénticas en términos de bytes.

Una versión de kernel consta de una versión de KMI, un subnivel y un sufijo. Para Para los fines de este documento, se ignora el sufijo después de la generación de KMI.

Versión de KMI

Definición

La versión de KMI se define de la siguiente manera:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

Ten en cuenta que el subnivel, y, no forma parte de la versión de KMI. En el ejemplo En la versión de kernel, la versión de KMI es la siguiente:

5.4-android12-0

Descripción

La versión de KMI describe la interfaz del módulo de kernel (KMI) entre GKI y módulos de kernel de carga dinámica (DLKM).

Si dos versiones de kernel tienen la misma versión de KMI, implementan el mismo kernel. del módulo. Los DLKM que son compatibles con uno también son compatibles con el otro.

La versión de KMI no se debe reducir con ninguna actualización OTA.

Subnivel

El subnivel, y, describe el orden de lanzamiento de las versiones de kernel dentro del misma versión de KMI.

Para dos versiones de kernel que tengan la misma versión de KMI, pero que tengan Y1 subnivel y Y2, respectivamente:

  • Si Y1 es menor o igual que Y2, un dispositivo que ejecute Y1 puede recibir un actualización a Y2.
  • Si Y1 es mayor que Y2, un dispositivo que ejecute Y1 no se puede actualizar a Y2.

Es decir, si la versión de KMI no cambia, no se debe reducir el nivel secundario por cualquier actualización OTA.

Cómo determinar la versión de kernel desde un dispositivo

Para encontrar la versión completa de kernel, ejecuta uname -r. uname(2) con el siguiente fragmento de código:

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

Este es un resultado de ejemplo:

5.4.42-android12-0-00544-ged21d463f856

A los efectos de este documento, se ignora todo lo que sigue a la generación de KMI cuando extraes información del kernel. De manera más formal, el resultado de uname -r es se analiza con la siguiente regex (suponiendo 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, cantidad de parches sobre el kernel de referencia, y 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 Es la cadena de versión de KMI. Para obtener una lista de las APIs que expone libkver, consulta packages/modules/Gki/libkver/include/kver

Verificaciones de VINTF

En Android 11 o versiones anteriores, la versión de Android de la versión de KMI es especificadas manualmente en el manifiesto del dispositivo por los fabricantes de dispositivos. Para obtener más información, consulta Reglas de coincidencia del kernel de VINTF.

Desde Android S, se puede extraer la parte de lanzamiento de Android de la versión de KMI. del kernel e insertarse en el manifiesto del dispositivo durante el tiempo de compilación.

Debido a que los requisitos de configuración del kernel generalmente no cambian, no hay debes codificar k dentro de la matriz de compatibilidad. Sin embargo, en el poco probable en caso de que deba cambiarse el requisito de configuración del kernel, asegúrate de que lo siguiente:

  • Se quita el requisito correspondiente de la matriz de compatibilidad.
  • Se agregan pruebas de VTS adicionales para verificar los nuevos requisitos condicionales. sobre la generación de KMI.

Versión de imagen de arranque en metadatos de OTA

Incluso si la imagen de arranque se actualiza a través de una actualización inalámbrica, debe ser unidos en el formato de carga útil inalámbrica, payload.bin. La carga útil OTA codifica version para cada partición. Cuando update_engine controla una carga útil inalámbrica, compara este campo para garantizar que la partición no cambie a una versión inferior.

Para evitar confusiones, el campo version para la partición de inicio de manera inalámbrica metadatos se llama boot image version.

Como el disco RAM se compila siempre desde cero, si usas el disco ramdisk timestamp es suficiente para describir toda la imagen de arranque. No es necesario de kernel en la versión de la imagen de inicio, a menos que estés uniendo de arranque a un nuevo objeto binario de kernel en el futuro.

Antes de una actualización inalámbrica, el cliente inalámbrico verifica la versión de la imagen de inicio del mismo modo que cualquier otra partición.