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 consta 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 Linux Archivos makefile del kernel (busca “KERNELRelease”). w.x.y se usa directamente en este documento. Esto 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 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 que se agrega para tratar 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 el subnivel Y1 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, el subnivel no se debe reducir. 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.