Wspólne jądra Androida

Wspólne jądra AOSP (znane również jako wspólne jądra Androida lub ACK ) znajdują się poniżej jąder kernel.org i zawierają poprawki interesujące dla społeczności Androida, które nie zostały włączone do jąder głównych lub obsługiwanych długoterminowo (LTS). Te poprawki mogą obejmować:

  • Backporty i wybrane funkcje nadrzędne potrzebne do obsługi funkcji Androida
  • Funkcje gotowe dla urządzeń z systemem Android, ale wciąż w fazie rozwoju (na przykład optymalizacja rozmieszczenia zadań Energy Aware Scheduler).
  • Funkcje dostawcy/OEM przydatne dla innych partnerów ekosystemu (na przykład sdcardfs).

android-mainline to główna gałąź programistyczna dla funkcji Androida. Linia główna systemu Linux jest łączona z android-mainline za każdym razem, gdy Linus Torvalds publikuje wersję lub kandydata do wydania. Przed 2019 rokiem wspólne jądra Androida były konstruowane poprzez klonowanie niedawno zadeklarowanego jądra LTS i dodanie poprawek specyficznych dla Androida. Proces ten 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 Androida, osiągając ten sam wynik stopniowo. android-mainline przechodzi znaczące, ciągłe testy, model ten zapewnia wysokiej jakości jądro od dnia jego opublikowania.

Kiedy nowy LTS jest deklarowany wcześniej, odpowiednie wspólne jądro jest rozgałęziane od android-mainline . Dzięki temu partnerzy mogą rozpocząć projekt przed zadeklarowaniem wersji LTS, poprzez połączenie 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 regularnie otrzymują połączenia z powiązanym jądrem LTS . Te połączenia 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 ). Gorąco 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 specyficznymi 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 Android, dlatego gałęzie noszą nazwy <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ólnym jądrem Androida. Gałęzie zostały utworzone przed wydaniem powiązanej wersji deserowej i regularnie otrzymują połączenia z LTS, ale nie zawierają żadnych nowych funkcji. Na przykład android-4.9-q odbiera połączenia z gałęzi LTS 4.9.y.

Jeśli wersja jądra nie była jądrem startowym, nie zostało utworzone jądro deserowe, ale jądro powiązane z najnowszą wersją platformy jest ważne w przypadku aktualizacji do przyszłych wydań platformy Android. Na przykład android-4.9-q był ostatnią gałęzią deserową android-4.9* , dlatego jest obsługiwany i testowany na oryginalnej wersji platformy, systemie Android 10. Jest także obsługiwany i testowany na wersjach platformy obsługujących aktualizacje urządzeń z systemem 4.9 Jądra: Android 11 i Android 12.

Ponieważ schemat nazewnictwa deserowego dla wydań platformy Android został porzucony w systemie Android 10, ostatnie wydania deserowe, które nazywałyby się 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 Androida 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
Grudzień 2024

Starsze gałęzie jądra wersji

Jądra wersji są utrzymywane w celu zapewnienia kopii zapasowych poprawek cytowanych w comiesięcznym Biuletynie Bezpieczeństwa Androida . Zostały stworzone dla każdego jądra uruchamiającego, gdy pojawiała się nowa wersja platformy Android. Przestają być przestarzałe, gdy powiązane z nimi wydanie jądra lub platformy stanie się przestarzałe, zgodnie z opisem w temacie Okresy wsparcia i poprawki zabezpieczeń .

Co miesiąc, gdy publikowany jest Biuletyn zabezpieczeń systemu Android, jądra te są aktualizowane o kopie zapasowe poprawek cytowanych w biuletynie, które są istotne dla jąder nadrzędnych i popularnych 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 wersjach platformy Android 11 i nowszych partnerzy muszą połączyć się z jądrami deserowymi lub GKI, aby zastosować poprawki wymienione w Biuletynie zabezpieczeń systemu Android. Dla wersji platformy Android 11 lub nowszych nie zostanie utworzone jądro wersji.

Dlatego też w tej tabeli pokazana jest pełna lista 14 wersji jądra 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

Funkcjonuj i uruchamiaj jądra

Każda wersja platformy Android umożliwia uruchamianie nowych urządzeń w oparciu o dowolną z trzech wersji jądra Linuksa. Jak pokazano w poniższej tabeli, jądra startowe dla Androida 11 to android-4.14-stable , android-4.19-stable i android11-5.4 .

Ponieważ aktualizacje jądra nie są zazwyczaj wymagane podczas aktualizacji wersji platformy, jądra, w których brakuje najnowszych funkcji dla danej wersji platformy, mogą być nadal używane do uruchamiania urządzeń. Dlatego jądra zaprojektowane dla Androida 10, takie jak android-4.19-q , mogą być używane na urządzeniach nawet po aktualizacji wersji platformy do Androida 11. Począwszy od Androida 12, będzie mniej jąder z funkcjami niż jądra uruchamiające, aby ograniczyć liczbę stabilne KMI, które muszą być obsługiwane.

