Wspólne jądra Androida

Wspólne jądra AOSP (znane też jako wspólne jądra Androida lub ACK) są pochodnymi jąder kernel.org i zawierają poprawki, które są istotne dla społeczności Androida, ale nie zostały jeszcze scalone z główną linią rozwoju ani z jądrami LTS (Long Term Supported). Mogą one obejmować:

  • Przenoszenie wstecz i wybieranie funkcji z wersji nadrzędnej, które są potrzebne do działania funkcji Androida
  • Funkcje gotowe na urządzenia z Androidem, ale nadal w fazie rozwoju
  • Funkcje dostawcy lub producenta OEM przydatne dla innych partnerów ekosystemu

android-mainline to główna gałąź rozwoju funkcji Androida. Główna gałąź Linuxa jest scalana z android-mainline za każdym razem, gdy Linus Torvalds opublikuje wersję lub wersję kandydującą. Przed 2019 r. wspólne jądra Androida były tworzone przez sklonowanie ostatnio ogłoszonego jądra LTS i dodanie poprawek specyficznych dla Androida. W 2019 roku zmieniliśmy ten proces, aby odgałęziać nowy wspólny kernel Androida od android-mainline. Ten nowy model pozwala uniknąć znacznego nakładu pracy związanego z przenoszeniem i testowaniem poprawek Androida, ponieważ ten sam efekt osiąga się stopniowo. android-mainline jest poddawany ciągłym testom, dlatego ten model zawiera wysokiej jakości jądro od dnia publikacji.

Gdy w przypadku gałęzi nadrzędnej zostanie zadeklarowana nowa wersja LTS, odpowiednie jądro wspólne zostanie odgałęzione od android-mainline. Umożliwia to partnerom rozpoczęcie projektu przed zadeklarowaniem wersji LTS przez scalenie z android-mainline. Po utworzeniu nowej gałęzi wspólnego jądra partnerzy mogą bezproblemowo zmienić źródło scalania na nową gałąź.

Inne popularne gałęzie jądra są regularnie łączone z powiązanym z nimi jądrem LTS. Zwykle są one przeprowadzane natychmiast po opublikowaniu wersji LTS. Na przykład po opublikowaniu wersji Linuksa 6.1.75 została ona scalona z wspólnym jądrem 6.1 (android14-6.1). Zachęcamy partnerów do aktualizowania jąder, aby korzystać z najnowszych poprawek błędów związanych z LTS i Androidem.

Gałąź jądra ACK KMI

Jądra GKI mają stabilny interfejs modułu jądra. Interfejs KMI jest jednoznacznie identyfikowany przez wersję jądra i wersję platformy Android, więc gałęzie mają nazwy ANDROID_RELEASE-KERNEL_VERSION. Na przykład jądro GKI w wersji 6.1 dla Androida 14 ma nazwę android14-6.1. W przypadku Androida 15 wprowadzono jądro GKI android15-6.6.

Hierarchia wspólnego jądra

Utwórz gałąź z android-mainline

Najwyższy poziom hierarchii wspólnego jądra przedstawiono na rysunku 1.

Tworzenie wspólnych jąder na podstawie jądra android-mainline

Rysunek 1. Tworzenie wspólnych jąder na podstawie jądra android-mainline

Zwróć uwagę, że w 2022 r. z android-mainline wyodrębniono nowy wspólny kernel Androida android14-6.1. W 2023 r., gdy ogłoszono kolejną wersję LTS, gałąź android15-6.6 została odgałęziona od android-mainline.

Jak pokazano na rysunku 1, każda wersja jądra może być podstawą 2 jąder GKI. Na przykład 2 jądra w wersji 5.15 to android13-5.15android14-5.15. Oba są jądrami funkcji dla odpowiednich wersji platformy. Tak było też w przypadku wersji 5.10. Wersja android12-5.10 została utworzona po ogłoszeniu LTS, a wiosną 2021 r. wersja android13-5.10 została od niej odgałęziona po osiągnięciu przez jądro etapu pełnej funkcjonalności, aby umożliwić opracowywanie funkcji dla Androida 13.android12-5.10 Od Androida 15 (2024) dla każdej wersji jądra GKI będzie dostępne tylko jedno nowe jądro (nie będzie jądra android15-6.1).

Cykl życia gałęzi KMI ACK

Cykl życia gałęzi ACK KMI jest przedstawiony na rysunku 2.

6.6 ACK KMI branch lifecycle

Rysunek 2. 6.6 ACK KMI branch lifecycle

Aby wyjaśnić proces rozwoju i cykl życia gałęzi, na rysunku 2 przedstawiono gałęzie ACK KMI dla wersji 6.6.

Każda gałąź ACK KMI przechodzi 3 fazy, które na rysunku 2 są oznaczone różnymi kolorami. Jak widać, LTS jest regularnie scalany niezależnie od fazy.

Faza rozwoju

