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ą interesujące dla społeczności Androida, ale nie zostały jeszcze scalone z jądrami głównymi ani z jądrami LTS. Poprawki mogą obejmować:
- Backporty i wybrane funkcje z upstreamu potrzebne do funkcji Androida
- Funkcje gotowe na urządzenia z Androidem, ale nadal w fazie rozwoju w górę.
- Funkcje dostawcy/OEM, które są przydatne dla innych partnerów ekosystemu
android-mainline
to główny gałąź rozwoju funkcji Androida. Główna gałąź systemu Linux jest scalana z android-mainline
za każdym razem, gdy Linus Torvalds opublikuje wersję lub kandydata do wydania. Przed 2019 r. wspólne jądra Androida były tworzone przez sklonowanie niedawno zadeklarowanego jądra LTS i dodanie poprawek specyficznych dla Androida. Ten proces zmienił się w 2019 roku i rozgałęzia nowe wspólne jądro Androida z android-mainline
. Ten nowy model pozwala uniknąć dużego wysiłku związanego z przekierowywaniem portów i testowaniem poprawek Androida dzięki stopniowemu uzyskiwaniu tego samego wyniku. android-mainline
jest stale testowany, dzięki czemu od dnia publikacji zapewnia wysoką jakość jądra.
Gdy nowa wersja LTS zostanie ogłoszona w źródle, odpowiednie wspólne jądro zostanie odgałęzione z android-mainline
. Dzięki temu partnerzy mogą rozpocząć projekt przed zadeklarowaniem wersji LTS przez scalenie z android-mainline
. Po utworzeniu nowego wspólnego gałęzi jądra partnerzy mogą bezproblemowo zmienić źródło scalania na nową gałąź.
Inne popularne gałęzie jądra są regularnie scalane ze swojego jednego jądra LTS.
Zwykle odbywa się to natychmiast po opublikowaniu wersji LTS. Na przykład gdy opublikowano system Linux 6.1.75, został on scalony ze wspólnym jądrem systemu 6.1 (android14-6.1
). Zdecydowanie zachęcamy partnerów do zaktualizowania jądra w celu zapewnienia aktualności dotyczących kanału LTS i poprawek błędów typowych dla Androida.
Gałęź jądra ACK KMI
Jądra GKI mają stabilny interfejs Kernel Module Interface. KMI jest jednoznacznie identyfikowane na podstawie wersji jądra i wersji platformy Androida, dlatego gałęzie nazywają się ANDROID_RELEASE
-KERNEL_VERSION
. Na przykład jądro GKI 6.1 na Androidzie 14 nosi nazwę android14-6.1
. W Androidzie 15 wprowadzono jądro GKI android15-6.6
.
Funkcje i jądra uruchamiania
Przed Androidem 15 można było użyć dowolnego z 3 najnowszych jąder. Począwszy od Androida 15 do uruchamiania urządzeń można używać 2 najnowszych wersji jądra. Rdzenie inicjujące Androida 15 to android15-6.6
i android14-6.1
.
Ponieważ podczas aktualizacji wersji platformy nie są wymagane aktualizacje jądra, jądra, w których brakuje najnowszych funkcji wersji platformy, nadal mogą być używane do uruchamiania urządzeń. Dlatego jądra przeznaczone do Androida 14 (np. android14-6.1
) mogą być używane na urządzeniach nawet po uaktualnieniu platformy do Androida 15.
Wersja na platformę Android | Uruchom jądra | Kernele cech |
---|---|---|
Android 15 (2024) |
android15-6.6
android14-6.1
|
android15-6.6
|
Android 14 (2023 r.) |
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
android14-6.1
android14-5.15
|
Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
android13-5.15
android13-5.10
|
Android 12 (2021 r.) |
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
|
android12-5.10
android12-5.4
|
Android 11 (2020) |
android11-5.4
android-4.19-stable
|
android11-5.4
android-4.19-stable
|
1 Jeśli powiązana platforma BSP została zaktualizowana w związku z wydaniem nowej wersji platformy, mogą obowiązywać dodatkowe ograniczenia. Ogólnie rzecz biorąc, numer wersji Androida jądra musi być wyższy lub równy docelowej wersji FCM. Więcej informacji znajdziesz w artykule Vendor Interface Object – match kernel branches (w języku angielskim). |
Wspólna hierarchia jądra
Gałąź android-mainline
Najwyższy poziom hierarchii wspólnego jądra pokazano na rysunku 1.
Rysunek 1. Tworzenie wspólnych jąder na podstawie jądra android-mainline
W 2022 r. z wersji android-mainline
wyodrębniono nowe wspólne jądro Androida android14-6.1
. W 2023 r., gdy ogłoszono następną wersję LTS,
android15-6.6
została odgałęziona od android-mainline
.
Jak pokazano na Rys. 1, każda wersja jądra może być podstawą dla dwóch jąder GKI.
Na przykład 2 jądra w wersji 5.15 to android13-5.15
i android14-5.15
,
oba są jądrami funkcji dla odpowiednich wersji platformy. Tak samo było w przypadku wersji 5.10; platforma android12-5.10
została utworzona po zadeklarowaniu kanału LTS, a odgałęzienie android13-5.10
nastąpiło od android12-5.10
w miarę rozwoju funkcji jądra wiosną 2021 r., aby umożliwić rozwijanie funkcji dla Androida 13. Od wersji Android 15 (2024) w przypadku każdej wersji jądra jest tylko 1 nowe jądro GKI (nie ma jądra android15-6.1
).
Cykl życia gałęzi ACK KMI
Cykl życia gałęzi KMI w ACK przedstawiono na rysunku 2 poniżej.
Rysunek 2. 6.6 Cykl życia gałęzi ACK KMI
Aby wyjaśnić proces rozwoju i cykl życia gałęzi, rysunek 2 skupia się na gałęziach ACK KMI w wersji 6.6.
Każda gałąź KMI ACK przechodzi przez 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 przechodzi do fazy rozwoju (oznaczona jako dev na rysunku 2) i staje się dostępna dla programistów, którzy chcą wnosić do niej poprawki, aby można było ją wykorzystać w kolejnych wersjach platformy Android. Na rys. 2 obiekt android15-6.6
został utworzony, gdy wersja 6.6 została zadeklarowana jako nowe jądro LTS nadrzędne.
Stabilizacja
Gdy gałąź ACK KMI zostanie zadeklarowana jako funkcja zakończona, przechodzi w fazę stabilizacji (oznaczoną na rys. 2 jako stabilną). Funkcje partnerów i poprawki błędów są nadal akceptowane, ale śledzenie KMI jest włączone, aby wykrywać wszelkie zmiany, które wpływają na interfejs. Na tym etapie są akceptowane zmiany KMI, a definicja KMI aktualizowana według wstępnie zdefiniowanego cyklu (zwykle co 2 tygodnie). Szczegółowe informacje o monitorowaniu KMI znajdziesz w omówieniu GKI.
Faza zablokowana KMI
Zanim nowa wersja platformy zostanie przesłana do AOSP, gałąź ACK KMI jest zamrażana i pozostaje zamrożona do końca jej istnienia. Oznacza to, że nie są akceptowane żadne zmiany, które naruszają KMI, chyba że zostanie zidentyfikowany poważny problem z bezpieczeństwem, którego nie można rozwiązać bez wpływu na stabilny KMI. Aby uniknąć problemów z KMI, niektóre poprawki scalone z LTS mogą zostać zmodyfikowane lub usunięte, jeśli poprawka nie jest wymagana na urządzeniach z Androidem.
Gdy gałąź KMI w wersji ACK jest zablokowana, można akceptować poprawki błędów i funkcje partnerów, o ile nie powoduje to problemów z dotychczasowym wspólnym jądrem KMI. KMI można rozszerzyć o nowe wyeksportowane symbole, o ile nie wpłynie to na interfejsy stanowiące bieżącą wskaźnik KMI. Po dodaniu do KMI nowe interfejsy stają się od razu stabilne i nie mają możliwości uszkodzenia w przypadku przyszłych zmian.
Na przykład zmiana polegająca na dodaniu pola do struktury używanej przez typowe 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 dozwolone:
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 jest zachowana zgodność wsteczna z przestrzenią użytkownika, dzięki czemu można bezpiecznie używać jądra w ramach wersji platformy Android, z którą urządzenie zostało wprowadzone na rynek. Ciągłe testowanie z użyciem poprzednich wersji zapewnia zachowanie zgodności. Zatem na ilustracji 2 jądro android15-6.6
może być używane na urządzeniach z Androidem 15 i nowszymi. Ponieważ wersja platformy Androida jest również zgodna z poprzednimi wersjami, jądro android14-6.1
można wykorzystać na urządzeniach z Androidem 15 do uruchomienia lub uaktualnienia.
Numer generowania KMI
Jeśli w fazie stabilizacji nastąpiło scalenie LTS, wystąpił problem z bezpieczeństwem lub inne zdarzenie, które wymaga zaakceptowania poprawki zmieniającej KMI, numer generacji KMI zapisany w pliku build.config.common
zostanie zwiększony. Bieżącą generację KMI można znaleźć, używając 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 ulegnie zmianie, jądro nie będzie zgodne z modułami dostawców, które są zgodne z poprzednią generacją KMI. Dlatego moduły należy ponownie skompilować i zaktualizować synchronicznie z jądrem. Po zamrożeniu KMI zmiany w generowaniu KMI powinny być bardzo rzadkie.
Zgodność jądra systemu
Wymagania dotyczące zgodności między jądrami w tej samej rodzinie LTS ulegają zmianie wraz z nowymi jądrami GKI.
Jądro GKI
Kernele GKI zachowują zgodność wsteczną ze wszystkimi wersjami platformy Android, które obsługiwały wersję jądra. Dodatkowo wersje platformy Androida są zgodne wstecznie z jądrami GKI z poprzednich wersji. Możesz więc bezpiecznie używać jądra android14-6.1
opracowanego na 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.
KMI jest stabilny, więc można aktualizować jądro bez konieczności ponownego kompilowania modułów jądra w obrazie dostawcy.
Kompatybilność KMI nie jest utrzymywana między różnymi rdzeniami GKI. Oznacza to, że na przykład jądra android14-6.1
nie można zastąpić jądrem android15-6.6
bez odtwarzania wszystkich modułów.
Kernele GKI są obsługiwane tylko w przypadku ich pierwszych 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 powiązaniu z poszczególnymi wersjami platformy Android.
Wersja na platformę Android | Obsługiwane jądra w przypadku uaktualnienia | Obsługiwane jądra na potrzeby uruchomienia |
---|---|---|
Android 15 (2024) |
android15-6.6
|
android15-6.6
|
Android 14 (2023 r.) |
android14-6.1
|
android14-6.1
|
Android 13 (2022) |
android13-5.15
|
android13-5.15
|
Android 12 (2021 r.) |
android12-5.10
|
android-4.19-stable
|
Android 11 (2020 r.) |
android11-5.4
|
android11-5.4
|
Obsługa okresów ważności i poprawek zabezpieczeń
Aktualizacje Androida otrzymują zaktualizowane wersje LTS z górnego poziomu i poprawki błędów w konkretnym kodzie na Androida. Poprawki obejmują wszystkie poprawki zabezpieczeń jądra wymienione w comiesięcznych biuletynach o zabezpieczeniach Androida, które mają zastosowanie do ACK.
Potwierdzenia mogą być obsługiwane dłużej niż przez odpowiednie stabilne jądro w starszej wersji z 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 użytkowania, Google przestanie je obsługiwać, a urządzenia z tymi jądrami będą uznawane za podatne na zagrożenia.
Począwszy od jądra w wersji 6.6 okres obsługi stabilnych jąder wynosi 4 lata.
Ta tabela pokazuje czas trwania obsługiwanych potwierdzeń:
Gałąź ACK | Data uruchomienia |
Wsparcie całościowe (w latach) |
EOL |
---|---|---|---|
android-4.19-stable | 2018-10-22 | 6 | 2025-01-01 |
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 |
Android 14–6.1 | 2022-12-11 | 6 | 2029-07-01 |
android15-6.6 | 2023-10-29 | 4 | 2028-07-01 |
Typowe testowanie jądra systemu
Kernele wspólne są testowane za pomocą kilku systemów CI oraz przez dostawców.
Test funkcjonalny jądra Linuksa
Test funkcjonalny jądra Linuksa (LKFT): testy inicjują różne pakiety testów, w tym kselftest, LTP, VTS i CTS, na zestawie fizycznych urządzeń z procesorami ARM32 i ARM64. Najnowsze wyniki testów znajdziesz tutaj.
Testowanie KernelCI
Testy kompilacji i uruchamiania KernelCI są inicjowane za każdym razem, gdy nowa poprawka zostanie zaakceptowana w ramach wspólnej gałęzi jądra. Kilkaset konfiguracji kompilacji jest testowanych i uruchamianych na różnych płytach. Najnowsze wyniki dotyczące jąder Androida znajdziesz tutaj.
Testowanie przed i po przesłaniu aplikacji na Androida
Testy przed przesłaniem służą do zapobiegania wprowadzania błędów do wspólnych jąder Androida. Podsumowanie wyników testu znajdziesz na karcie „Checks” (Sprawdzanie) w zmianie kodu w gerrit do wspólnego jądra Androida.
Testy postsubmit Androida są wykonywane w nowych, opublikowanych kompilacjach w typowych gałęziach jądra Androida, gdy nowe poprawki są przydzielane do wspólnej gałęzi jądra Androida w ci.android.com. Jeśli wpiszesz aosp_kernel
jako częściową nazwę gałęzi w ci.android.com, zobaczysz listę gałęzi jądra z dostępnymi wynikami. Na przykład wyniki dla zapytania android-mainline
znajdziesz
tutaj. Po kliknięciu konkretnej kompilacji na karcie Test Results
znajdziesz stan testu.
W przypadku gałęzi jądra Androida testy zdefiniowane w ramach mapowania testów z grupą testową kernel-presubmit
w drzewie źródła platformy Androida zostaną uruchomione jako wstępne przesłanie. Na przykład poniższa konfiguracja w pliku test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING spowoduje włączenie vts_kernel_proc_file_api_test jako testu wstępnego podczas odprawiania typowego kodu jądra Androida.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
testowanie typu 0-day,
Testowanie 0-day obejmuje testowanie każdej poprawki w ramach wszystkich typowych gałęzi jądra Androida, gdy zostaną wdrożone nowe poprawki. Przeprowadzane są różne testy uruchamiania, funkcjonalności i wydajności. Dołącz do publicznej grupy cros-kernel-buildreports
Zestaw testów
Wspólny komponent jądra Androida | Wersje platformy Android | Pakiety testowe | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Menu główne | 15 | 14 | 13 | 12 | 11 | 10 | LKFT | KernelCI | Przed przesłaniem | Przesłanie posta | luka typu 0-day | |
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android15-6.6
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android-4.19-stable
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Wspieranie tworzenia wspólnych jąder Androida
Ogólnie rzecz biorąc, funkcje powinny być rozwijane na głównych jądrach Linuksa, a nie na wspólnych jądrach Androida. Zdecydowanie zachęcamy do ulepszania kodu na gałęzi upstream. Po zaakceptowaniu zmian można je łatwo przenieść na odpowiednią gałąź ACK. Zespół jądra Androida chętnie wspiera działania związane z upstreamingiem z korzyścią dla ekosystemu Androida.
Przesyłaj poprawki do Gerrit i przestrzegaj tych wytycznych dotyczących wkładu.