Wersja platformy Android Uruchom jądra Jądra funkcji
Androida 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
Androida 13 (2022) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
Androida 12 (2021) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
Androida 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
Androida 10 (2019) android-4.19-q
android-4.14-q
android-4.9-q

android-4.19-q
android-4.14-q
android-4.9-q

1 Mogą obowiązywać dodatkowe ograniczenia, jeśli powiązany BSP został zaktualizowany do wersji platformy. Mówiąc bardziej ogólnie, numer wydania jądra Androida musi być wyższy lub równy docelowej wersji FCM . Aby uzyskać szczegółowe informacje, zobacz Obiekt interfejsu dostawcy — dopasuj gałęzie jądra .

Wspólna hierarchia jądra

Oddział z Android-mainline

Najwyższy poziom wspólnej hierarchii jądra pokazano na rysunku 1.

Tworzenie wspólnych jąder z jądra głównego systemu Android

Rysunek 1. Tworzenie popularnych jąder z jądra głównego systemu Android

Zwróć uwagę, że nowe wspólne jądro Androida android12-5.10 zostało odgałęzione od android-mainline w 2020 r. W 2021 r., kiedy ogłoszono kolejny LTS, android13-5.15 zostało odgałęzione 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 , oba są jądrami funkcyjnymi dla odpowiednich wersji platform. Podobnie będzie w przypadku wersji 5.10; android12-5.10 powstał po ogłoszeniu LTS, a android13-5.10 będzie odgałęzieniem android12-5.10 w momencie osiągnięcia kamienia milowego w zakresie 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.

5.10 Cykl życia gałęzi ACK KMI

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 w 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 ( program deweloperski na rysunku 2) i jest otwarta na wkład w funkcje do następnej wersji platformy Android. Na rysunku 2 android12-5.10 został utworzony, gdy zadeklarowano wersję 5.10 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 rozwojowej.

Faza stabilizacji

Kiedy gałąź ACK KMI zostanie uznana za kompletną, wchodzi w fazę stabilizacji , oznaczoną jako stab na rysunku 2. Funkcje partnerów i poprawki błędów są nadal akceptowane, ale śledzenie KMI jest włączone w celu wykrycia wszelkich zmian mających wpływ na interfejs. Na tym etapie akceptowane są zmiany naruszające KMI, ale w razie potrzeby należy zaktualizować definicję KMI. 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 zostaje zablokowana i pozostaje zamrożona przez cały okres istnienia gałęzi. Oznacza to, że nie są akceptowane żadne zmiany naruszające KMI, chyba że zostanie zidentyfikowany poważny problem bezpieczeństwa, którego nie można złagodzić bez wpływu na stabilną 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 zostanie zamrożona, poprawki błędów i funkcje partnerów mogą zostać zaakceptowane, o ile istniejące wspólne jądro KMI nie jest uszkodzone. 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 do KMI dodawane są nowe interfejsy, natychmiast stają się one stabilne i nie mogą zostać zniszczone 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 istnienia jądra GKI zachowana jest wsteczna kompatybilność 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 uruchomione. Ciągłe testowanie poprzednich wersji zapewnia zachowanie kompatybilności. Zatem na rysunku 2 jądro android12-5.10 może być używane na urządzeniach z Androidem 12 i Androidem 13. Ponieważ wersja platformy Android jest również kompatybilna z poprzednimi wersjami, jądra android12-5.4 można używać na urządzeniach z Androidem 13 zarówno do uruchamiania, jak i aktualizacji.

Po wejściu w fazę zamrożenia gałąź jest otagowana git ciągiem wersji KMI zawierającym numer generacji KMI. Na przykład, gdy android11-5.4 został zamrożony, został on oznaczony ciągiem wersji KMI 5.4-android11-0 , gdzie końcowe 0 to numer generacji KMI. Jeśli wystąpi problem bezpieczeństwa lub inne zdarzenie wymagające zaakceptowania poprawki zmieniającej KMI, numer generacji KMI jest zwiększany, a gałąź zostaje ponownie oznakowana. Przykładowo, 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 oznacza generację KMI (w tym przypadku 0).

Jeśli generacja KMI ulegnie zmianie, jądro nie będzie kompatybilne z modułami dostawców zgodnymi z poprzednią generacją KMI, zatem moduły muszą zostać przebudowane i zaktualizowane synchronicznie z jądrem. Oczekuje się, że zmiany generacji KMI będą bardzo rzadkie.

Kompatybilność 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 daną wersję jądra. Ponadto wydania platformy Android są wstecznie kompatybilne z jądrami GKI z poprzednich wydań. Dzięki temu możesz 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 pomiędzy różnymi jądrami GKI. Na przykład android12-5.10 nie można zastąpić jądrem android13-5.10 bez przebudowania wszystkich modułów.

