Na tej stronie opisujemy projekt Generic Kernel Image (GKI) oraz sposób, w jaki zwiększa on stabilność Androida i poprawia bezpieczeństwo.
Historia
Każde urządzenie z Androidem potrzebuje jądra produkcyjnego. Przed wprowadzeniem GKI jądra były niestandardowe i oparte na Android Common Kernel (ACK), a zmiany specyficzne dla urządzenia były wprowadzane przez dostawców układów SoC i producentów OEM.
Ta personalizacja mogła spowodować, że nawet 50% kodu jądra było kodem spoza drzewa, a nie pochodziło z jądra Linux ani z ACK. W związku z tym niestandardowy charakter jąder sprzed GKI powodował znaczną fragmentację jądra.
Koszty fragmentacji
Fragmentacja jądra ma kilka negatywnych skutków dla społeczności Androida.
Aktualizacje zabezpieczeń są pracochłonne
Poprawki zabezpieczeń wymienione w Biuletynie bezpieczeństwa w Androidzie (ASB) muszą zostać przeniesione do każdego jądra urządzenia. Ze względu na fragmentację jądra propagowanie poprawek zabezpieczeń na urządzeniach z Androidem jest jednak zbyt kosztowne.
Trudno jest scalać aktualizacje z długoterminowym wsparciem
Wersje z długoterminowym wsparciem (LTS) zawierają poprawki zabezpieczeń i inne krytyczne poprawki błędów. Aktualizowanie wersji LTS okazało się najskuteczniejszym sposobem na dostarczanie poprawek zabezpieczeń. Na urządzeniach Pixel stwierdzono, ż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ń.
Uniemożliwia uaktualnianie wersji platformy Android
Fragmentacja utrudnia dodawanie do urządzeń nowych funkcji Androida, które wymagają zmian w jądrze. Kod platformy Android musiał uwzględniać różne wersje jądra i nie mógł polegać na tym, że nowe funkcje Androida zostaną zaimplementowane w jądrze. Spowolniło to innowacje i spowodowało zwiększenie rozmiaru i złożoności kodu.
Trudno jest przesyłać zmiany w jądrze do upstream Linux
Fragmentacja sposobu wprowadzania poprawek do jąder produkcyjnych powodowała opóźnienie nawet o 18 miesięcy od momentu, gdy wersja LTS była dostępna w upstream, do momentu, gdy była dostępna na urządzeniu. Tak długie opóźnienie między wydaniem jądra upstream a produktami utrudnia społeczności Androida wprowadzanie potrzebnych funkcji i sterowników do jąder upstream. Zanim użytkownik przesłał sugestie dotyczące ulepszeń, baza kodu uległa zmianie, co utrudniało wykazanie istotności poprawki.
Rozwiązanie problemu fragmentacji: Generic Kernel Image
Projekt Generic Kernel Image (GKI) rozwiązuje problem fragmentacji jądra przez ujednolicenie jądra głównego i przeniesienie obsługi układów SoC i płyt głównych z jądra głównego do modułów dostawcy, które można wczytywać. GKI udostępnia też stabilny interfejs modułu jądra (KMI) dla modułów dostawcy, dzięki czemu moduły i jądro można aktualizować niezależnie. Oto niektóre cechy jądra GKI:
- Jądro GKI jest tworzone na podstawie źródeł ACK.
- Jądro GKI to pojedynczy plik binarny jądra oraz powiązane z nim moduły, które można wczytywać, dla każdej architektury i każdej wersji LTS.
- Jądro GKI jest testowane ze wszystkimi wersjami platformy Android, które są obsługiwane przez powiązany ACK. W okresie eksploatacji wersji jądra GKI nie ma wycofywania funkcji.
- Jądro GKI udostępnia sterownikom w ramach danego LTS stabilny KMI.
- Jądro GKI nie zawiera kodu specyficznego dla układu SoC ani płyty głównej.
Obraz architektury GKI znajdziesz w artykule Omówienie jądra.
Wspólny obraz
Od Androida 12 urządzenia dostarczane z wersją jądra 5.10 lub nowszą muszą być dostarczane z jądrem GKI. Wersje Generic Kernel Image (GKI) są regularnie aktualizowane o poprawki LTS i krytyczne poprawki błędów. Ponieważ stabilność binarna jest zachowana w przypadku KMI, możesz instalować te obrazy rozruchowe bez wprowadzania zmian w obrazach dostawcy. Projekt GKI ma te cele:
- Nie wprowadzać znaczących regresji wydajności ani zużycia energii podczas zastępowania jądra produktu jądrem GKI.
- Umożliwić partnerom dostarczanie poprawek zabezpieczeń jądra i poprawek błędów bez udziału dostawcy.
- Zmniejszyć koszty aktualizacji głównej wersji jądra na urządzeniach.
- Utrzymywać pojedynczy plik binarny jądra GKI na architekturę, aktualizując wersje jądra za pomocą przejrzystego procesu aktualizacji.