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.
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.
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
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
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.