Общие ядра Android

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

  • Бэкпорты и подборки первоначальных функций, необходимых для функций Android.
  • Функции, готовые для устройств Android, но все еще находящиеся в стадии разработки (например, оптимизация размещения задач Energy Aware Scheduler).
  • Функции поставщика/ОЕМ, полезные для других партнеров по экосистеме (например, sdcardfs).

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 4.19.64 был опубликован, он был объединен с общими ядрами 4.19 (например, android-4.19-q ). Партнерам настоятельно рекомендуется регулярно объединять общие ядра с ядрами своих продуктов, чтобы оставаться в курсе последних исправлений ошибок LTS и Android.

Ветвь ядра ACK KMI

Ядра GKI имеют стабильный интерфейс модуля ядра. KMI однозначно идентифицируется версией ядра и выпуском платформы Android, поэтому ветки называются <androidRelease>-<kernel version> . Например, ядро ​​5.4 GKI для Android 11 называется android11-5.4. Для Android 12 есть два дополнительных ядра GKI: android12-5.4 и android12-5.10 .

Устаревшие ветки десертного ядра

Устаревшие десертные ядра были созданы, чтобы гарантировать, что разработка новых функций не помешает слиянию с общим ядром Android. Ветки были созданы до соответствующего релиза десерта и получают регулярные слияния от LTS, но не новые функции. Например, android-4.9-q получает слияния из ветки LTS 4.9.y.

Если версия ядра не была ядром для запуска, пустое ядро ​​не создавалось, но ядро, связанное с самым последним выпуском платформы, допустимо для обновления до будущих выпусков платформы Android. Например, android-4.9-q был последней из десертных ветвей android-4.9* , поэтому он поддерживается и тестируется с исходной версией платформы Android 10. Он также поддерживается и тестируется с версиями платформы, которые поддерживают обновления устройств под управлением 4.9. ядра: Android 11 и Android 12.

Поскольку схема именования десертов для выпусков платформы Android была исключена с Android 10, последние выпуски десертов, которые должны были называться android-4.14-r и android-4.19-r , вместо этого назывались android-4.14-stable и android-4.19-stable .

Десертные ядра заменены ядрами GKI, начиная с Android 11, поэтому полный список поддерживаемых десертных ядер приведен в этой таблице.

Выпуск платформы Android ядро Поддерживается до
Андроид 10 android-4.9-q
android-4.14-q
android-4.19-q
январь 2023 г.
Андроид 11 android-4.14-stable
android-4.19-stable
январь 2024 г.

Ветки ядра устаревшего выпуска

Ядра выпусков поддерживаются для предоставления резервных копий исправлений, указанных в ежемесячном бюллетене по безопасности Android . Они создавались для каждого ядра запуска при выходе новой версии платформы Android. Они устаревают, когда соответствующий выпуск ядра или платформы устаревает, как описано в разделе Срок службы поддержки и исправления безопасности .

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

В выпусках платформы Android 11 и более поздних версиях партнеры должны объединяться из десертных ядер или ядер GKI, чтобы применять исправления, указанные в бюллетене по безопасности Android. Ядро выпуска не будет создано для выпусков платформы Android 11 или более поздних версий.

Поэтому в этой таблице показан полный список из 14 выпусков ядер, и ни одно из них не будет добавлено.

Выпуск платформы Android ядро Поддерживается до
Андроид 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
январь 2023 г.

Особенности и запуск ядер

Каждый выпуск платформы Android поддерживает запуск новых устройств на основе любой из трех версий ядра Linux. Как показано в таблице ниже, ядрами запуска для Android 11 являются android-4.14-stable , android-4.19-stable и android11-5.4 .

Поскольку обновления ядра обычно не требуются при обновлении версии платформы, ядра, в которых отсутствуют последние функции для версии платформы, по-прежнему могут использоваться для запуска устройств. Поэтому ядра, разработанные для Android 10, такие как android-4.19-q , можно использовать на устройствах даже после обновления версии платформы до Android 11. Начиная с Android 12 ядер функций будет меньше, чем ядер запуска, чтобы ограничить количество стабильные KMI, которые должны поддерживаться.

Выпуск платформы Android Запустить ядра Ядра функций
Андроид 10 (2019) android-4.9-q
android-4.14-q
android-4.19-q

android-4.9-q
android-4.14-q
android-4.19-q
Андроид 11 (2020) android-4.14-stable
android-4.19-stable
android11-5.4
android-4.14-stable
android-4.19-stable
android11-5.4
Андроид 12 (2021) android-4.19-stable
android11-5.4 2
android12-5.4
android12-5.10
android12-5.4
android12-5.10
Android T (экспериментальный AOSP) (2022 г.) 1 android12-5.4 2
android12-5.10 2
android13-5.10
android13-5.15
android13-5.10
android13-5.15