Po utworzeniu gałąź ACK KMI wchodzi w fazę rozwoju (na rysunku 2 oznaczona jako dev) i jest otwarta na wnoszenie funkcji w kolejnej wersji platformy Android. Na rysunku 2 wersja android15-6.6 została utworzona, gdy wersja 6.6 została zadeklarowana jako nowy jądro LTS upstream.

Faza stabilizacji

Gdy gałąź ACK KMI zostanie uznana za ukończoną, przechodzi w fazę stabilizacji (na rysunku 2 oznaczona jako stabilna). Funkcje partnerów i poprawki błędów są nadal akceptowane, ale śledzenie KMI jest włączone, aby wykrywać wszelkie zmiany wpływające na interfejs. Na tym etapie akceptowane są zmiany powodujące niezgodność interfejsu KMI, a definicja interfejsu KMI jest aktualizowana zgodnie z ustalonym harmonogramem (zwykle co 2 tygodnie). Szczegółowe informacje o monitorowaniu KMI znajdziesz w omówieniu GKI.

KMI frozen phase

Zanim nowa wersja platformy zostanie przesłana do AOSP, gałąź ACK KMI jest zamrażana i pozostaje zamrożona przez cały okres jej istnienia. Oznacza to, że nie akceptujemy żadnych zmian powodujących niezgodność z KMI, chyba że zostanie wykryty poważny problem z bezpieczeństwem, którego nie można rozwiązać bez wpływu na stabilny interfejs KMI. Aby uniknąć problemów z KMI, niektóre poprawki scalone z LTS mogą zostać zmodyfikowane lub usunięte, jeśli nie są wymagane w przypadku urządzeń z Androidem.

Gdy gałąź ACK KMI jest zamrożona, można akceptować poprawki błędów i funkcje partnerów, o ile nie powodują one uszkodzenia istniejącego wspólnego jądra KMI. KMI można rozszerzać o nowe eksportowane symbole, o ile nie ma to wpływu na interfejsy wchodzące w skład obecnego KMI. Gdy do KMI dodawane są nowe interfejsy, od razu stają się stabilne i nie można ich uszkodzić przyszłymi zmianami.

Na przykład zmiana, która dodaje pole do struktury używanej przez interfejs KMI wspólnego jądra, jest niedozwolona, ponieważ zmienia definicję interfejsu:

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);

Dodanie nowej funkcji jest jednak dopuszczalne:

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

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

Przez cały okres istnienia jądra GKI zachowana jest zgodność wsteczna z przestrzenią użytkownika, dzięki czemu jądro może być bezpiecznie używane w wersji platformy Android, z którą urządzenie zostało wprowadzone na rynek. Ciągłe testowanie z poprzednimi wersjami zapewnia zgodność. Na rysunku 2 android15-6.6jądro może być używane na urządzeniach z Androidem 15 i nowszym. Wersja platformy Android jest też zgodna z poprzednimi wersjami, więc android14-6.1 jądro może być używaneandroid14-6.1 na urządzeniach z Androidem 15 zarówno podczas uruchamiania, jak i aktualizacji.

Numer generacji KMI

Jeśli w fazie stabilizacji nastąpi scalenie LTS lub po niej wystąpi problem z bezpieczeństwem bądź inne zdarzenie, które wymaga zaakceptowania poprawki zmieniającej KMI, numer generacji KMI zapisany w build.config.common zostanie zwiększony. Aktualną generację KMI można sprawdzić za pomocą polecenia uname:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

Liczba po nazwie platformy to generacja KMI (w tym przypadku 6).

Jeśli generowanie interfejsu KMI ulegnie zmianie, jądro nie będzie zgodne z modułami dostawcy, które są zgodne z poprzednią generacją interfejsu KMI, więc moduły muszą zostać przebudowane i zaktualizowane synchronicznie z jądrem. Po zamrożeniu KMI zmiany w generowaniu KMI będą bardzo rzadkie.

Zgodność między jądrami

Wymagania dotyczące zgodności między jądrami w tej samej rodzinie LTS zmieniają się wraz z nowymi jądrami GKI.

Jądra GKI

Jądra GKI zachowują zgodność wsteczną ze wszystkimi wersjami platformy Android, które obsługiwały daną wersję jądra. Poza tym platformy Android są zgodne wstecznie z jądrami GKI z poprzednich wersji. Dzięki temu możesz bezpiecznie używać android14-6.1jądra opracowanego dla Androida 14 (2023) na urządzeniach z Androidem 15 (2024). Zgodność jest weryfikowana przez ciągłe testy VTS i CTS jąder GKI ze wszystkimi obsługiwanymi wersjami.

Interfejs KMI jest stabilny, dzięki czemu można aktualizować jądro bez konieczności ponownego kompilowania modułów jądra w obrazie dostawcy.

Zgodność KMI nie jest zachowywana między różnymi jądrami GKI. Na przykład nie można zastąpić jądra android14-6.1 jądrem android15-6.6 bez ponownego skompilowania wszystkich modułów.

Jądra GKI są obsługiwane tylko w przypadku ich pierwszej i kolejnych wersji. Nie są one obsługiwane w przypadku starszych wersji. Jądro android15-6.6 nie jest więc obsługiwane na urządzeniach z Androidem 14 (2023).

