На этой странице описана схема управления версиями для универсальных образов ядра (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-android12-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 | Этот термин используется в типах ветвей ядра Common . |
Версия | в | 5 | Этот термин не используется в данном документе. В libkver эта переменная называется версией . |
Уровень патча | х | 4 | Этот термин не используется в данном документе. В libkver эта переменная называется patch_level . |
релиз Android | ззз | андроид12 | Это номер выпуска Android (dessert), с которым связано ядро. При сравнении поля Номер версии 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
для каждого раздела. При обработке полезной нагрузки OTA-обновления модуль update_engine
сравнивает это поле, чтобы убедиться, что раздел не понижен до версии.
Во избежание путаницы поле version
загрузочного раздела в метаданных OTA называется boot image version
.
Поскольку RAM-диск всегда создаётся с нуля, для описания всего загрузочного образа достаточно его временной метки . Кодировать версию ядра в версии загрузочного образа не нужно, если только вы не собираетесь в будущем сшивать старый загрузочный образ с новым исполняемым файлом ядра.
Перед обновлением OTA клиент OTA проверяет версию загрузочного образа так же, как и любой другой раздел.