Wspólne jądra Androida

Wspólne jądra AOSP (znane też jako wspólne jądra Androida lub ACK) są oparte na jądrach z kernel.org i zawierają poprawki interesujące dla społeczności Androida, które nie zostały jeszcze scalone z główną wersją jądra ani z jądrami z długoterminowym wsparciem (LTS). Te poprawki mogą obejmować:

  • przenoszenie wstecz i wybieranie funkcji z wersji nadrzędnej, które są potrzebne do działania funkcji Androida;
  • funkcje gotowe do użycia na urządzeniach z Androidem, ale nadal rozwijane w wersji nadrzędnej;
  • funkcje dostawcy lub producenta OEM, które są przydatne dla innych partnerów w ekosystemie.

android-mainline to główna gałąź rozwoju funkcji Androida. Główna wersja jądra Linux 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 niedawno ogłoszonego jądra LTS i dodanie poprawek specyficznych dla Androida. W 2019 r. proces ten został zmieniony i nowe wspólne jądro Androida jest tworzone na podstawie gałęzi android-mainline. Ten nowy model pozwala uniknąć znacznego wysiłku związanego z przenoszeniem i testowaniem poprawek Androida, ponieważ ten sam efekt jest osiągany stopniowo. Gałąź android-mainline jest poddawana ciągłym testom, dzięki czemu ten model obejmuje wysokiej jakości jądro od dnia jego opublikowania.

Gdy w wersji nadrzędnej zostanie ogłoszone nowe LTS, odpowiednie wspólne jądro zostanie utworzone na podstawie gałęzi android-mainline. Dzięki temu partnerzy mogą rozpocząć projekt przed ogłoszeniem wersji LTS, scalając gałąź android-mainline. Po utworzeniu nowej gałęzi wspólnego jądra partnerzy mogą bezproblemowo zmienić źródło scalania na nową gałąź.

Inne gałęzie wspólnego jądra są regularnie scalane z powiązanym jądrem LTS. Scalanie jest zwykle przeprowadzane natychmiast po opublikowaniu wersji LTS. Na przykład po opublikowaniu jądra Linux 6.1.75 zostało ono scalone ze wspólnym jądrem 6.1 (android14-6.1). Zachęcamy partnerów do aktualizowania jąder, aby były one zgodne z LTS i poprawkami błędów specyficznych dla Androida.

Gałąź jądra ACK KMI

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

Hierarchia wspólnego jądra

Gałąź z android-mainline

Najwyższy poziom hierarchii wspólnego jądra jest przedstawiony 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. na podstawie gałęzi android-mainline utworzono nowe wspólne jądro Androida android14-6.1. W 2023 r., gdy ogłoszono kolejne LTS, na podstawie gałęzi android-mainline utworzono gałąź android15-6.6.

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.15 i android14-5.15, które są jądrami funkcji dla odpowiednich wersji platformy. Tak było też w przypadku wersji 5.10 – gałąź android12-5.10 została utworzona po ogłoszeniu LTS, a gałąź android13-5.10 została utworzona na podstawie gałęzi android12-5.10 na wiosnę 2021 r., gdy jądro osiągnęło etap pełnej funkcjonalności, aby umożliwić opracowywanie funkcji dla Androida 13. Od Androida 15 (2024 r.) na każdą wersję jądra przypada tylko 1 nowe jądro GKI (nie ma jądra android15-6.1).

Cykl życia gałęzi ACK KMI

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

6.6 ACK KMI branch lifecycle

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

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

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

Faza rozwoju

Po utworzeniu gałąź ACK KMI przechodzi w fazę rozwoju (oznaczoną na rysunku 2 jako dev) i jest otwarta na dodawanie funkcji do następnej wersji platformy Androida. Na rysunku 2 gałąź android15-6.6 została utworzona, gdy wersja 6.6 została ogłoszona jako nowe jądro LTS w wersji nadrzędnej.

Faza stabilizacji

Gdy gałąź ACK KMI zostanie uznana za w pełni funkcjonalną, przechodzi w fazę stabilizacji (oznaczoną na rysunku 2 jako stable). Funkcje partnerów i poprawki błędów są nadal akceptowane, ale włączone jest śledzenie KMI, aby wykrywać wszelkie zmiany wpływające na interfejs. W tej fazie akceptowane są zmiany powodujące niezgodność z KMI, a definicja KMI jest aktualizowana w ustalonych odstępach czasu (zwykle co 2 tygodnie). Szczegółowe informacje o monitorowaniu KMI znajdziesz w artykule Omówienie GKI.

Faza zamrożenia KMI

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 są akceptowane żadne zmiany powodujące niezgodność z KMI, chyba że zostanie wykryty poważny problem z bezpieczeństwem, którego nie można rozwiązać bez wpływu na stabilne KMI. Aby uniknąć niezgodności z KMI, niektóre poprawki scalone z LTS mogą zostać zmodyfikowane lub usunięte, jeśli poprawka nie jest wymagana w przypadku urządzeń z Androidem.

Gdy gałąź ACK KMI jest zamrożona, poprawki błędów i funkcje partnerów mogą być akceptowane, o ile nie powodują niezgodności z istniejącym wspólnym jądrem KMI. KMI można rozszerzyć o nowe eksportowane symbole, o ile nie wpływa to na interfejsy tworzące bieżące KMI. Gdy do KMI zostaną dodane nowe interfejsy, natychmiast stają się one stabilne i nie mogą zostać zmienione przez przyszłe zmiany.

