Общие ядра 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 15 для запуска устройства можно было использовать любое из трёх последних ядер. Начиная с Android 15, для запуска устройства можно использовать две самые последние версии ядра. Ядра запуска для Android 15 — android15-6.6
и android14-6.1
.
Поскольку при обновлении версии платформы обновления ядра не требуются, ядра, в которых отсутствуют новейшие функции версии платформы, все равно можно использовать для запуска устройств. Поэтому ядра, разработанные для Android 14, например android14-6.1
, можно использовать на устройствах даже после обновления версии платформы до Android 15.
Релиз платформы Android | Запуск ядер | Функциональные ядра |
---|---|---|
Андроид 15 (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 | android14-6.1 android14-5.15 |
Андроид 13 (2022 г.) | android13-5.15 android13-5.10 android12-5.10 android12-5.4 android11-5.4 | android13-5.15 android13-5.10 |
Андроид 12 (2021 г.) | android12-5.10 android12-5.4 android11-5.4 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.
Рисунок 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 (2024 г.), есть только один новый Ядро GKI для каждой версии ядра (ядро android15-6.1
отсутствует).
Жизненный цикл ветки ACK KMI
Жизненный цикл ветки ACK KMI показан ниже на рисунке 2.
Рисунок 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 и более поздних версий. Поскольку версия платформы Android также совместима с предыдущими версиями, ядро android14-6.1
можно использовать для устройств Android 15 как для запуска, так и для обновления.
Номер поколения КМИ
Если на этапе стабилизации происходит слияние 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 | Поддерживаемые ядра для обновления | Поддерживаемые ядра для запуска |
---|---|---|
Андроид 15 (2024 г.) | android15-6.6 | android15-6.6 |
Андроид 14 (2023 г.) | android14-6.1 | android14-6.1 |
Андроид 13 (2022 г.) | android13-5.15 | android13-5.15 |
Андроид 12 (2021 г.) | android12-5.10 | android-4.19-stable |
Андроид 11 (2020 г.) | android11-5.4 | android11-5.4 |
Поддержка срока службы и исправлений безопасности
ACK получают слияния LTS из восходящего потока и исправления ошибок для кода, специфичного для Android. Эти исправления включают в себя все исправления безопасности ядра, указанные в ежемесячных бюллетенях по безопасности Android и относящиеся к ACK.
ACK могут поддерживаться дольше, чем соответствующее вышестоящее стабильное ядро на kernel.org . В этом случае Google предоставляет расширенную поддержку до даты окончания срока службы (EOL), указанной в этом разделе. Когда ядра истекают, они больше не поддерживаются Google, и устройства, на которых они работают, считаются уязвимыми.
Начиная с ядра 6.6, срок поддержки стабильных ядер составляет 4 года.
В этой таблице показано время жизни поддерживаемых ACK:
ветвь подтверждения | Запуск дата | Поддерживать продолжительность жизни (годы) | окончание срока действия |
---|---|---|---|
Android-4.19-стабильный | 2018-10-22 | 6 | 01.01.2025 |
андроид11-5.4 | 2019-11-24 | 6 | 01.01.2026 |
андроид12-5.4 | 2019-11-24 | 6 | 01.01.2026 |
андроид12-5.10 | 2020-12-13 | 6 | 2027-07-01 |
андроид13-5.10 | 2020-12-13 | 6 | 2027-07-01 |
андроид13-5.15 | 2021-10-31 | 6 | 2028-07-01 |
андроид14-5.15 | 2021-10-31 | 6 | 2028-07-01 |
андроид14-6.1 | 11 декабря 2022 г. | 6 | 2029-07-01 |
андроид15-6.6 | 2023-10-29 | 4 | 2028-07-01 |
Общее тестирование ядра
Общие ядра тестируются с несколькими системами 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 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android15-6.6 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | android13-5.15 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android-4.19-stable | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Внесите свой вклад в общие ядра Android
Как правило, разработку функций следует выполнять в основной версии Linux, а не в обычных ядрах Android. Настоятельно рекомендуется разработка исходной версии, и после того, как разработка будет принята там, ее можно легко перенести в конкретную ветку ACK по мере необходимости. Команда Android Kernel рада поддержать усилия по развитию на благо экосистемы Android.
Отправьте исправления в компанию Gerrit и соблюдайте эти правила внесения изменений .