1 Android T (экспериментальный AOSP) (2022 г.) не является обязательным и показан только для демонстрации того, как новая модель ветвления будет развиваться в будущем с двумя функциональными и тремя запускаемыми ядрами.

2 Номер выпуска ядра Android должен быть больше или равен целевой версии FCM . Подробнее см. в разделе Объект интерфейса поставщика — сопоставление ветвей ядра .

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

Ветвление от android-mainline

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

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

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

Обратите внимание, что новое общее ядро ​​Android android12-5.10 было ответвлением от android-mainline в 2020 году. В 2021 году, когда было объявлено следующее LTS, android13-5.15 было ответвлением от android-mainline .

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

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

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

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

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

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

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

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

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

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

Когда ветвь ACK KMI объявляется функционально завершенной, она переходит в фазу стабилизации , отмеченную как stab на рис. 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 ядро android12-5.10 можно использовать для устройств Android 12 и устройств Android T (экспериментальная версия AOSP). Поскольку версия платформы Android также совместима с предыдущими версиями, ядро android12-5.4 можно использовать для устройств Android T (экспериментальная версия AOSP) либо для запуска, либо для обновления.

При переходе на замороженную фазу ветка помечается git-тегом со строкой версии KMI, содержащей номер поколения KMI. Например, когда android11-5.4 был заморожен, он был помечен строкой версии KMI 5.4-android11-0 где конечный 0 — это номер поколения KMI. Если есть проблема с безопасностью или другое событие, требующее принятия патча, изменяющего KMI, номер поколения KMI увеличивается, а ветвь повторно помечается. Например, если такое изменение будет принято в android11-5.4 , ветка будет помечена новой версией KMI, 5.4-android11-1 . Текущее поколение KMI можно найти с помощью команды uname :

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

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

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

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

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

Ядра GKI

Ядра GKI поддерживают обратную совместимость со всеми выпусками платформы Android, поддерживающими версию ядра. Кроме того, выпуски платформы Android обратно совместимы с ядрами GKI из предыдущих выпусков. Так что вы можете смело использовать ядро android12-5.4 , разработанное для Android 12, на устройствах под управлением Android T (экспериментальная версия AOSP). Совместимость проверяется путем непрерывного тестирования VTS и CTS ядер GKI со всеми поддерживаемыми выпусками.

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

Совместимость KMI между разными ядрами GKI не поддерживается. Так, например, android12-5.10 нельзя заменить на ядро android13-5.10 без пересборки всех модулей.

Ядра GKI поддерживаются только для их начального и последующих выпусков. Они не поддерживаются для более старых выпусков. Таким образом, ядро android13-5.10 не поддерживается на устройствах Android 12.

Устаревшие ядра

Устаревшие десертные ядра ( *-q и *-stable ) не имеют обратной совместимости между выпусками платформы Android, но ядра из двух предыдущих выпусков платформы Android поддерживаются для обновления. Таким образом, устройство, запущенное с Android 10 с использованием ядра на базе android-4.19-q , может либо продолжать использовать ядро android-4.19-q при обновлении до Android 2020, либо обновить код производителя для поддержки android-4.19-stable .

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

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

Выпуск платформы Android Поддерживаемые ядра для обновления Поддерживаемые ядра для запуска
Андроид 10 (2019) android-3.18 (конечный срок службы)
android-4.4-o (EOL)
android-4.9-o
android-4.4-p
(EOL)
android-4.9-p (EOL)
android-4.14-p (EOL)
android-4.9-q
android-4.14-q
android-4.19-q
Андроид 11 (2020) android-4.4-o (EOL)
android-4.4-p (EOL)
android-4.9-o (EOL)
android-4.9-p (EOL)
андроид-4.9-q
android-4.14-p (EOL)
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
Андроид 12 (2021) android-4.9-o (EOL)
android-4.9-p (EOL)
андроид-4.9-q
android-4.14-p (EOL)
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10

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

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

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

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

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

Функциональное тестирование ядра Linaro

Тесты Linaro Kernel Functional Testing (LKFT) инициируют различные наборы тестов, включая kselftest, LTP, VTS и CTS, на наборе физических устройств arm32 и arm64. Последние результаты тестов можно посмотреть здесь .

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

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

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

Предварительные тесты используются для предотвращения появления сбоев в общих ядрах. В настоящее время результаты не являются общедоступными.

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

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

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

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

Общее ядро ​​Android Выпуски платформы Android Наборы тестов
Мастер 12 11 10 9 (Пирог) ЛКФТ ЯдроCI Предварительно отправить Опубликовать Отправить 0-день
android-mainline
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q
android-4.14-q
android-4.9-q

Участие в общих ядрах Android

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

Отправьте исправления Герриту и соблюдайте эти правила .