Na przykład zmiana, która dodaje pole do struktury używanej przez wspólne jądro interfejsu KMI, 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 zachowywana jest zgodność wsteczna z przestrzenią użytkownika, dzięki czemu jądro można bezpiecznie używać w wersji platformy Androida, z którą urządzenie zostało wprowadzone na rynek. Ciągłe testowanie z poprzednimi wersjami zapewnia zgodność. Dlatego na rysunku 2 jądro android15-6.6 może być używane na urządzeniach z Androidem 15 i nowszym. Ponieważ wersja platformy Androida jest też zgodna z poprzednimi wersjami, jądro android14-6.1 może być używane na urządzeniach z Androidem 15 zarówno do uruchamiania, jak i do aktualizacji.

Numer generacji KMI

Jeśli podczas fazy stabilizacji nastąpi scalenie LTS lub po tej fazie wystąpi problem z bezpieczeństwem lub inne zdarzenie, które wymaga zaakceptowania poprawki zmieniającej KMI, numer generacji KMI zapisany w build.config.common zostanie zwiększony. Bieżącą 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, dlatego moduły muszą zostać ponownie skompilowane i zaktualizowane synchronicznie z jądrem. Po zamrożeniu KMI zmiany generacji KMI powinny być 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 Androida, które obsługiwały daną wersję jądra. Ponadto wersje platformy Androida są zgodne wstecznie z jądrami GKI z poprzednich wersji. Dlatego możesz bezpiecznie używać jądra android14-6.1 opracowanego dla Androida 14 (2023 r.) na urządzeniach z Androidem 15 (2024 r.). Zgodność jest weryfikowana przez ciągłe testowanie VTS i CTS jąder GKI we wszystkich obsługiwanych wersjach.

KMI jest stabilne, 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 jądra android14-6.1 nie można zastąpić jądrem android15-6.6 bez ponownego skompilowania wszystkich modułów.

Jądra GKI są obsługiwane tylko w przypadku ich początkowych i kolejnych wersji. Nie są obsługiwane w przypadku starszych wersji. Dlatego jądro android15-6.6 nie jest obsługiwane na urządzeniach z Androidem 14 (2023 r.).

Tabela zgodności

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

Wersja platformy Androida Obsługiwane jądra
Android 17 (2026 r.) 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 r.) android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 15 (2024 r.) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 14 (2023 r.) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022 r.) android13-5.15
android13-5.10
android12-5.10
Android 12 (2021 r.) android12-5.10

Okresy wsparcia i poprawki zabezpieczeń

ACK otrzymują scalenia LTS z wersji nadrzędnej i poprawki błędów w kodzie specyficznym dla Androida. Te poprawki obejmują wszystkie poprawki zabezpieczeń jądra wymienione w comiesięcznych Android biuletynach bezpieczeństwa, które są istotne dla ACK.

ACK mogą być obsługiwane dłużej niż odpowiadające im stabilne jądro w wersji nadrzędnej na kernel.org. W takim przypadku Google zapewnia rozszerzone wsparcie do daty zakończenia obsługi podanej w tej sekcji. Gdy jądra osiągną datę zakończenia obsługi, nie są już obsługiwane przez Google, a urządzenia z nimi są uważane za podatne na ataki.

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

Ta tabela zawiera okresy wsparcia dla obsługiwanych ACK:

Gałąź ACK Data premiery
Okres
wsparcia
(w latach)
Data zakończenia obsługi
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 oraz w testach przeprowadzanych przez dostawców.

Testowanie KernelCI

Testy kompilacji i uruchamiania KernelCI są inicjowane za każdym razem, gdy do gałęzi wspólnego jądra zostanie dodana nowa poprawka. Testowanych i uruchamianych jest kilkaset konfiguracji kompilacji na różnych płytach. Najnowsze wyniki dotyczące jąder Androida znajdziesz na stronie KernelCL.

Testowanie przed i po przesłaniu w Androidzie

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) zmiany kodu w Gerrit wspólnego jądra Androida.

Testowanie po przesłaniu w Androidzie jest przeprowadzane w przypadku nowych opublikowanych kompilacji w gałęziach wspólnego jądra Androida, gdy do gałęzi wspólnego jądra Androida w ci.android.com zostaną dodane nowe poprawki. Jeśli wpiszesz aosp_kernel jako część nazwy gałęzi w ci.android.com, zobaczysz listę gałęzi jądra z dostępnymi wynikami. Na przykład wyniki dotyczące android-mainline znajdziesz na panelu integracji ciągłej kompilacji Androida (Android CI). Kliknij konkretną kompilację, aby sprawdzić stan testu na karcie Test Results (Wyniki testu).

Testy zdefiniowane przez test-mapping z grupą testów 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 test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING włącza vts_kernel_proc_file_api_test jako test przed przesłaniem podczas sprawdzania kodu wspólnego jądra Androida.

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

Testowanie typu 0-day

Testowanie typu 0-day polega na testowaniu poprawek w każdej gałęzi wspólnego jądra Androida po dodaniu nowych poprawek. Uruchamiane są różne testy uruchamiania, funkcjonalności i wydajności. Dołącz do publicznej grupy cros-kernel-buildreports.

Zestaw testów

Wspólne jądro Androida Wersje platformy Androida Zestawy testów
Główny 17 16 15 14 13 KernelCI Przed przesłaniem Po przesłaniu 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 funkcje powinny być rozwijane w głównej wersji jądra Linux, a nie we wspólnych jądrach Androida. Zachęcamy do rozwijania wersji nadrzędnej. Po zaakceptowaniu zmian można je w razie potrzeby przenieść wstecz do konkretnej gałęzi ACK. Zespół ds. jądra Androida chętnie wspiera działania związane z przenoszeniem zmian do wersji nadrzędnej, aby ulepszać ekosystem Androida.

Przesyłaj poprawki do Gerrit i przestrzegaj tych wytycznych dotyczących współtworzenia.