Общие ядра Android

Общие ядра AOSP (также известные как общие ядра Android или ACK ) являются последующими ядрами kernel.org и включают в себя патчи, представляющие интерес для сообщества Android, которые не были объединены с основными ядрами или ядрами с долгосрочной поддержкой (LTS). Эти патчи могут включать в себя:

  • Резервные порты и отбор исходных функций, необходимых для функций Android.
  • Функции готовы для устройств Android, но все еще находятся в стадии разработки.
  • Функции поставщиков/OEM, полезные для других партнеров экосистемы.

android-mainline — это основная ветка разработки функций Android. Основная ветка Linux объединяется с android-mainline всякий раз, когда Линус Торвальдс публикует релиз или кандидат на выпуск. До 2019 года общие ядра Android создавались путем клонирования недавно объявленного ядра LTS и добавления исправлений, специфичных для Android. Этот процесс изменился в 2019 году, чтобы создать ответвление нового общего ядра Android от android-mainline . Эта новая модель позволяет избежать значительных усилий по пересылке портов и тестированию исправлений Android, поскольку достигается тот же результат постепенно. android-mainline подвергается тщательному непрерывному тестированию, эта модель гарантирует высокое качество ядра со дня его публикации.

Когда объявляется новый LTS, соответствующее общее ядро ​​является ответвлением от android-mainline . Это позволяет партнерам начать проект до объявления версии LTS путем слияния с android-mainline . После создания новой общей ветки ядра партнеры могут легко изменить источник слияния на новую ветку.

Другие общие ветви ядра получают регулярные слияния из связанного с ними ядра LTS . Эти слияния обычно выполняются сразу после публикации LTS-версии. Например, когда был опубликован Linux 6.1.75, он был объединен с общим ядром 6.1 ( android14-6.1 ). Партнерам настоятельно рекомендуется обновлять свои ядра, чтобы оставаться в курсе исправлений ошибок LTS и Android.

Ветка ядра ACK KMI

Ядра GKI имеют стабильный интерфейс модулей ядра. KMI однозначно идентифицируется версией ядра и выпуском платформы Android, поэтому ветви называются ANDROID_RELEASEKERNEL_VERSION . Например, ядро ​​GKI 6.1 для Android 14 называется android14-6.1 . Для Android 15 (экспериментальная AOSP) было представлено ядро ​​GKI android15-6.6 .

Функционирование и запуск ядер

До Android 15 (экспериментальный AOSP) для запуска устройства можно было использовать любое из трёх последних ядер. Начиная с Android 15 (экспериментальная AOSP), для запуска устройства можно использовать две самые последние версии ядра. Ядра запуска для Android 15 (экспериментальная AOSP) — android15-6.6 и android14-6.1 .

Поскольку при обновлении версии платформы обновления ядра не требуются, ядра, в которых отсутствуют новейшие функции версии платформы, все равно можно использовать для запуска устройств. Поэтому ядра, разработанные для Android 14, например android14-6.1 , можно использовать на устройствах даже после обновления версии платформы до Android 15 (экспериментальная версия AOSP).

Релиз платформы Android Запуск ядер Функциональные ядра
Android 15 (экспериментальная AOSP) (2024 г.) android15-6.6
android14-6.1
android15-6.6
Андроид 14 (2023 г.) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
Андроид 13 (2022 г.) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
Андроид 12 (2021 г.) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
Андроид 11 (2020 г.) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

1 Могут применяться дополнительные ограничения, если соответствующий BSP был обновлен для версии платформы. В более общем плане номер версии ядра Android должен быть больше или равен целевой версии FCM . Подробности см. в разделе «Объект интерфейса поставщика — сопоставление ветвей ядра» .

Общая иерархия ядра

Ветка от android-mainline

Верхний уровень общей иерархии ядра показан на рисунке 1.

Создание общих ядер из ядра android-mainline

Рисунок 1. Создание общих ядер из ядра android-mainline.

Обратите внимание, что новое общее ядро ​​Android android14-6.1 было ответвлением от android-mainline в 2022 году. В 2023 году, когда был объявлен следующий LTS, android15-6.6 был ответвлен от android-mainline .

