Схема управления версиями GKI

На этой странице описывается схема управления версиями для образов ядра Generic Kernel Images (GKI). Образ ядра Generic Kernel Image (GKI) имеет уникальный идентификатор, называемый выпуском ядра. Выпуск ядра состоит из версии интерфейса модуля ядра (KMI) и подуровня. Выпуск ядра специфичен для выпускаемого образа, тогда как версия KMI представляет собой интерфейс, из которого строится выпуск. Версия KMI может поддерживать несколько выпусков ядра. Выпуск ядра привязан только к одной версии KMI. В маловероятном случае, когда интерфейс модуля ядра должен быть изменен, генерация KMI повторяется, чтобы отразить изменение версии KMI.

Краткое изложение терминов

В следующей таблице приведены важные термины, используемые на этой странице и в обновлениях GKI.

Имя Символ Пример Описание
Выпуск ядра wxy-zzz-k-суффикс 5.4.42-android12-0-foo Уникальный идентификатор для выпуска GKI. Это значение, возвращаемое uname .
версия КМИ wx-zzz-k 5.4-android12-0 Описывает интерфейс модуля ядра (KMI) между GKI и динамически загружаемыми модулями ядра (DLKM).
Подуровень у 42 Описывает порядок выпуска версий ядра в пределах одной версии KMI.

В следующей таблице для справки перечислены другие связанные термины.

Имя Символ Пример Описание
шху шху 5.4.42

Подробную информацию см. в разделе Файлы сборки ядра Linux (поиск по запросу «KERNELRELEASE»).

wxy используется напрямую в этом документе. Это также обычно называют трехчастным номером версии . Термин, используемый в VINTF, версия ядра , может вызвать путаницу с другими терминами, особенно w .

Эта переменная называется kernel_version_tuple в libkver .

Этот кортеж не должен уменьшаться никакими обновлениями, включая OTA или основную ветку.

Ветка ядра ззз-вкс андроид12-5.4 Этот термин используется в общих типах ветвей ядра .
Версия ж 5 Этот термин не используется в этом документе. Эта переменная называется версией в libkver .
Уровень патча х 4 Этот термин не используется в этом документе. Эта переменная называется patch_level в libkver .
релиз Android ззз андроид12

Это номер версии Android (dessert), с которым связано ядро.

При сравнении поля AndroidRelease числовая часть извлекается из строки для сравнения.

Номер версии Android не должен уменьшаться из-за каких-либо обновлений, включая OTA или основную ветку.

Генерация КМИ к 0

Это дополнительный номер, добавленный для обработки маловероятных событий. Если исправление ошибки безопасности требует изменений в KMI в том же выпуске Android, поколение KMI увеличивается.

Номер поколения KMI начинается с 0.

Версионный дизайн

Выпуск ядра

Определение

Для устройств, поставляемых с GKI, выпуск ядра определяется следующим образом:

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

Для получения дополнительной информации см. Определение версии ядра на устройстве .

Ниже приведен пример выпуска ядра.

5.4.42-android12-0-00544-ged21d463f856

Описание

Выпуск ядра — это уникальный идентификатор выпуска GKI. Если два двоичных файла GKI имеют один и тот же выпуск ядра, они должны быть идентичны побайтово.

Выпуск ядра состоит из версии KMI, подуровня и суффикса. Для целей этого документа суффикс после генерации KMI игнорируется.

версия КМИ

Определение

Версия KMI определяется следующим образом:

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

Обратите внимание, что подуровень y не является частью версии KMI. Для примера в выпуске ядра версия KMI следующая:

5.4-android12-0

Описание

Версия KMI описывает интерфейс модуля ядра (KMI) между GKI и динамически загружаемыми модулями ядра (DLKM).

Если два релиза ядра имеют одинаковую версию KMI, они реализуют один и тот же интерфейс модуля ядра. DLKM, совместимые с одним, также совместимы и с другим.

Версия KMI не должна быть снижена какими-либо обновлениями OTA.

Подуровень

Подуровень y описывает порядок выпуска релизов ядра в пределах одной версии KMI.

Для двух выпусков ядра с одинаковой версией KMI, но имеющими подуровни Y1 и Y2 соответственно:

  • Если Y1 меньше или равен Y2, устройство, работающее под управлением Y1, может получить обновление до Y2.
  • Если Y1 больше Y2, устройство под управлением Y1 не может быть обновлено до Y2.

То есть, если версия KMI не меняется, подуровень не должен понижаться ни при каком обновлении OTA.

Определить версию ядра с устройства

Полную версию ядра можно найти, выполнив uname -r или uname(2) со следующим фрагментом кода:

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

Пример вывода:

5.4.42-android12-0-00544-ged21d463f856

Для целей этого документа все, что находится после генерации KMI, игнорируется при извлечении информации ядра. Более формально, вывод uname -r анализируется с помощью следующего регулярного выражения (предполагая, что zzz всегда начинается с "android"):

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

Игнорируемая информация может включать в себя такие данные, как номер сборки ci.android.com , количество исправлений поверх базового ядра и хэши SHA коммита git.

libkver

Библиотека libkver предоставляет интерфейс C++ для разбора версии ядра или строки версии KMI. Список API, которые предоставляет libkver, см. packages/modules/Gki/libkver/include/kver .

Проверки VINTF

Для Android 11 или ниже часть выпуска Android версии KMI указывается вручную в манифесте устройства производителями устройств. Подробности см. в разделе Правила соответствия ядра VINTF .

В Android S часть версии KMI, относящуюся к выпуску Android, можно извлечь из ядра и внедрить в манифест устройства во время сборки.

Поскольку требования к конфигурации ядра обычно не меняются, нет необходимости кодировать k в матрице совместимости. Однако в маловероятном случае, когда требования к конфигурации ядра необходимо изменить, убедитесь, что выполнены следующие условия:

  • Соответствующее требование из матрицы совместимости удалено.
  • Добавлены дополнительные тесты VTS для проверки новых требований, обусловленных генерацией KMI.

Версия загрузочного образа в метаданных OTA

Даже если загрузочный образ обновляется через OTA-обновление, он должен быть упакован в формат полезной нагрузки OTA, payload.bin . Полезная нагрузка OTA кодирует поле version для каждого раздела. Когда update_engine обрабатывает полезную нагрузку OTA, он сравнивает это поле, чтобы убедиться, что раздел не понижен.

Во избежание путаницы поле version загрузочного раздела в метаданных OTA называется boot image version .

Поскольку ramdisk всегда создается с нуля, использование временной метки ramdisk достаточно для описания всего образа загрузки. Нет необходимости кодировать выпуск ядра в версии образа загрузки, если только вы не собираетесь в будущем сшивать старый образ загрузки с новым двоичным файлом ядра.

Перед обновлением OTA клиент OTA проверяет версию загрузочного образа так же, как и любой другой раздел.