Progetto immagine kernel generica (GKI)

Un kernel del prodotto, noto anche come kernel del dispositivo o kernel OEM, è il kernel che spedisci sul dispositivo. Prima di GKI, il kernel del prodotto era da una serie di modifiche upstream del kernel. La Figura 1 mostra come le aggiunte al kernel generano un kernel del prodotto (kernel OEM/del dispositivo):

Costruzione del kernel del prodotto precedente a GKI

Figura 1. Costruzione del kernel del prodotto precedente a GKI.

  1. Il kernel Linux Long Term Supported (LTS) di kernel.org è stato modificato con patch specifiche per Android, dando vita a un Android Common Kernel (ACK).
  2. L'ACK è stato modificato dai fornitori che hanno aggiunto il supporto per il proprio sistema su 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 dispositivi e personalizzazioni aggiuntivi ritenuti necessari. Il kernel risultante è chiamato kernel del prodotto.

Tutte queste modifiche possono comportare che fino al 50% del codice del kernel sia out-of-tree e non provenga da kernel Linux o ACK upstream. Prima di GKI, quasi tutti i dispositivi avevano un kernel personalizzato che causava la frammentazione del kernel.

Costi della frammentazione

La frammentazione del kernel ha diversi effetti negativi sulla community Android.

Gli aggiornamenti della sicurezza richiedono molto lavoro

Le patch di sicurezza citate nel Android Security Bulletin (ASB) devono essere sottoposte a backport in ogni 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 con il supporto a lungo termine

Le release con assistenza a lungo termine (LTS) includono correzioni di bug di sicurezza e altre correzioni di bug critiche. Mantenersi al passo con le release LTS si è dimostrato il modo più efficace per fornire correzioni di sicurezza. Sui 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 del dispositivo, è difficile unire le correzioni LTS nei kernel del dispositivo.

Impedire gli upgrade delle release della piattaforma Android

La frammentazione rende difficile l'aggiunta di nuove funzionalità di Android che richiedono modifiche al kernel ai dispositivi sul campo. Il codice del framework Android deve assumere che sono supportate fino a cinque versioni del kernel e che non sono state apportate modifiche al kernel per la nuova release 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 migliorati con nuove funzionalità dal 2017, anno del rilascio di Android 8).

Difficile contribuire alle modifiche del kernel nella versione upstream di Linux

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 a novembre 2017 e i primi smartphone Android che utilizzano 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 community Android inserire le funzionalità e i driver necessari nei kernel upstream.

Correggi la frammentazione: immagine del kernel generica

Il progetto Generic Kernel Image (GKI) risolve la frammentazione del kernel unificando il kernel di base e spostando il supporto di SoC e schede dal kernel di base in moduli del fornitore caricabili. GKI presenta anche un'interfaccia di Modulo del kernel (KMI) stabile per i moduli del fornitore, in modo che i moduli e il kernel possano essere aggiornati in modo indipendente. Alcune caratteristiche del kernel GKI sono:

  • Il kernel GKI viene compilato dalle sorgenti ACK.
  • Il kernel GKI è un binario a kernel singolo più i moduli caricabili associati per architettura e per release LTS (attualmente solo arm64 per android11-5.4 e android12-5.4).
  • Il kernel GKI viene testato con tutte le release della piattaforma Android supportate per l'ACK associato. Non è prevista la ritiro delle funzionalità per l'intera vita utile 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 per il SoC o per la scheda.

Per un'immagine dell'architettura GKI, consulta la Panoramica del kernel.

GKI è una modifica complessa che è stata implementata in più fasi a partire dai kernel v5.4 nella release della piattaforma Android 11.

Esistono 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 spediti con kernel 5.4, anche a quelli avviati 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 che vengono forniti con kernel 5.10 o successivi.

GKI 1.0

In GKI 1.0, i dispositivi lanciati con la versione del kernel 5.4 devono superare i test GKI (release della piattaforma Android 11 e successive). Gli obiettivi GKI 1.0 includono:

  • Evita le regressioni nella Vendor Test Suite (VTS) o nella Compatibility Test Suite (CTS) quando sostituisci il kernel del prodotto con il kernel GKI.
  • Riduci il carico dei partner che devono tenere aggiornato il proprio kernel con i kernel comuni AOSP.
  • Includi le modifiche di Android di base nei kernel per i dispositivi di cui viene eseguito l'upgrade e che vengono lanciati con le nuove release di Android.
  • Non danneggiare lo spazio utente di Android.
  • Separa i componenti specifici dell'hardware dal kernel di base 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 che vengono lanciati con il kernel 5.10 o versioni successive 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 critiche. Poiché la stabilità binaria viene mantenuta per il KMI, puoi installare queste immagini di avvio senza apportare modifiche alle immagini del fornitore. Gli obiettivi di GKI 2.0 includono quanto segue:

  • Non introdurre regressioni significative delle prestazioni o dell'alimentazione quando sostituisci il kernel del prodotto con il kernel GKI.
  • Consente ai partner di fornire correzioni di bug e correzioni di sicurezza del kernel senza 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).
  • Gestisci un singolo file binario del kernel GKI per architettura aggiornando le versioni del kernel con una procedura chiara per l'upgrade.

GKI 2.0 rappresenta lo stato più recente dei kernel Android. La documentazione del kernel al di fuori delle sezioni GKI 1.0 e Kernel precedenti (<=4.19) riflette l'architettura GKI 2.0.