Как показано на рисунке 1, каждая версия ядра может быть основой для двух ядер GKI. Например, два ядра версии 5.15 — это android13-5.15 и android14-5.15 , оба из которых являются функциональными ядрами для соответствующих выпусков платформ. То же самое было и с версией 5.10; android12-5.10 был создан при объявлении LTS, а android13-5.10 развился из android12-5.10 на этапе завершения функций ядра весной 2021 года, чтобы обеспечить разработку функций для Android 13. Начиная с Android 15 (экспериментальная AOSP) (2024 г.), существует это только одно новое ядро ​​GKI для каждой версии ядра (ядро android15-6.1 отсутствует).

Жизненный цикл ветки ACK KMI

Жизненный цикл ветки ACK KMI показан ниже на рисунке 2.

6.6 Жизненный цикл ветки ACK KMI

Рисунок 2. 6.6 Жизненный цикл ветки ACK KMI

Чтобы прояснить процесс разработки и жизненный цикл ветки, на рисунке 2 показаны ветки ACK KMI для версии 6.6.

Каждая ветвь ACK KMI циклически проходит через три фазы, обозначенные на рисунке 2 разными цветами в каждой ветви. Как показано, LTS регулярно объединяется независимо от фазы.

Этап разработки

После создания ветвь ACK KMI вступает в фазу разработки (обозначена как dev на рис. 2) и открыта для добавления функций для следующего выпуска платформы Android. На рисунке 2 android15-6.6 был создан, когда версия 6.6 была объявлена ​​как новое ядро ​​LTS.

Фаза стабилизации

Когда ветвь ACK KMI объявляется завершенной, она вступает в фазу стабилизации (помечена как стабильная на рисунке 2). Партнерские функции и исправления ошибок по-прежнему принимаются, но включено отслеживание KMI для обнаружения любых изменений, влияющих на интерфейс. На этом этапе принимаются изменения, являющиеся критическими для KMI, и определение KMI обновляется с заранее заданной частотой (обычно каждые две недели). Подробную информацию о мониторинге KMI см. в обзоре GKI .

Замороженная фаза КМИ

Прежде чем новая версия платформы будет отправлена ​​в AOSP, ветвь ACK KMI замораживается и остается замороженной на весь срок существования ветки. Это означает, что никакие изменения, нарушающие KMI, не принимаются, если не выявлена ​​серьезная проблема безопасности, которую невозможно устранить, не затрагивая стабильный KMI. Чтобы избежать сбоев KMI, некоторые исправления, объединенные из LTS, могут быть изменены или удалены, если исправление не требуется для устройств Android.

Когда ветка ACK KMI заморожена, исправления ошибок и партнерские функции могут быть приняты, если существующее общее ядро ​​KMI не повреждено. KMI может быть расширен новыми экспортированными символами, если это не затронет интерфейсы, составляющие текущий KMI. Когда в KMI добавляются новые интерфейсы, они сразу становятся стабильными и не могут быть нарушены будущими изменениями.

Например, изменение, добавляющее поле в структуру, используемую общим ядром интерфейса KMI, не допускается, поскольку оно меняет определение интерфейса:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

Однако добавление новой функции — это нормально:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

В течение всего срока службы ядра GKI поддерживается обратная совместимость с пользовательским пространством, поэтому ядро ​​можно безопасно использовать для версии платформы Android, с которой было запущено устройство. Непрерывное тестирование предыдущих выпусков гарантирует сохранение совместимости. Итак, на рисунке 2 ядро android15-6.6 можно использовать для устройств Android 15 (экспериментальная AOSP) и более поздних версий. Поскольку версия платформы Android также совместима с предыдущими версиями, ядро android14-6.1 можно использовать для устройств Android 15 (экспериментальная AOSP) как для запуска, так и для обновления.

Номер поколения КМИ

Если на этапе стабилизации происходит слияние LTS или после этого возникает проблема безопасности или другое событие, требующее принятия патча, изменяющего KMI, номер поколения KMI , записанный в build.config.common , увеличивается. Текущее поколение KMI можно найти с помощью команды uname :

$ uname -r
6.6.30-android15-6-g86d10b30f51f

Число после выпуска платформы — это поколение KMI (в данном случае 6 ).

Если поколение KMI меняется, ядро ​​несовместимо с модулями поставщика, которые соответствуют предыдущему поколению KMI, поэтому модули необходимо пересобирать и обновлять синхронно с ядром. Ожидается, что после замораживания KMI смена поколений KMI будет очень редкой.

Совместимость между ядрами

Требования совместимости между ядрами одного семейства LTS меняются, начиная с новых ядер GKI.

Ядра GKI

