Il progetto Generic Kernel Image (GKI).

Un kernel del prodotto , noto anche come kernel del dispositivo o kernel OEM , è il kernel fornito sul tuo dispositivo. Prima di GKI, il kernel del prodotto derivava da una serie di modifiche del kernel upstream. La Figura 1 mostra come le aggiunte del kernel producono un kernel del prodotto (kernel OEM/dispositivo):

Costruzione del kernel del prodotto pre-GKI

Figura 1. Costruzione del kernel del prodotto pre-GKI.

  1. Il kernel Linux Long Term Supported (LTS) di kernel.org è stato modificato con patch specifiche per Android, risultando in un Android Common Kernel (ACK) .
  2. L'ACK è stato modificato dai fornitori che hanno aggiunto il supporto per il loro System-on-a-Chip (SoC). I fornitori potrebbero anche aggiungere ottimizzazioni di prestazioni o potenza. Il kernel risultante è chiamato kernel del fornitore .
  3. Infine, il kernel del fornitore è stato ulteriormente modificato dagli OEM con driver di dispositivo aggiuntivi e personalizzazioni ritenute necessarie. Il kernel risultante è chiamato kernel del prodotto .

Tutte queste modifiche possono far sì che fino al 50% del codice del kernel sia codice esterno all'albero e non proveniente da kernel Linux o ACK upstream. Prima della GKI, quasi tutti i dispositivi avevano un kernel personalizzato che provocava la frammentazione del kernel.

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 sottoposte a backport in ciascuno dei kernel del dispositivo. Tuttavia, a causa della frammentazione del kernel, è proibitivamente costoso propagare le correzioni di sicurezza ai dispositivi Android sul campo.

Difficile unire gli aggiornamenti supportati a lungo termine

Le versioni supportate a lungo termine (LTS) includono correzioni di sicurezza e altre correzioni di bug critici. Rimanere aggiornati con le versioni LTS si è rivelato il modo più efficace per fornire soluzioni di sicurezza. Sui dispositivi Pixel, si è scoperto che il 90% dei problemi di sicurezza del kernel segnalati nell'ASB erano già stati risolti per i dispositivi che rimangono aggiornati.

Tuttavia, con tutte le modifiche personalizzate nei kernel del dispositivo, è difficile semplicemente unire le correzioni LTS nei kernel del dispositivo.

Inibisce gli aggiornamenti delle versioni della piattaforma Android

La frammentazione rende difficile l’aggiunta ai dispositivi sul campo delle nuove funzionalità Android che richiedono modifiche al kernel. Il codice di Android Framework deve presupporre 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à a partire da Android 8 nel 2017).

Difficile riportare le modifiche del kernel al 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 utilizzavano i kernel 4.14 sono stati spediti nella primavera del 2019.

Questo lungo ritardo tra il rilascio del kernel upstream e i prodotti rende difficile per la comunità Android inserire le funzionalità e i driver necessari nei kernel upstream.

Correzione della frammentazione: immagine kernel generica

Il progetto Generic Kernel Image (GKI) affronta la frammentazione del kernel unificando il kernel principale e spostando il SoC e il supporto della scheda dal kernel principale in moduli caricabili del fornitore. GKI presenta anche un'interfaccia Kernel Module (KMI) stabile per i moduli dei fornitori, in modo che moduli e 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 e android12-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 tutta la durata di una versione del kernel GKI.
  • Il kernel GKI espone un KMI stabile ai driver all'interno di un dato 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 è un cambiamento complesso implementato in diverse 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 i 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 i 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 5.4 del kernel devono superare i test GKI (Android 11 e versioni successive della piattaforma). Gli obiettivi di GKI 1.0 includono quanto segue:

  • Evita 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 per i partner di mantenere aggiornato il kernel con i kernel comuni AOSP.
  • Includere le modifiche principali di Android nei kernel per l'aggiornamento e l'avvio dei dispositivi con le nuove versioni di Android.
  • Non interrompere lo spazio utente Android.
  • Separare i componenti specifici dell'hardware dal kernel principale come moduli caricabili.

Per la documentazione di GKI 1.0, consulta 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é per KMI viene mantenuta la stabilità binaria, è 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 i costi di aggiornamento della versione principale del kernel per i dispositivi (ad esempio, dalla versione v5.10 al kernel LTS 2021).
  • Mantieni un unico file 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 esterna alle sottosezioni GKI 1.0 e Kernel precedenti (<=4.19) riflette l'architettura GKI 2.0.