Управление версиями GKI

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

Краткое изложение условий

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

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

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

Имя Условное обозначение Пример Описание
wxy wxy 5.4.42

Для получения дополнительной информации см Linux Kernel Makefiles (поиск по "KERNELRELEASE").

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

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

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

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

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

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

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

KMI поколение k 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

Определение

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

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

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

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 хэшей мерзавец фиксации.

libkver

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

VINTF чеки

Для Android 11 или более ранней версии выпуск Android версии KMI указывается вручную в манифесте устройства производителями устройства. Для получения дополнительной информации см правил 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 проверяет версию загрузочного образа так же, как и любой другой раздел.