Общие ядра 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_RELEASE-KERNEL_VERSION.
Например, ядро GKI 6.1 для Android 14 называется android14-6.1. В Android 15 появился GKI-модуль ядра android15-6.6.
Иерархия общего ядра
Ветвь из android-mainline
На рисунке 1 показан верхний уровень иерархии общего ядра.
Рисунок 1. Создание общих ядер на основе ядра android-mainline
Обратите внимание, что в 2022 году от android-mainline было создано ответвление – новое общее ядро Android android14-6.1. В 2023 году, когда была объявлена следующая версия с долгосрочной поддержкой, ветвь 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 (2024 г.) для каждой версии ядра будет только одно новое ядро GKI (ядра android15-6.1 не будет).
Жизненный цикл ветви ACK KMI
На рисунке 2 показан жизненный цикл ветви ACK KMI.
Рисунок 2. Жизненный цикл ветки ACK KMI 6.6
Чтобы прояснить процесс разработки и жизненный цикл ветвей, на рисунке 2 показаны ветви ACK KMI для версии 6.6.
Каждая ветвь ACK KMI проходит три этапа, обозначенные на рисунке 2 разными цветами. Как показано на рисунке, LTS регулярно объединяется независимо от этапа.
Этап разработки
После создания ветвь ACK KMI переходит на этап разработки (на рисунке 2 он обозначен как dev). В этот период в нее можно добавлять функции для следующего выпуска платформы Android. На рисунке 2 android15-6.6 был создан, когда версия 6.6 была объявлена новым ядром LTS.
Этап стабилизации
Когда ветка ACK KMI будет объявлена полностью готовой, она перейдет в фазу стабилизации (на рисунке 2 она обозначена как stable). Мы по-прежнему принимаем партнерские функции и исправления ошибок, но отслеживание KMI включено, чтобы обнаруживать любые изменения, влияющие на интерфейс. На этом этапе допускаются критические изменения KMI, а определение KMI обновляется с заданной периодичностью (обычно каждые две недели). Подробнее о мониторинге KMI…
Замороженная фаза KMI
Перед тем как новая версия платформы будет добавлена в AOSP, ветка KMI ACK замораживается и остается в таком состоянии до конца своего существования. Это означает, что критические изменения, нарушающие KMI, не принимаются, если не выявлена серьезная проблема безопасности, которую нельзя устранить, не затронув стабильный KMI. Чтобы избежать нарушений KMI, некоторые исправления, объединенные из LTS, могут быть изменены или удалены, если они не требуются для устройств Android.
Когда ветвь KMI ACK заморожена, исправления ошибок и функции партнеров могут приниматься, если существующее общее ядро 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 и более поздних версий. Поскольку платформа Android также совместима с предыдущими версиями, ядро android14-6.1 можно использовать на устройствах с Android 15 как при запуске, так и при обновлении.
Номер поколения KMI
Если во время фазы стабилизации происходит слияние 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 (2024). Совместимость проверяется путем непрерывного тестирования VTS и CTS ядер GKI со всеми поддерживаемыми выпусками.
KMI стабилен, поэтому ядро можно обновить без пересборки модулей ядра в образе поставщика.
Совместимость KMI не поддерживается между разными ядрами GKI. Так, ядро android14-6.1 нельзя заменить ядром android15-6.6 без пересборки всех модулей.
Ядра GKI поддерживаются только в исходной и последующих версиях.
Они не поддерживаются в более ранних версиях. Поэтому ядро android15-6.6 не поддерживается на устройствах с Android 14 (2023).
Матрица совместимости
В таблице ниже указаны версии ядра, которые поддерживаются и тестируются в каждом выпуске платформы Android.
| Выпуск платформы Android | Поддерживаемые ядра |
|---|---|
| Android 17 (2026) |
android17-6.18
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10 (не поддерживается в Android 17 QPR1 и более поздних версиях)
android12-5.10 (не поддерживается в Android 17 QPR1 и более поздних версиях)
|
| Android 16 (2025 г.) |
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
| Android 15 (2024) |
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
| Android 14 (2023) |
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
| Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.10
|
| Android 12 (2021) |
android12-5.10
|
Срок поддержки и исправления системы безопасности
ACK получают исправления ошибок и слияния LTS из вышестоящих источников для кода, относящегося к Android. Эти исправления включают все исправления системы безопасности ядра, упомянутые в ежемесячных бюллетенях по безопасности Android, которые относятся к ACK.
Поддержка ACK может быть дольше, чем поддержка соответствующего стабильного ядра на сайте kernel.org. В этом случае Google предоставляет расширенную поддержку до даты окончания срока эксплуатации, указанной в этом разделе. Когда срок поддержки ядра заканчивается, Google перестает его поддерживать, и устройства, на которых оно установлено, считаются уязвимыми.
Начиная с версии 6.6, стабильные версии ядра поддерживаются в течение четырех лет.
В таблице ниже указаны сроки действия поддерживаемых подтверждений.
| ветвь подтверждения; | Дата запуска |
Support lifetime (years) |
EOL : завершение эксплуатации |
|---|---|---|---|
| android12-5.10 | 2020-12-13 | 6 | 2027-07-01 |
| android13-5.10 | 2020-12-13 | 6 | 2027-07-01 |
| android13-5.15 | 2021-10-31 | 6 | 2028-07-01 |
| android14-5.15 | 2021-10-31 | 6 | 2028-07-01 |
| android14-6.1 | 2022-12-11 | 6 | 2029-07-01 |
| android15-6.6 | 2023-10-29 | 4 | 2028-07-01 |
| android16-6.12 | 2024-11-17 | 4 | 2029-07-01 |
| android17-6.18 | 2025-11-30 | 4 | 2030-07-01 |
Тестирование общего ядра
Общие ядра тестируются в нескольких системах непрерывной интеграции, а также в рамках тестирования поставщиками.
Тестирование KernelCI
Тесты сборки и загрузки KernelCI запускаются каждый раз, когда в общую ветвь ядра добавляется новое исправление. Несколько сотен конфигураций сборки тестируются и загружаются на различных платах. Последние результаты для ядер Android можно найти на сайте KernelCL.
Тестирование Android до и после отправки
Предварительные тесты помогают предотвратить появление ошибок в общих ядрах Android. Сводка результатов тестирования находится на вкладке Checks (Проверки) в разделе изменений кода в Gerrit для общего ядра Android.
Тестирование после отправки в Android выполняется для новых опубликованных сборок в ветвях общего ядра Android, когда новые исправления добавляются в ветвь общего ядра Android на сайте ci.android.com. Если ввести aosp_kernel в качестве частичного названия ветви на сайте ci.android.com, вы увидите список ветвей ядра с доступными результатами. Например, результаты для android-mainline можно найти на панели управления непрерывной интеграции Android (Android CI). Нажмите на нужную сборку и посмотрите статус тестирования на вкладке Test Results.
Тесты, определенные в файле test-mapping с группой тестов kernel-presubmit в дереве исходного кода платформы Android, выполняются в качестве предварительной отправки для ветвей ядра 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-day – тестирование всех ветвей общего ядра Android по мере добавления новых исправлений. Выполняются различные тесты загрузки, функциональности и производительности. Присоединитесь к общедоступной группе cros-kernel-buildreports.
Матрица тестирования
| Общее ядро Android | Выпуски платформы Android | Наборы тестов | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| YouTube | 17 | 16 | 15 | 14 | 13 | KernelCI | Перед отправкой | После отправки | уязвимость нулевого дня | ||
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android17-6.18
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android16-6.12
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android15-6.6
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android14-6.1
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
Как внести вклад в разработку общих ядер Android
Как правило, разработка функций должна выполняться на основной ветке Linux, а не на общих ядрах Android. Мы настоятельно рекомендуем сначала вносить изменения в основную ветку, а затем, если необходимо, переносить их в ветку ACK. Команда разработчиков ядра Android рада поддерживать усилия по переносу кода в основную ветку, чтобы улучшить экосистему Android.
Отправляйте исправления в Gerrit и следуйте правилам участия в проекте.