Версии GKI

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

Резюме терминов

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

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

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

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

Подробнее см. в Makefiles ядра Linux (ищите «KERNELRELEASE»).

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

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

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

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

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

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

Номер выпуска Android не должен уменьшаться никакими обновлениями, в том числе OTA или mainline.

Генерация КМИ к 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 предоставляет интерфейс C++ для разбора версии ядра или строки версии KMI. Список API, предоставляемых libkver, см. в packages/modules/Gki/libkver/include/kver .

ВИНТФ проверяет

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

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

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

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

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

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

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

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

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