Jądro usługi, nazywane też jądrem urządzenia lub jądrem OEM, to jądro wysyłane do urządzenia. Przed wprowadzeniem GKI jądro produktu było tworzone na podstawie serii zmian w górę. Rysunek 1 przedstawia, jak dodatki jądra tworzą jądro produktu (jądro OEM lub jądro urządzenia):
Rysunek 1. Budowanie jądra produktu przed wprowadzeniem GKI.
- Jądro Linux Long Term Supported (LTS) z kernel.org zostało zmodyfikowane za pomocą poprawek specyficznych dla Androida, co zaowocowało Android Common Kernel (ACK).
- Potwierdzenie zostało zmodyfikowane przez dostawców, którzy dodali obsługę swojego układu SOC. Dostawcy mogą też wprowadzić optymalizacje wydajności lub wydajności. Wynikiem jest jądro dostawcy.
- Na koniec OEM-owie wprowadzili dalsze modyfikacje jądra dostawcy, dodając dodatkowe sterowniki urządzeń i ustawienia, które uznali za konieczne. Powstałe w ten sposób jądro usługi jest nazywane jądrem usługi.
Wszystkie te modyfikacje mogą spowodować, że nawet 50% kodu jądra będzie stanowić kod spoza drzewa, a nie pochodzący z upstreamowych jąder Linuxa lub ACK. Przed wprowadzeniem GKI prawie każde urządzenie miało niestandardowe jądro, co powodowało jego fragmentaryzację.
Koszty podziału
Fragmentacja jądra ma kilka negatywnych skutków dla społeczności Androida.
Aktualizacje zabezpieczeń wymagają dużych nakładów pracy
poprawki bezpieczeństwa wymienione w Informacjach o bezpieczeństwie Androida (ASB) muszą zostać przeniesione do jądra każdego urządzenia. Jednak ze względu na fragmentaryzację jądra rozpowszechnianie poprawek zabezpieczeń na urządzeniach z Androidem w warunkach rzeczywistych jest bardzo kosztowne.
Trudno scalić aktualizacje dotyczące długoterminowego wsparcia
Wersje obsługiwane przez długi czas (LTS) zawierają poprawki zabezpieczeń i inne ważne poprawki błędów. Utrzymywanie aktualności wersji LTS okazało się najskuteczniejszym sposobem na dostarczanie poprawek bezpieczeństwa. Na urządzeniach Pixel wykryliśmy, że 90% problemów z zabezpieczeniami jądra zgłoszonych w ASB zostało już rozwiązanych na urządzeniach, które są aktualne.
Jednak ze względu na wszystkie niestandardowe modyfikacje w jądrach urządzeń trudno jest po prostu scalić poprawki LTS z jądrami urządzeń.
Nie zezwalaj na aktualizacje wersji platformy Androida
Fragmentacja utrudnia nowe funkcje Androida, które wymagają dodawania zmian w jądrze do urządzeń w terenie. Kod Android Framework musi zakładać, że obsługiwanych jest maksymalnie 5 wersji jądra i że w przypadku nowej wersji platformy nie wprowadzono żadnych zmian w jądrze (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 wzbogacone o nowe funkcje od czasu wydania Androida 8 w 2017 r.).
Trudno jest przesłać zmiany jądra do upstream Linuksa
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 r., a pierwsze telefony z Androidem korzystające z jądra 4.14 zostały wprowadzone na rynek w 2019 r.
Długi czas między wydaniem jądra upstream a produktami utrudnia społeczności Androida wprowadzanie potrzebnych funkcji i sterowników do jąder upstream.
Napraw fragmentację: ogólny obraz jądra
Projekt ogólny dla obrazu jądra (GKI) eliminuje fragmentację jądra przez ujednolicenie jądra oraz przeniesienie obsługi układów SOC i płytki z podstawowego jądra do możliwych do załadowania modułów dostawcy. GKI udostępnia również stabilny moduł jądra (KMI) dla modułów dostawców, dzięki czemu moduły i jądro można aktualizować niezależnie. Oto niektóre cechy jądra GKI:
- Kernel GKI jest tworzony na podstawie źródeł ACK.
- Jądro GKI to plik binarny z jednym jądrem wraz z powiązanymi z nim modułami ładowanymi w poszczególnych wersjach LTS (obecnie tylko arm64 w
android11-5.4
iandroid12-5.4
). - Jądro GKI jest testowane ze wszystkimi wersjami platformy Androida, które są obsługiwane w przypadku powiązanego potwierdzenia. Nie można wycofać funkcji przez cały okres istnienia wersji jądra GKI.
- Jądro GKI udostępnia sterownikom w danym kanale LTS stabilną wskaźnik KMI.
- Jądro GKI nie zawiera kodu specyficznego dla układów scalonych ani płytek.
Obraz architektury GKI można znaleźć w omówieniu jądra.
GKI to złożona zmiana, która była wprowadzana etapami, zaczynając od jądra w wersji 5.4 w ramach wersji platformy Android 11.
Istnieją 2 etapy GKI:
- GKI 1.0 zostało wprowadzone w Androidzie 11 na urządzeniach z jądrem 5.4. GKI 1.0 dotyczy wszystkich urządzeń z jądrem systemu 5.4, nawet tych z Androidem 12 lub 13.
- GKI 2.0 zostało wprowadzone w Androidzie 12 na potrzeby urządzeń z jądrem 5.10 i jest nowym standardem dla wszystkich urządzeń z jądrem 5.10 lub nowszym.
GKI 1.0
W GKI 1.0 urządzenia 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 pakiecie testów dostawcy (VTS) lub pakiecie testów zgodności (CTS) podczas zastępowania jądra produktu jądrem GKI.
- Zmniejszenie obciążenia partnerów związanego z utrzymywaniem jądra na bieżąco dzięki wspólnym jądrom AOSP.
- Uwzględnij podstawowe zmiany w jądrze Androida w przypadku uaktualniania urządzeń i wprowadzania ich na rynek w nowych wersjach Androida.
- Nie łam przestrzeni użytkownika Androida.
- oddzielić komponenty związane ze sprzętem od jądra jako wczytywalne moduły.
Dokumentację GKI 1.0 znajdziesz w sekcji GKI 1.0.
GKI 2.0
W GKI 2.0 urządzenia z jądrem w wersji 5.10 lub nowszej muszą być dostarczane z jądrem GKI (począwszy od Androida 12). Podpisane obrazy startowe są dostępne i regularnie aktualizowane o poprawki LTS oraz krytyczne poprawki błędów. Ponieważ stabilność binarna jest zachowana w przypadku KMI, możesz instalować te obrazy rozruchu bez wprowadzania zmian w obrazach dostawcy. Cele GKI 2.0 obejmują:
- Nie wprowadzaj znacznych regresji wydajności ani mocy podczas zastępowania jądra produktu jądrem GKI.
- Umożliw partnerom dostarczanie poprawek zabezpieczeń i poprawek błędów jądra bez udziału dostawcy.
- Zmniejsz koszty aktualizacji głównej wersji jądra na urządzeniach (np. z wersji 5.10 na jądro LTS z 2021 roku).
- Utrzymywanie pojedynczego binarnego jądra GKI na każdą architekturę przez aktualizowanie wersji jądra za pomocą przejrzystego procesu uaktualniania.
GKI 2.0 to najnowsza wersja jądra Androida. Dokumentacja jądra poza sekcją GKI 1.0 i Poprzednie jądra (<=4.19) odzwierciedla architekturę GKI 2.0.