Jądra wspólne systemu Android (ACK) są podstawą wszystkich jąder produktów Android. Jądra dostawcy i urządzenia znajdują się za pakietami ACK. Dostawcy dodają obsługę układów SoC i urządzeń peryferyjnych, modyfikując kod źródłowy jądra i dodając sterowniki urządzeń. Te modyfikacje mogą być rozległe do tego stopnia, że aż 50% kodu działającego na urządzeniu jest kodem spoza drzewa i nie pochodzi z pierwotnego systemu Linux lub z popularnych jąder AOSP.
Zatem jądro urządzenia składa się z:
- Upstream: Jądro Linuksa z kernel.org
- AOSP: dodatkowe łatki specyficzne dla systemu Android ze wspólnych jąder AOSP
- Dostawca: poprawki SoC i urządzeń peryferyjnych oraz optymalizacja od dostawców
- OEM/urządzenie: dodatkowe sterowniki urządzeń i dostosowania
Prawie każde urządzenie ma niestandardowe jądro. To jest fragmentacja jądra.
Rysunek 1. Hierarchia jądra Androida prowadzi do fragmentacji
Koszty fragmentacji
Fragmentacja jądra ma kilka negatywnych skutków dla społeczności Androida.
Aktualizacje zabezpieczeń są pracochłonne
Poprawki bezpieczeństwa cytowane w biuletynie Android Security Bulletin (ASB) muszą być przeniesione do każdego jądra urządzenia. Jednak ze względu na fragmentację jądra rozpowszechnianie w terenie poprawek zabezpieczeń na urządzeniach z systemem Android jest niezwykle kosztowne.
Trudne do scalenia długoterminowo obsługiwanych aktualizacji
Wersje LTS (Long-Term Supported) zawierają poprawki bezpieczeństwa i inne krytyczne poprawki błędów. Bycie na bieżąco z wersjami LTS okazało się być najskuteczniejszym sposobem dostarczania poprawek bezpieczeństwa. Na urządzeniach Pixel odkryto, że 90% problemów związanych z bezpieczeństwem jądra zgłoszonych w ASB zostało już naprawionych dla urządzeń, które są aktualne.
Jednak przy wszystkich niestandardowych modyfikacjach w jądrach urządzeń trudno jest po prostu połączyć poprawki LTS z jądrami urządzeń.
Blokuje aktualizacje wersji platformy Android
Fragmentacja utrudnia nowe funkcje Androida wymagające dodawania zmian jądra do urządzeń w terenie. Kod Android Framework musi zakładać, że obsługiwanych jest aż pięć wersji jądra i że nie wprowadzono żadnych zmian jądra dla nowej wersji platformy (Android 10 obsługuje jądra 3.18, 4.4, 4.9, 4.14 i 4.19, które w niektórych przypadkach nie zostały wzbogacony o nowe funkcje od wersji Androida 8 w 2017 r.).
Trudno wprowadzić zmiany jądra z powrotem do pierwotnego systemu Linux
Po wprowadzeniu wszystkich zmian w jądrze większość flagowych urządzeń jest dostarczana z wersją jądra, która ma już co najmniej 18 miesięcy. Na przykład jądro 4.14 zostało wydane przez kernel.org
w listopadzie 2017 roku, a pierwsze telefony z Androidem korzystające z jądra 4.14 zostały wysłane wiosną 2019 roku.
To duże opóźnienie między wydaniem jądra wyższego rzędu a produktami utrudnia społeczności Androida dostarczanie potrzebnych funkcji i sterowników do jądra nadrzędnego.
Naprawianie fragmentacji: ogólny obraz jądra
Projekt Generic Kernel Image (GKI) rozwiązuje fragmentację jądra poprzez ujednolicenie jądra podstawowego i przeniesienie obsługi SoC i płyty z jądra podstawowego do ładowalnych modułów dostawcy. GKI przedstawia również stabilny interfejs modułu jądra (KMI) dla modułów dostawców, dzięki czemu moduły i jądro mogą być aktualizowane niezależnie. Niektóre cechy jądra GKI to:
- Jądro GKI jest zbudowane ze źródeł ACK.
- Jądro GKI jest binarnym pojedynczym jądrem plus powiązane moduły ładowalne na architekturę, na wydanie LTS (obecnie tylko arm64 dla
android11-5.4
iandroid12-5.4
). - Jądro GKI jest testowane ze wszystkimi wersjami platformy Android, które są obsługiwane dla powiązanego pakietu ACK. Nie ma przestarzałych funkcji przez cały okres istnienia wersji jądra GKI.
- Jądro GKI udostępnia sterowniki stabilnego KMI w ramach danego LTS.
- Jądro GKI nie zawiera kodu specyficznego dla SoC lub płyty.
Aby zapoznać się z obrazem architektury GKI, zapoznaj się z przeglądem jądra .
GKI to złożona zmiana, która została wprowadzona w kilku etapach, począwszy od jądra v5.4 w wydaniu platformy Android 11.
Obecnie istnieją dwa etapy GKI:
- GKI 1.0 zostało wprowadzone w systemie Android 11 dla urządzeń z jądrem 5.4. GKI 1.0 dotyczy wszystkich urządzeń dostarczanych z jądrem 5.4, nawet tych z systemem Android 12 lub Android 13.
- GKI 2.0 zostało wprowadzone w systemie Android 12 dla urządzeń z jądrem 5.10 i jest nowym standardem dla wszystkich urządzeń dostarczanych z jądrem 5.10 lub nowszym.
GKI 1.0
W GKI 1.0 urządzenia uruchamiane z jądrem w wersji 5.4 muszą przejść testy GKI (Android 11 i nowsze wersje platformy). Cele GKI 1.0 obejmują:
- Unikaj regresji w Vendor Test Suite (VTS) lub Compatibility Test Suite (CTS) podczas zastępowania jądra produktu jądrem GKI.
- Zmniejsz obciążenie partnera polegające na utrzymywaniu aktualności jądra za pomocą popularnych jąder AOSP.
- Uwzględnij podstawowe zmiany Androida w jądrach dla urządzeń aktualizujących i uruchamianych z nowymi wersjami Androida.
- Nie psuj przestrzeni użytkownika Androida.
- Oddziel komponenty specyficzne dla sprzętu od jądra podstawowego jako moduły ładowalne.
Dokumentację GKI 1.0 można znaleźć w sekcji GKI 1.0 .
GKI 2.0
W GKI 2.0 urządzenia uruchamiane z jądrem w wersji 5.10 lub nowszej muszą być dostarczane z jądrem GKI (począwszy od Androida 12). Podpisane obrazy rozruchowe są dostępne i regularnie aktualizowane za pomocą LTS i poprawek krytycznych błędów. Ponieważ dla KMI zachowana jest stabilność binarna, można zainstalować te obrazy rozruchowe bez wprowadzania zmian w obrazach dostawców. Cele GKI 2.0 obejmują:
- Nie wprowadzaj znaczących regresji wydajności lub mocy podczas zastępowania jądra produktu jądrem GKI.
- Pozwól partnerom dostarczać poprawki bezpieczeństwa jądra i poprawki błędów bez udziału dostawcy.
- Zmniejsz koszt aktualizacji głównej wersji jądra dla urządzeń (na przykład z wersji 5.10 do jądra 2021 LTS).
- Utrzymuj jeden plik binarny jądra GKI na architekturę, aktualizując wersje jądra z przejrzystym procesem aktualizacji.
GKI 2.0 reprezentuje najnowszy stan jąder Androida. Dokumentacja jądra poza podsekcjami jądra GKI 1.0 i poprzednich (<=4.19) odzwierciedla architekturę GKI 2.0.