Jądra GKI są obsługiwane tylko w przypadku ich pierwszych i kolejnych wydań. Nie są one obsługiwane w starszych wersjach. Dlatego jądro android13-5.10 nie jest obsługiwane na urządzeniach z Androidem 12.

Starsze jądra

Starsze jądra deserowe ( *-q i *-stable ) nie są kompatybilne wstecz w wersjach platformy Android, ale jądra z poprzednich dwóch wersji platformy Android są obsługiwane w przypadku aktualizacji. Dlatego urządzenie uruchomione z systemem Android 10 i korzystającym z jądra opartego na systemie android-4.19-q może albo nadal korzystać z jądra systemu android-4.19-q po aktualizacji do systemu Android 2020, albo zaktualizować kod specyficzny dla dostawcy, aby obsługiwał android-4.19-stable .

Macierz kompatybilności

W tej tabeli przedstawiono wersje jądra obsługiwane i testowane w każdej wersji platformy Android.

Wersja platformy Android Obsługiwane jądra do aktualizacji Obsługiwane jądra do uruchomienia
Androida 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Androida 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Androida 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Androida 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
Androida 10 (2019) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

Okresy wsparcia i poprawki zabezpieczeń

Obsługiwane są typowe jądra systemu Android, dopóki powiązane jądro LTS lub wersja platformy Android nie będą już obsługiwane. Chociaż jądro jest obsługiwane, nadal otrzymuje połączenia LTS z wcześniejszych wersji i poprawki błędów dla kodu specyficznego dla Androida. Poprawki te 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 regularnie łącząc się ze zwykłymi jądrami Androida, otrzymają wszystkie możliwe poprawki zabezpieczeń jądra.

Wspólne testowanie jądra

Oprócz dalszych testów przeprowadzanych przez dostawców, popularne jądra są testowane z kilkoma systemami CI.

Test funkcjonalny jądra Linuksa

Testy funkcjonalne jądra systemu Linux (LKFT) inicjują różne zestawy testów, w tym kselftest, LTP, VTS i CTS na zestawie fizycznych urządzeń arm32 i arm64. Wyniki najnowszych testów można znaleźć tutaj .

Testowanie KernelCI

Testy kompilacji i rozruchu KernelCI są inicjowane za każdym razem, gdy nowa łatka jest zatwierdzona we wspólnej gałęzi jądra. Testowanych i uruchamianych jest kilkaset konfiguracji kompilacji na różnych płytach. Najnowsze wyniki dla jąder Androida można znaleźć tutaj .

Testy Androida przed i po przesłaniu

Testy przed przesłaniem służą do zapobiegania wprowadzaniu błędów do popularnych jąder Androida. Podsumowanie wyników testu można znaleźć w zakładce „Kontrole” zmiany kodu we wspólnym jądrze Androida gerrit.

Testowanie po przesłaniu systemu Android jest przeprowadzane na nowych opublikowanych kompilacjach we wspólnych gałęziach jądra systemu Android, gdy nowe poprawki są zatwierdzane we wspólnej gałęzi jądra systemu Android w witrynie ci.android.com . Wpisując 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 android-mainline można znaleźć tutaj . Klikając na konkretną kompilację, status testu znajdziesz w zakładce Test Results .

Testy zdefiniowane poprzez mapowanie testów z grupą testową kernel-presubmit w drzewie źródłowym platformy Android zostaną uruchomione jako presubmit dla gałęzi jądra Androida. Na przykład poniższa konfiguracja w test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING umożliwi vts_kernel_proc_file_api_test jako test wstępny podczas sprawdzania wspólnego kodu jądra Androida.

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

Testowanie 0-dniowe

Testowanie 0-dniowe polega na testowaniu łatek po łatkach we wszystkich popularnych gałęziach jądra Androida, gdy zostaną zatwierdzone nowe poprawki. Przeprowadzane są różne testy rozruchu, funkcjonalności i wydajności. Dołącz do publicznej grupy cros-kernel-buildreports

Matryca testowa

Wspólne jądro Androida Wersje platformy Android Zestawy testowe
Główny 14 13 12 11 10 LKFT Jądro CI Przed przesłaniem Wyślij wiadomość 0-dniowy
android-mainline
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android-4.14-stable

Współtwórz wspólne jądra Androida

Ogólnie rzecz biorąc, rozwój funkcji powinien odbywać się na głównym Linuksie, a nie na popularnych jądrach Androida. Zdecydowanie zaleca się rozwój wyższego szczebla, a po zaakceptowaniu tam rozwoju można go w razie potrzeby łatwo przenieść do określonej gałęzi ACK. Zespół jądra systemu Android chętnie wspiera wysiłki związane z upstreamingiem na rzecz ekosystemu Androida.

Przesyłaj poprawki do Gerrit i przestrzegaj niniejszych wytycznych dotyczących wkładu .