Tabela zgodności

Ta tabela zawiera wersje jądra obsługiwane i testowane w każdej wersji platformy Android.

Wersja platformy Android Obsługiwane jądra
Android 16 (2025) android16-6.12
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 15 (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 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4

Okresy pomocy i poprawki zabezpieczeń

ACK otrzymują scalenia LTS z węzła nadrzędnego i poprawki błędów w kodzie specyficznym dla Androida. Obejmują one wszystkie poprawki zabezpieczeń jądra wymienione w comiesięcznych biuletynach zabezpieczeń Androida, które są istotne dla ACK.

ACK mogą być obsługiwane dłużej niż odpowiednie stabilne jądro upstream na stronie kernel.org. W takim przypadku Google zapewnia rozszerzone wsparcie do daty zakończenia cyklu życia (EOL) podanej w tej sekcji. Gdy jądra osiągną koniec okresu eksploatacji, Google przestaje je obsługiwać, a urządzenia, na których działają, są uznawane za podatne na ataki.

Od wersji jądra 6.6 okres wsparcia dla stabilnych jąder wynosi 4 lata.

Ta tabela zawiera okresy ważności obsługiwanych potwierdzeń:

Gałąź ACK Data
uruchomienia
Okres
wsparcia
(w latach)
EOL
android11-5.4 2019-11-24 6 2026-01-01
android12-5.4 2019-11-24 6 2026-01-01
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

Testowanie wspólnego jądra

Wspólne jądra są testowane w kilku systemach CI, a także w ramach testów końcowych przeprowadzanych przez dostawców.

Test funkcjonalny jądra systemu Linux

Linux Kernel Functional Test (LKFT) uruchamia różne zestawy testów, w tym kselftest, LTP, VTS i CTS, na zestawie fizycznych urządzeń arm32 i arm64. Najnowsze wyniki testów znajdziesz na stronie android-lkft.

Testowanie KernelCI

Testy kompilacji i uruchamiania KernelCI są inicjowane za każdym razem, gdy nowy patch zostanie zatwierdzony w wspólnym gałęzi jądra. Kilka setek konfiguracji kompilacji jest testowanych i uruchamianych na różnych płytach. Najnowsze wyniki dotyczące jąder Androida znajdziesz na stronie KernelCL.

Testowanie przed przesłaniem i po przesłaniu w przypadku Androida

Testy przed przesłaniem służą do zapobiegania wprowadzaniu błędów do wspólnych jąder Androida. Podsumowanie wyników testu znajdziesz na karcie „Checks” (Sprawdzanie) w zmianie kodu w gerritowym wspólnym jądrze Androida.

Testy po przesłaniu w Androidzie są przeprowadzane w przypadku nowych opublikowanych kompilacji w gałęziach wspólnego jądra Androida, gdy nowe poprawki są zatwierdzane w gałęzi wspólnego jądra Androida na stronie ci.android.com. Wpisując aosp_kernel jako częściową nazwę gałęzi na stronie ci.android.com, możesz wyświetlić listę gałęzi jądra z dostępnymi wynikami. Na przykład wyniki dla android-mainline znajdziesz w panelu ciągłej integracji Androida (Android CI). Kliknij konkretną kompilację, aby sprawdzić stan testu na karcie Test Results.

Testy zdefiniowane przez test-mapping z grupą testową kernel-presubmit w drzewie źródłowym platformy Androida są uruchamiane jako testy przed przesłaniem w przypadku gałęzi jądra Androida. Na przykład ta konfiguracja w pliku test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING umożliwia test vts_kernel_proc_file_api_test jako test przed przesłaniem w przypadku sprawdzania kodu wspólnego jądra Androida.

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

Testowanie luk typu 0-day

Testowanie 0-dniowe polega na testowaniu poszczególnych poprawek na wszystkich wspólnych gałęziach jądra Androida po wprowadzeniu nowych poprawek. Przeprowadzane są różne testy uruchamiania, funkcjonalne i wydajnościowe. Dołącz do grupy publicznej cros-kernel-buildreports.

Zestaw testów

Wspólny kernel Androida Wersje platformy Android Zestawy testów
Menu główne 16 15 14 13 12 LKFT KernelCI Przed przesłaniem Po przesłaniu luka typu 0-day,
android-mainline
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4

Współtworzenie wspólnych jąder Androida

Zasadniczo nowe funkcje powinny być rozwijane w głównej wersji Linuksa, a nie w wersjach wspólnych jądra Androida. Zdecydowanie zalecamy rozwijanie kodu w górę strumienia. Po zaakceptowaniu zmian można je w razie potrzeby przenieść do konkretnej gałęzi ACK. Zespół ds. jądra Androida z przyjemnością wspiera działania na rzecz włączenia zmian do głównej gałęzi projektu, co przyniesie korzyści ekosystemowi Androida.

Przesyłaj poprawki do Gerrit i postępuj zgodnie z tymi wytycznymi dotyczącymi współtworzenia.