I kernel comuni Android (ACK) sono la base per tutti i kernel dei prodotti Android. I kernel del fornitore e del dispositivo sono a valle degli ACK. I fornitori aggiungono il supporto per SoC e dispositivi periferici modificando il codice sorgente del kernel e aggiungendo driver di dispositivo. Queste modifiche possono essere estese al punto che fino al 50% del codice in esecuzione su un dispositivo è codice out-of-tree e non proviene da Linux upstream o da kernel comuni AOSP.
Pertanto, un kernel di dispositivo è composto da:
- A monte: il kernel Linux da kernel.org
- AOSP: patch aggiuntive specifiche per Android dai kernel comuni AOSP
- Fornitore: SoC e patch di ottimizzazione e abilitazione delle periferiche dei fornitori
- OEM/dispositivo: driver di dispositivo aggiuntivi e personalizzazioni
Quasi ogni dispositivo ha un kernel personalizzato. Questa è la frammentazione del kernel.
Figura 1. La gerarchia del kernel Android porta alla frammentazione
I costi della frammentazione
La frammentazione del kernel ha diversi effetti negativi sulla comunità Android.
Gli aggiornamenti di sicurezza richiedono molto lavoro
Le patch di sicurezza citate nell'Android Security Bulletin (ASB) devono essere trasferite in ciascuno dei kernel del dispositivo. Tuttavia, a causa della frammentazione del kernel, è proibitivo propagare le correzioni di sicurezza ai dispositivi Android sul campo.
Difficile unire gli aggiornamenti supportati a lungo termine
Le versioni Long-Term Supported (LTS) includono correzioni di sicurezza e altre correzioni di bug critici. Rimanere aggiornati con le versioni LTS si è dimostrato il modo più efficace per fornire correzioni di sicurezza. Sui dispositivi Pixel, è stato scoperto che il 90% dei problemi di sicurezza del kernel segnalati nell'ASB era già stato risolto per i dispositivi che rimangono aggiornati.
Tuttavia, con tutte le modifiche personalizzate nei kernel dei dispositivi, è difficile unire semplicemente le correzioni LTS nei kernel dei dispositivi.
Inibisce gli aggiornamenti della versione della piattaforma Android
La frammentazione rende difficile l'aggiunta di nuove funzionalità Android che richiedono modifiche al kernel ai dispositivi sul campo. Il codice di Android Framework deve presumere che siano supportate fino a cinque versioni del kernel e che non siano state apportate modifiche al kernel per la nuova versione della piattaforma (Android 10 supporta i kernel 3.18, 4.4, 4.9, 4.14 e 4.19, che in alcuni casi non sono stati migliorato con nuove funzionalità da Android 8 nel 2017).
Difficile contribuire con le modifiche del kernel a Linux upstream
Con tutte le modifiche apportate al kernel, la maggior parte dei dispositivi di punta viene fornita con una versione del kernel che ha già almeno 18 mesi. Ad esempio, il kernel 4.14 è stato rilasciato da kernel.org
nel novembre del 2017 e i primi telefoni Android che utilizzano kernel 4.14 sono stati spediti nella primavera del 2019.
Questo lungo ritardo tra il rilascio del kernel a monte e i prodotti rende difficile per la comunità Android inserire le funzionalità ei driver necessari nei kernel a monte.
Correzione della frammentazione: immagine kernel generica
Il progetto Generic Kernel Image (GKI) affronta la frammentazione del kernel unificando il core kernel e spostando SoC e supporto della scheda dal core kernel in moduli caricabili del fornitore. GKI presenta anche una Kernel Module Interface (KMI) stabile per i moduli dei fornitori, in modo che i moduli e il kernel possano essere aggiornati in modo indipendente. Alcune caratteristiche del kernel GKI sono:
- Il kernel GKI è costruito dai sorgenti ACK.
- Il kernel GKI è un binario a kernel singolo più moduli caricabili associati per architettura, per versione LTS (attualmente solo arm64 per
android11-5.4
eandroid12-5.4
). - Il kernel GKI viene testato con tutte le versioni della piattaforma Android supportate per l'ACK associato. Non è prevista alcuna deprecazione delle funzionalità per la durata di una versione del kernel GKI.
- Il kernel GKI espone un KMI stabile ai driver all'interno di un determinato LTS.
- Il kernel GKI non contiene codice specifico del SoC o della scheda.
Per un'immagine dell'architettura GKI, fare riferimento alla panoramica del kernel .
GKI è una modifica complessa che è stata implementata in più fasi a partire dai kernel v5.4 nella versione della piattaforma Android 11.
Attualmente ci sono due fasi GKI:
- GKI 1.0 è stato introdotto in Android 11 per dispositivi con kernel 5.4. GKI 1.0 si applica a tutti i dispositivi forniti con kernel 5.4, anche quelli lanciati con Android 12 o Android 13.
- GKI 2.0 è stato introdotto in Android 12 per dispositivi con kernel 5.10 ed è il nuovo standard per tutti i dispositivi forniti con kernel 5.10 o successivi.
GKI 1.0
In GKI 1.0, i dispositivi avviati con la versione del kernel 5.4 devono superare i test GKI (Android 11 e versioni successive della piattaforma). Gli obiettivi di GKI 1.0 includono quanto segue:
- Evitare le regressioni in Vendor Test Suite (VTS) o Compatibility Test Suite (CTS) quando si sostituisce il kernel del prodotto con il kernel GKI.
- Riduci l'onere del partner di mantenere aggiornato il proprio kernel con i kernel comuni AOSP.
- Includi le modifiche di base di Android nei kernel per l'aggiornamento e l'avvio dei dispositivi con le nuove versioni di Android.
- Non interrompere lo spazio utente di Android.
- Separare i componenti specifici dell'hardware dal core kernel come moduli caricabili.
Per la documentazione di GKI 1.0, vedere la sezione GKI 1.0 .
GKI 2.0
In GKI 2.0, i dispositivi avviati con la versione del kernel 5.10 o successiva devono essere forniti con il kernel GKI (a partire da Android 12). Le immagini di avvio firmate sono disponibili e aggiornate regolarmente con LTS e correzioni di bug critici. Poiché la stabilità binaria viene mantenuta per KMI, è possibile installare queste immagini di avvio senza apportare modifiche alle immagini del fornitore. Gli obiettivi di GKI 2.0 includono quanto segue:
- Non introdurre prestazioni significative o regressioni di potenza quando si sostituisce il kernel del prodotto con il kernel GKI.
- Consenti ai partner di fornire correzioni di sicurezza del kernel e correzioni di bug senza il coinvolgimento del fornitore.
- Riduci il costo dell'aggiornamento della versione principale del kernel per i dispositivi (ad esempio, dalla v5.10 al kernel LTS 2021).
- Mantenere un singolo binario del kernel GKI per architettura aggiornando le versioni del kernel con un processo chiaro per l'aggiornamento.
GKI 2.0 rappresenta lo stato più attuale dei kernel Android. La documentazione del kernel al di fuori delle sottosezioni GKI 1.0 e kernel precedenti (<=4.19) riflette l'architettura GKI 2.0.