Wspólne jądra AOSP (znane również jako wspólne jądra systemu Android lub ACK ) są niższe od jąder kernel.org i zawierają poprawki interesujące społeczność Androida, które nie zostały scalone z jądrami głównymi lub długoterminowymi (LTS). Te poprawki mogą obejmować:
- Backporty i wybrane funkcje upstream potrzebne do funkcji Androida
- Funkcje gotowe na urządzenia z Androidem, ale wciąż w fazie rozwoju (na przykład optymalizacje rozmieszczenia zadań w programie Energy Aware Scheduler).
- Funkcje dostawcy/OEM, które są przydatne dla innych partnerów ekosystemu (na przykład sdcardfs).
android-mainline
to główna gałąź programistyczna dla funkcji Androida. Linia główna Linuksa jest łączona z android-mainline
za każdym razem, gdy Linus Torvalds publikuje wydanie lub kandydata do wydania. Przed 2019 rokiem wspólne jądra Androida były konstruowane poprzez klonowanie niedawno zadeklarowanego jądra LTS i dodawanie poprawek specyficznych dla Androida. Ten proces zmienił się w 2019 roku, aby rozgałęzić nowe wspólne jądro Androida z android-mainline
. Ten nowy model pozwala uniknąć znacznego wysiłku związanego z przekazywaniem portów i testowaniem poprawek dla systemu Android, osiągając ten sam wynik stopniowo. android-mainline
przechodzi znaczne ciągłe testy, ten model zapewnia wysokiej jakości jądro od dnia jego opublikowania.
Kiedy nowy LTS jest zadeklarowany w górę, odpowiednie wspólne jądro jest rozgałęzione z android-mainline
. Dzięki temu partnerzy mogą rozpocząć projekt przed zadeklarowaniem wersji LTS, łącząc 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 scalane z powiązanego z nimi jądra LTS . Te scalania są zwykle wykonywane natychmiast po opublikowaniu wersji LTS. Na przykład, kiedy opublikowano Linuksa 4.19.64, został on włączony do wspólnych jąder 4.19 (na przykład android-4.19-q
). Zdecydowanie zachęcamy partnerów do regularnego łączenia wspólnych jąder z jądrami swoich produktów, aby być na bieżąco z poprawkami błędów LTS i Androida.
Gałąź jądra ACK KMI
Jądra GKI mają stabilny interfejs modułu jądra. KMI jest unikatowo identyfikowany przez wersję jądra i wersję platformy Android, dlatego gałęzie są nazywane <androidRelease>-<kernel version>
. Na przykład jądro 5.4 GKI dla Androida 11 nosi nazwę android11-5.4.
Dla Androida 12 dostępne są dwa dodatkowe jądra GKI, android12-5.4
i android12-5.10
.
Starsze gałęzie jądra deserowego
Starsze jądra deserowe zostały stworzone, aby zagwarantować, że rozwój nowych funkcji nie będzie kolidował z łączeniem ze wspólnego jądra Androida. Gałęzie zostały utworzone przed wydaniem powiązanego deseru i są regularnie scalane z LTS, ale bez nowych funkcji. Na przykład android-4.9-q
otrzymuje scalanie z gałęzi LTS 4.9.y.
Jeśli wersja jądra nie była jądrem startowym, nie utworzono jądra deserowego, ale jądro powiązane z najnowszą wersją platformy jest ważne do aktualizacji do przyszłych wersji platformy Android. Na przykład android-4.9-q
był ostatnim z gałęzi deserowych android-4.9*
, więc jest obsługiwany i testowany z oryginalną wersją platformy, Androidem 10. Jest również obsługiwany i testowany z wersjami platformy, które obsługują uaktualnienia urządzeń z systemem 4.9 jądra: Android 11 i Android 12.
Ponieważ schemat nazewnictwa deserów dla wydań platformy Android został usunięty wraz z Androidem 10, ostatnie wydania deserowe, które nosiłyby nazwy android-4.14-r
i android-4.19-r
zostały zamiast tego nazwane android-4.14-stable
i android-4.19-stable
.
Jądra deserowe są zastępowane przez jądra GKI począwszy od systemu Android 11, więc pełna lista obsługiwanych jąder deserowych znajduje się w tej tabeli.
Wersja platformy Android | Jądro | Obsługiwane do |
---|---|---|
Androida 10 | android-4.9-q android-4.14-q android-4.19-q | styczeń 2023 r |
Androida 11 | android-4.14-stable android-4.19-stable | styczeń 2024 r |
Gałęzie jądra starszych wersji
Jądra wersji są utrzymywane w celu dostarczania backportów poprawek cytowanych w comiesięcznym Biuletynie bezpieczeństwa systemu Android . Zostały utworzone dla każdego uruchomionego jądra, gdy pojawiła się nowa wersja platformy Android. Są przestarzałe, gdy powiązana wersja jądra lub platformy jest przestarzała, zgodnie z opisem w Okresy istnienia pomocy technicznej i poprawki zabezpieczeń .
Co miesiąc, gdy publikowany jest biuletyn bezpieczeństwa systemu Android, te jądra są aktualizowane za pomocą backportów poprawek cytowanych w biuletynie, które dotyczą jąder nadrzędnych i wspólnych jąder systemu Android. Nie otrzymują łatek LTS, więc numer wersji pomocniczej nigdy się nie zmienia. Nie zawierają backportów dla poprawek specyficznych dla dostawcy.
W systemach Android 11 i nowszych wersjach platformy partnerzy muszą połączyć jądra deserowe lub GKI, aby zastosować poprawki wymienione w Biuletynie zabezpieczeń systemu Android. Żadne jądro wersji nie zostanie utworzone dla wersji platformy Android 11 lub nowszych.
Dlatego w tej tabeli pokazana jest pełna lista 14 wydań jąder i żadne nie zostanie dodane.
Wersja platformy Android | Jądro | Obsługiwane do |
---|---|---|
Androida 10 | android-4.9-q-release android-4.14-q-release android-4.19-q-release | styczeń 2023 r |
Funkcje i uruchamianie jąder
Każda wersja platformy Android obsługuje uruchamianie nowych urządzeń opartych na dowolnej z trzech wersji jądra systemu Linux. Jak pokazano w poniższej tabeli, jądra uruchamiania dla systemu Android 11 to android-4.14-stable
, android-4.19-stable
i android11-5.4
.
Ponieważ aktualizacje jądra nie są na ogół wymagane podczas aktualizacji wersji platformy, jądra, w których brakuje najnowszych funkcji danej wersji platformy, nadal mogą być używane do uruchamiania urządzeń. Dlatego jądra zaprojektowane dla systemu Android 10, takie jak android-4.19-q
, mogą być używane na urządzeniach nawet po aktualizacji platformy do wersji Android 11. Począwszy od systemu Android 12, będzie mniej jąder funkcji niż jąder uruchamiania, aby ograniczyć liczbę stabilne KMI, które muszą być obsługiwane.
Wersja platformy Android | Uruchom jądra | Jądra funkcji |
---|---|---|
Androida 10 (2019) | android-4.9-q android-4.14-q android-4.19-q | android-4.9-q android-4.14-q android-4.19-q |
Androida 11 (2020) | android-4.14-stable android-4.19-stable android11-5.4 | android-4.14-stable android-4.19-stable android11-5.4 |
Androida 12 (2021) | android-4.19-stable android11-5.4 1 android12-5.4 android12-5.10 | android12-5.4 android12-5.10 |
Androida 13 (2022) | android11-5.4 1 android12-5.4 1 android12-5.10 1 android13-5.10 android13-5.15 | android13-5.10 android13-5.15 |
1 Mogą obowiązywać dodatkowe ograniczenia, jeśli powiązany BSP został zaktualizowany dla wydania platformy. Mówiąc bardziej ogólnie, numer wersji Androida jądra musi być wyższy lub równy docelowej wersji FCM . Zobacz Vendor Interface Object - dopasuj gałęzie jądra, aby uzyskać szczegółowe informacje. |
Wspólna hierarchia jądra
Rozgałęzienie z głównej linii Androida
Najwyższy poziom wspólnej hierarchii jądra pokazano na rysunku 1.
Rysunek 1. Tworzenie wspólnych jąder z głównego jądra systemu Android
Zauważ, że nowe wspólne jądro Androida android12-5.10
zostało odgałęzione od android-mainline
w 2020 roku. W 2021 roku, kiedy ogłoszono następny LTS, android13-5.15
został odgałęziony od android-mainline
.
Jak pokazano na rysunku 1, każda wersja jądra jest podstawą dla dwóch jąder GKI. Na przykład dwa jądra v5.4 to android11-5.4
i android12-5.4
, z których oba są jądrami funkcji dla odpowiednich wydań platform. Tak będzie również w przypadku wersji 5.10; android12-5.10
został utworzony, gdy zadeklarowano LTS, a android13-5.10
zostanie odgałęziony od android12-5.10
w momencie ukończenia kamienia milowego funkcji jądra wiosną 2021 r., aby umożliwić rozwój funkcji dla Androida 13.
Cykl życia gałęzi ACK KMI
Cykl życia gałęzi ACK KMI pokazano poniżej na rysunku 2.
Rysunek 2. 5.10 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 dla wersji 5.10.
Każda gałąź ACK KMI przechodzi przez trzy fazy wskazane na rysunku 2 różnymi kolorami w każdej gałęzi. Jak pokazano, LTS jest regularnie łączony niezależnie od fazy.
Faza rozwoju
Po utworzeniu gałąź ACK KMI wchodzi w fazę rozwoju ( dev na rysunku 2) i jest otwarta na wkłady funkcji dla następnej wersji platformy Android. Na rysunku 2 android12-5.10
został utworzony, gdy 5.10 zostało zadeklarowane jako nowe jądro LTS. Druga gałąź ACK KMI dla wersji jądra może zostać utworzona wcześniej, aby umożliwić rozwój kolejnej wersji. Na rysunku 2 android13-5.10
jest tworzony, gdy android12-5.10
wychodzi z fazy rozwoju.
Faza stabilizacji
Gdy gałąź ACK KMI zostanie uznana za kompletną, wchodzi w fazę stabilizacji , oznaczoną jako dźgnięcie na rysunku 2. Funkcje partnera i poprawki błędów są nadal akceptowane, ale włączone jest śledzenie KMI w celu wykrycia wszelkich zmian, które mają wpływ na interfejs. W tej fazie akceptowane są zmiany przełomowe KMI, ale definicja KMI musi zostać zaktualizowana w razie potrzeby. Zobacz przegląd GKI , aby uzyskać szczegółowe informacje na temat monitorowania KMI.
Faza zamrożona KMI
Zanim nowa wersja platformy zostanie wypchnięta do AOSP, gałąź ACK KMI jest zamrożona i pozostaje zamrożona przez cały okres istnienia gałęzi. Oznacza to, że żadne zmiany naruszające KMI nie są akceptowane, chyba że zostanie zidentyfikowany poważny problem z bezpieczeństwem, którego nie można złagodzić bez wpływu na stabilny KMI. Aby uniknąć awarii 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łąź ACK KMI jest zamrożona, poprawki błędów i funkcje partnerów mogą być akceptowane, o ile istniejące wspólne jądro KMI nie jest zepsute. KMI można rozszerzyć o nowe wyeksportowane symbole, o ile nie ma to wpływu na interfejsy składające się na bieżący KMI. Kiedy nowe interfejsy są dodawane do KMI, natychmiast stają się stabilne i nie mogą zostać zepsute przez przyszłe zmiany.
Na przykład zmiana polegająca na dodaniu pola 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);
Jednak dodanie nowej funkcji jest w porządku:
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 kompatybilność wsteczna z przestrzenią użytkownika, dzięki czemu jądro może być bezpiecznie używane z wersją platformy Android, z którą urządzenie zostało uruchomione. Ciągłe testowanie z poprzednimi wersjami zapewnia utrzymanie zgodności. Tak więc na rysunku 2 jądro systemu android12-5.10
może być używane na urządzeniach z systemem Android 12 i urządzeniach z systemem Android 13. Ponieważ wersja platformy Android jest również kompatybilna z poprzednimi wersjami, jądro systemu android12-5.4
może być używane na urządzeniach z systemem Android 13 do uruchamiania lub aktualizacji.
Podczas wchodzenia w fazę zamrożoną gałąź jest oznaczana git-tagiem z ciągiem wersji KMI zawierającym numer generacji KMI. Na przykład, gdy android11-5.4
został zamrożony, został oznaczony ciągiem wersji KMI 5.4-android11-0
, gdzie końcowe 0
to numer generacji KMI. Jeśli wystąpi problem z bezpieczeństwem lub inne zdarzenie, które wymaga zaakceptowania poprawki zmieniającej KMI, numer generacji KMI jest zwiększany, a gałąź ponownie oznaczana. Na przykład, jeśli taka zmiana zostanie zaakceptowana w android11-5.4
, gałąź zostanie oznaczona nową wersją KMI, 5.4-android11-1
. Bieżącą generację KMI można znaleźć za pomocą polecenia uname
:
$ uname -r
5.4.61-android11-0-00153-ga972f59040e4
Liczba po wydaniu platformy to generacja KMI (w tym przypadku 0).
Jeśli generacja KMI ulegnie zmianie, jądro nie jest kompatybilne z modułami dostawcy, które są zgodne z poprzednią generacją KMI, więc moduły muszą zostać odbudowane i zaktualizowane synchronicznie z jądrem. Oczekuje się, że zmiany generowania KMI będą bardzo rzadkie.
Zgodność między jądrami
Wymagania dotyczące kompatybilności między jądrami z tej samej rodziny LTS zmieniają się począwszy od nowych jąder GKI.
Jądra GKI
Jądra GKI zachowują kompatybilność wsteczną ze wszystkimi wersjami platformy Android, które obsługiwały wersję jądra. Ponadto wersje platformy Android są wstecznie kompatybilne z jądrami GKI z poprzednich wersji. Możesz więc bezpiecznie używać jądra android12-5.4
opracowanego dla Androida 12 na urządzeniach z Androidem 13. Kompatybilność jest weryfikowana poprzez ciągłe testy VTS i CTS jąder GKI ze wszystkimi obsługiwanymi wersjami.
KMI jest stabilny, dzięki czemu jądro może być aktualizowane bez konieczności przebudowy modułów jądra w obrazie dostawcy.
Kompatybilność KMI nie jest utrzymywana między różnymi jądrami GKI. Na przykład android12-5.10
nie może zostać zastąpiony jądrem android13-5.10
bez przebudowy wszystkich modułów.
Jądra GKI są obsługiwane tylko w ich początkowych i kolejnych wydaniach. Nie są obsługiwane w przypadku starszych wersji. Tak więc jądro systemu android13-5.10
nie jest obsługiwane na urządzeniach z systemem Android 12.
Starsze jądra
Starsze jądra deserowe ( *-q
i *-stable
) nie są zgodne z poprzednimi wersjami platformy Android, ale jądra z dwóch poprzednich wersji platformy Android są obsługiwane w przypadku uaktualnienia. W związku z tym urządzenie uruchomione z systemem Android 10 przy użyciu jądra opartego na android-4.19-q
może nadal korzystać z jądra android-4.19-q
podczas aktualizacji do systemu Android 2020 lub zaktualizować kod specyficzny dla dostawcy, aby obsługiwał android-4.19-stable
.
Macierz zgodności
W tej tabeli przedstawiono obsługiwane i testowane wersje jądra z każdą wersją platformy Android.
Wersja platformy Android | Obsługiwane jądra do aktualizacji | Obsługiwane jądra do uruchomienia |
---|---|---|
Androida 10 (2019) | android-3.18 (EOL)android-4.4-o (EOL)android-4.9-o (EOL)android-4.9-p (EOL)android-4.14-p (EOL) | android-4.9-q |
Androida 11 (2020) | android-4.4-o (EOL)android-4.4-p (EOL)android-4.9-o (EOL)android-4.9-p (EOL)android-4.9-q android-4.14-p (EOL)android-4.14-q | android-4.14-stable |
Androida 12 (2021) | android-4.9-o (EOL)android-4.9-p (EOL)android-4.9-q (EOL)android-4.14-q | android-4.19-stable |
Androida 13 (2022) | android-4.9-q | android11-5.4 |
Okresy życia wsparcia i poprawki bezpieczeństwa
Wspólne jądra systemu Android są obsługiwane, dopóki powiązane jądro LTS lub wersja platformy Android nie będą już obsługiwane. Podczas gdy jądro jest obsługiwane, nadal otrzymuje scalanie LTS z upstream i poprawki błędów dla kodu specyficznego dla Androida. Te poprawki obejmują wszystkie poprawki zabezpieczeń jądra cytowane w comiesięcznych biuletynach zabezpieczeń systemu Android , które dotyczą popularnych jąder systemu Android.
Partnerzy mogą być pewni, że regularne łączenie ze wspólnymi jądrami systemu Android zapewnia dostęp do wszystkich możliwych poprawek bezpieczeństwa jądra.
Wspólne testy jądra
Wspólne jądra są testowane z kilkoma systemami CI, oprócz dalszych testów przeprowadzanych przez dostawców.
Testy funkcjonalne jądra Linaro
Testy Linaro Kernel Functional Testing (LKFT) inicjują różne zestawy testów, w tym kselftest, LTP, VTS i CTS na zestawie fizycznych urządzeń arm32 i arm64. Najnowsze wyniki testów można znaleźć tutaj .
Testowanie jądra CI
Testy kompilacji i rozruchu KernelCI są inicjowane za każdym razem, gdy nowa poprawka jest zatwierdzana do wspólnej gałęzi jądra. Kilkaset konfiguracji kompilacji jest testowanych i uruchamianych na różnych płytach. Najnowsze wyniki dla jąder Androida można znaleźć tutaj .
Testy przed i po przesłaniu Androida
Testy przed wysłaniem służą do zapobiegania wprowadzaniu błędów do wspólnych jąder. Wyniki nie są obecnie publicznie dostępne.
Testy po przesłaniu systemu Android są przeprowadzane, gdy nowa poprawka jest przekazywana do wspólnej gałęzi jądra. Wpisując aosp_kernel
jako częściową nazwę gałęzi, zobaczysz listę gałęzi jądra z dostępnymi wynikami. Na przykład wyniki dla android-mainline
można znaleźć tutaj .
Testowanie 0-dniowe
Testy 0-dniowe przeprowadzają testy łatka po łatce na wszystkich wspólnych gałęziach jądra Androida, gdy są zatwierdzane nowe łatki. Przeprowadzane są różne testy rozruchowe, funkcjonalne i wydajnościowe. Dołącz do publicznej grupy cross-kernel-buildreports
Macierz testowa
Wspólne jądro Androida | Wersje platformy Android | Zestawy testowe | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Gospodarz | 13 | 12 | 11 | 10 | 9 (ciasto) | LKFT | Jądro CI | Przed przesłaniem | Prześlij pocztą | 0-dzień | |
android-mainline | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android-4.19-q | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | android-4.9-q | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
Przyczynianie się do wspólnych jąder Androida
Ogólnie rzecz biorąc, rozwój funkcji powinien odbywać się na głównym Linuksie, a nie na wspólnych jądrach Androida. Zdecydowanie zaleca się rozwój w górę, a po zaakceptowaniu tam rozwoju można go łatwo przenieść z powrotem do określonej gałęzi ACK w razie potrzeby. Zespół Android Kernel z przyjemnością wspiera działania upstreamingu z korzyścią dla ekosystemu Androida.
Prześlij poprawki do Gerrita i postępuj zgodnie z tymi wytycznymi dotyczącymi wkładu .