Схема управления версиями 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 или основные.

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

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

При сравнении поля 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. Для примера в выпуске Kernel версия 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 или более ранней версии версия 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 .

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

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