Ядра GKI поддерживают обратную совместимость со всеми выпусками платформы Android, поддерживающими данную версию ядра. Кроме того, выпуски платформы Android обратно совместимы с ядрами GKI из предыдущих выпусков. Таким образом, вы можете смело использовать ядро android14-6.1 , разработанное для Android 14 (2023 г.), на устройствах под управлением Android 15 (экспериментальная AOSP) (2024 г.). Совместимость проверяется посредством постоянного тестирования VTS и CTS ядер GKI со всеми поддерживаемыми выпусками.

KMI стабилен, поэтому ядро ​​можно обновлять без необходимости пересборки модулей ядра в образе поставщика.

Совместимость KMI между различными ядрами GKI не поддерживается. Так, например, ядро android14-6.1 нельзя заменить на ядро android15-6.6 без пересборки всех модулей.

Ядра GKI поддерживаются только для их начальных и последующих выпусков. Они не поддерживаются в более старых версиях. Таким образом, ядро android15-6.6 не поддерживается для устройств под управлением Android 14 (2023).

Матрица совместимости

В этой таблице показаны версии ядра, поддерживаемые и протестированные для каждой версии платформы Android.

Релиз платформы Android Поддерживаемые ядра для обновления Поддерживаемые ядра для запуска
Android 15 (экспериментальная AOSP) (2024 г.) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android15-6.6
android14-6.1
Андроид 14 (2023 г.) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Андроид 13 (2022 г.) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Андроид 12 (2021 г.) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Андроид 11 (2020 г.) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

Поддержка сроков службы и исправлений безопасности

Общие ядра Android поддерживаются до тех пор, пока соответствующее ядро ​​LTS или версия платформы Android не перестанут поддерживаться. Хотя ядро ​​поддерживается, оно продолжает получать слияния LTS от исходного кода и исправления ошибок для кода, специфичного для Android. Эти исправления включают в себя все исправления безопасности ядра, указанные в ежемесячных бюллетенях по безопасности Android и относящиеся к общим ядрам Android.

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

Общее тестирование ядра

Общие ядра тестируются с несколькими системами CI в дополнение к дальнейшему тестированию, проводимому поставщиками.

Функциональный тест ядра Linux

Тесты функционального тестирования ядра Linux (LKFT) инициируют различные наборы тестов, включая kselftest, LTP, VTS и CTS, на наборе физических устройств Arm32 и Arm64. Результаты последних испытаний можно найти здесь .

Тестирование ядраCI

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

Тестирование Android перед отправкой и после отправки

Предварительные тесты используются для предотвращения возникновения сбоев в общих ядрах Android. Сводную информацию о результатах теста можно найти на вкладке «Проверки» изменения кода в общем коде ядра Android.

Тестирование Android после отправки выполняется для новых опубликованных сборок в общих ветвях ядра Android, когда новые исправления фиксируются в общей ветке ядра Android на ci.android.com . Введя aosp_kernel в качестве частичного имени ветки в ci.android.com , вы увидите список ветвей ядра с доступными результатами. Например, результаты для android-mainline можно найти здесь . Нажав на конкретную сборку, вы увидите статус теста на вкладке Test Results .

Тесты, определенные путем сопоставления тестов с группой тестов kernel-presubmit в дереве исходного кода платформы Android, будут выполняться как presubmit для ветвей ядра Android. Например, следующая конфигурация в test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING включит vts_kernel_proc_file_api_test в качестве предварительного теста при регистрации общего кода ядра Android.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

0-дневное тестирование

Тестирование нулевого дня выполняет тестирование каждого исправления для всех общих ветвей ядра Android при фиксации новых исправлений. Запускаются различные загрузочные, функциональные тесты и тесты производительности. Присоединяйтесь к общедоступной группе cros-kernel-buildreports.

Тестовая матрица

Общее ядро ​​Android Релизы платформы Android Тестовые наборы
Основной 15 14 13 12 11 10 ЛКФТ ЯдроCI Предварительная отправка Опубликовать Отправить 0-день
android-mainline
android5-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable

Внесите свой вклад в общие ядра Android

Как правило, разработку функций следует выполнять в основной версии Linux, а не в обычных ядрах Android. Настоятельно рекомендуется разработка исходной ветки, и после того, как разработка будет принята там, ее можно легко перенести в конкретную ветку ACK по мере необходимости. Команда Android Kernel рада поддержать усилия по развитию на благо экосистемы Android.

Отправьте исправления в компанию Gerrit и соблюдайте эти правила внесения изменений .