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 potrzebnych do działania funkcji Androida
  • Funkcje gotowe na urządzenia z Androidem, ale nadal rozwijane w ramach projektu upstream
  • 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ą do publikacji. 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, ten model zawiera wysokiej jakości jądro od dnia publikacji.

Gdy w przypadku LTS zostanie zadeklarowana nowa wersja nadrzędna, odpowiednie jądro wspólne zostanie odgałęzione z android-mainline. Umożliwia to partnerom rozpoczęcie projektu przed zadeklarowaniem wersji LTS przez scalenie z android-mainline. Po utworzeniu nowej wspólnej gałęzi 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. Scalanie jest zwykle 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 mieć dostęp do 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 z 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 odłączona od gałęzi 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. Gałąź android12-5.10 została utworzona, gdy ogłoszono wersję LTS, a gałąź android13-5.10 została od niej odgałęziona wiosną 2021 r., gdy zakończono dodawanie funkcji do jądra, aby umożliwić opracowywanie funkcji dla Androida 13.android12-5.10 Od Androida 15 (2024) dla każdej wersji jądra będzie dostępne tylko jedno nowe jądro GKI (nie będzie jądra android15-6.1).

Cykl życia gałęzi ACK KMI

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

6.6 Cykl życia gałęzi KMI ACK

Rysunek 2. 6.6 Cykl życia gałęzi KMI ACK

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 scalana niezależnie od fazy.

Faza rozwoju

Po utworzeniu gałąź ACK KMI wchodzi w fazę rozwoju (oznaczoną jako dev na rysunku 2) 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 w pełni funkcjonalną, przechodzi w fazę stabilizacji (na rysunku 2 oznaczono ją 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ść z KMI, a definicja KMI jest aktualizowana w zdefiniowanym tempie (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. Interfejs 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 nowe interfejsy zostaną dodane do KMI, natychmiast 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 użytkowania 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.1ją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 albo 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 wersji platformy to generacja KMI (w tym przypadku 6).

Jeśli generacja KMI się zmieni, jądro nie będzie zgodne z modułami dostawcy, które są zgodne z poprzednią generacją KMI. W związku z tym 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 Androida 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 jądro można aktualizować 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. Dlatego jądro android15-6.6 nie jest obsługiwane na urządzeniach z Androidem 14 (2023).

Macierz 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 17 (2026) android17-6.18
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10 (nieobsługiwane w Androidzie 17 QPR1 ani nowszym)
android12-5.10 (nieobsługiwane w Androidzie 17 QPR1 ani nowszym)
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

Okresy pomocy i poprawki zabezpieczeń

ACK otrzymują scalenia LTS z upstreamu i poprawki błędów w kodzie specyficznym dla Androida. Obejmują one wszystkie poprawki zabezpieczeń jądra wymienione w comiesięcznych biuletynach o zabezpieczeniach 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 rozszerzoną pomoc 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 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
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

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.

Testowanie KernelCI

Testy kompilacji i uruchamiania KernelCI są inicjowane za każdym razem, gdy nowy patch zostanie zatwierdzony w wspólnym rozgałęzieniu 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 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ęść nazwy gałęzi na stronie ci.android.com, zobaczysz listę gałęzi jądra z dostępnymi wynikami. Na przykład wyniki dla android-mainline znajdziesz w panelu ciągłej integracji kompilacji 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-day polega na testowaniu poszczególnych poprawek na wszystkich wspólnych gałęziach jądra Androida po wprowadzeniu nowych poprawek. Przeprowadzane są różne testy rozruchu, 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 17 16 15 14 13 KernelCI Przed przesłaniem Po przesłaniu luka typu 0-day,
android-mainline
android17-6.18
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10

Współtworzenie wspólnych jąder Androida

Zasadniczo nowe funkcje powinny być rozwijane w głównej linii Linuksa, a nie w wersjach jądra wspólnych dla Androida. Zdecydowanie zalecamy tworzenie kodu w górę strumienia. Po zaakceptowaniu tam 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 przestrzegaj tych wytycznych dotyczących współtworzenia.