Na tej stronie opisujemy projekt Generic Kernel Image (GKI) oraz wyjaśniamy, jak zwiększa on stabilność i bezpieczeństwo Androida.
Historia
Każde urządzenie z Androidem wymaga produkcyjnego jądra. Przed wprowadzeniem GKI jądra były niestandardowe i oparte na wspólnym jądrze Androida (ACK), z modyfikacjami wprowadzonymi przez dostawców systemów na chipie (SoC) i producentów OEM.
Ta personalizacja może spowodować, że nawet 50% kodu jądra będzie stanowić kod spoza drzewa, a nie z górnego jądra Linuxa ani ACK. W związku z tym niestandardowy charakter jąder przed GKI spowodował znaczną fragmentację jądra.
Koszty podziału
Fragmentacja jądra ma kilka negatywnych skutków dla społeczności Androida.
Aktualizacje zabezpieczeń wymagają dużo 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 Long-Term Supported (LTS) zawierają poprawki zabezpieczeń i inne ważne poprawki błędów. Utrzymywanie aktualności wersji LTS okazało się najbardziej skutecznym 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ń.
Blokowanie uaktualnień wersji platformy Android
Fragmentacja utrudnia dodawanie nowych funkcji Androida wymagających zmian w rdzeniu na urządzeniach w użyciu. Kod platformy Android Framework musiał uwzględniać różne warianty jądra i nie mógł polegać na nowych funkcjach Androida implementowanych w jądrze. Opóźniało to wprowadzanie innowacji i zwiększyło rozmiar oraz złożoność kodu.
Trudno jest przesłać zmiany jądra do upstream Linuksa
Rozproszony sposób pobierania poprawek do jąder produkcyjnych spowodował opóźnienie do 18 miesięcy od momentu udostępnienia wersji LTS w łańcuchu dostawy do momentu jej wdrożenia na urządzeniu. 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. W czasie, gdy użytkownik przesłał sugestie dotyczące ulepszeń, baza kodu uległa zmianie, przez co trudno było pokazać trafność poprawki.
Rozwiązanie problemu z fragmentacją: ogólny obraz jądra
Projekt Generic Kernel Image (GKI) rozwiązuje problem fragmentacji jądra poprzez ujednolicenie jądra jądra i przeniesienie obsługi SoC i płytki do ładowania z jądra do modułów dostawców. GKI udostępnia też stabilny interfejs Kernel Module Interface (KMI) dla modułów dostawców, dzięki czemu moduły i jądro mogą być aktualizowane niezależnie. Oto niektóre cechy jądra GKI:
- Kernel GKI jest tworzony na podstawie źródeł ACK.
- Kernel GKI to pojedynczy plik binarny jądra wraz z powiązanymi modułami wczytywalnymi na każdą architekturę i wersję LTS.
- Kernel GKI jest testowany ze wszystkimi wersjami platformy Android, które są obsługiwane w powiązanym ACK. W trakcie trwania wersji rdzenia GKI nie wycofujemy funkcji.
- Jądro GKI udostępnia stabilne KMI kierowcom w ramach danego LTS.
- Rdzeń GKI nie zawiera kodu związanego z procesorem SoC ani płytą główną.
Obraz architektury GKI znajdziesz w artykule Omówienie jądra.
Zdjęcie ogólne
W przypadku Androida 12 urządzenia z jądrem w wersji 5.10 lub nowszej muszą być dostarczane z jądrem GKI. Obrazy Generic Kernel Image (GKI) są regularnie aktualizowane i zawierają poprawki LTS oraz poprawki krytycznych błędów. Ponieważ stabilność plików binarnych jest utrzymywana w przypadku KMI, możesz instalować te obrazy rozruchu bez wprowadzania zmian w obrazach dostawcy. Projekt GKI ma następujące cele:
- Nie wprowadzaj znacznych regresji wydajności ani mocy podczas zastępowania jądra produktu jądrem GKI.
- Umożliwianie partnerom dostarczania poprawek zabezpieczeń i poprawek błędów jądra bez udziału dostawcy.
- Zmniejsz koszty aktualizacji głównej wersji jądra na urządzeniach.
- Utrzymywanie pojedynczego binarnego jądra GKI na każdą architekturę przez aktualizowanie wersji jądra za pomocą przejrzystego procesu uaktualniania.