Kernel comuni di Android

I kernel comuni AOSP (noti anche come kernel comuni Android o ACK) sono derivati dai kernel di kernel.org e includono patch di interesse per la community Android che non sono state unite ai kernel principali o LTS (supportati a lungo termine). Questi patch possono includere:

  • Backport e cherry-pick delle funzionalità upstream necessarie per le funzionalità di Android
  • Funzionalità pronte per i dispositivi Android, ma ancora in fase di sviluppo a monte
  • Funzionalità di fornitori/OEM utili per altri partner dell'ecosistema

android-mainline è il ramo di sviluppo principale delle funzionalità Android. La versione principale di Linux viene unita a android-mainline ogni volta che Linus Torvalds pubblica una release o una release candidate. Prima del 2019, i kernel comuni di Android venivano creati clonando il kernel LTS dichiarato di recente e aggiungendo patch specifiche per Android. Questo processo è cambiato nel 2019 per suddividere il nuovo kernel comune di Android da android-mainline. Questo nuovo modello evita l'impegno significativo necessario per inoltrare le patch di Android e testarle ottenendo lo stesso risultato in modo incrementale. android-mainline viene sottoposto a test continui significativi, questo modello garantisce un kernel di alta qualità dal giorno in cui viene pubblicato.

Quando viene dichiarato un nuovo LTS in upstream, il kernel comune corrispondente viene derivato da android-mainline. In questo modo, i partner possono iniziare un progetto prima della dichiarazione della versione LTS, eseguendo l'unione da android-mainline. Dopo aver creato il nuovo ramo del kernel comune, i partner possono modificare l'origine dell'unione nel nuovo ramo senza problemi.

Gli altri rami del kernel comuni ricevono unioni regolari dal kernel LTS associato. In genere queste unioni vengono eseguite immediatamente dopo la pubblicazione della release LTS. Ad esempio, quando è stato pubblicato Linux 6.1.75, è stato unito al kernel comune 6.1 (android14-6.1). I partner sono vivamente invitati ad aggiornare i propri kernel per rimanere al passo con le correzioni dei bug LTS e specifiche per Android.

Ramo del kernel KMI ACK

I kernel GKI hanno un'interfaccia del modulo kernel stabile. Il KMI è identificato in modo univoco dalla versione del kernel e dalla release della piattaforma Android, pertanto i branch sono denominati ANDROID_RELEASE-KERNEL_VERSION. Ad esempio, il kernel GKI 6.1 per Android 14 si chiama android14-6.1. Per Android 15 è stato introdotto il kernel GKI android15-6.6.

Inserire e avviare i kernel

Prima di Android 15, per il lancio del dispositivo poteva essere utilizzato uno dei tre kernel più recenti. A partire da Android 15, le due versioni del kernel più recenti possono essere utilizzate per il lancio del dispositivo. I kernel di lancio per Android 15 sono android15-6.6 e android14-6.1.

Poiché gli upgrade dei kernel non sono necessari quando si aggiorna la release della piattaforma, i kernel privi delle ultime funzionalità per una release della piattaforma possono comunque essere utilizzati per avviare i dispositivi. Pertanto, i kernel progettati per Android 14, come android14-6.1, possono essere utilizzati sui dispositivi anche dopo l'upgrade della release della piattaforma ad Android 15.

Release della piattaforma Android Avvia i kernel Kernel delle funzionalità
Android 15 (2024) android15-6.6
android14-6.1
android15-6.6
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

1 Potrebbero essere applicate ulteriori limitazioni se il BSP associato è stato aggiornato per la release della piattaforma. In termini più generali, il numero della release di Android del kernel deve essere maggiore o uguale alla versione FCM target. Per maggiori dettagli, consulta Oggetto interfaccia del fornitore: corrispondenza dei rami del kernel.

Gerarchia del kernel comune

Ramo da android-mainline

Il livello più alto della gerarchia comune del kernel è mostrato nella Figura 1.

Creazione di kernel comuni dal kernel android-mainline

Figura 1. Creazione di kernel comuni dal kernel android-mainline

Tieni presente che nel 2022 è stato creato un nuovo kernel Android common android14-6.1 da android-mainline. Nel 2023, quando è stato dichiarato il successivo LTS, android15-6.6 è stato diramato da android-mainline.

Come mostrato nella Figura 1, ogni versione del kernel può essere la base di due kernel GKI. Ad esempio, i due kernel v5.15 sono android13-5.15 e android14-5.15, entrambi sono kernel delle funzionalità per le rispettive release della piattaforma. Lo stesso accadeva anche per la 5.10; android12-5.10 è stata creata quando è stata dichiarata la versione LTS e android13-5.10 è stata creata da android12-5.10 al traguardo del completamento delle funzionalità del kernel in primavera 2021 per consentire lo sviluppo di funzionalità per Android 13. A partire da Android 15 (2024), è presente un solo nuovo kernel GKI per versione del kernel (non è presente un kernel android15-6.1).

Ciclo di vita ramo ACK KMI

Il ciclo di vita di un ramo KMI ACK è mostrato di seguito nella Figura 2.

6.6 Ciclo di vita del ramo KMI di ACK

Figura 2. 6.6 Ciclo di vita del ramo KMI di ACK

Per chiarire il processo di sviluppo e il ciclo di vita dei branch, la Figura 2 si concentra sui branch KMI di ACK per 6.6.

Ogni ramo KMI ACK passa attraverso tre fasi indicate nella Figura 2 con colori diversi in ogni ramo. Come mostrato, LTS viene unito regolarmente indipendentemente dalla fase.

Fase di sviluppo

Una volta creato, un ramo KMI ACK entra nella fase di sviluppo (etichettata come dev nella Figura 2) ed è aperto ai contributi delle funzionalità per la successiva release della piattaforma Android. Nella Figura 2, android15-6.6 è stato creato quando la versione 6.6 è stata dichiarata come nuovo kernel LTS upstream.

Fase di stabilizzazione

Quando il ramo KMI di ACK viene dichiarato completo, entra nella fase di stabilizzazione (contrassegnata come stabile nella Figura 2). Le funzionalità dei partner e le correzioni di bug sono ancora accettate, ma il monitoraggio KMI è abilitato per rilevare eventuali modifiche che influiscono sull'interfaccia. In questa fase, vengono accettate modifiche che provocano un errore nei KMI e la definizione dei KMI viene aggiornata con una cadenza predefinita (di solito ogni due settimane). Consulta la panoramica di GKI per informazioni dettagliate sul monitoraggio dei KMI.

Fase di blocco del KMI

Prima che una nuova release della piattaforma venga inviata ad AOSP, il ramo KMI di ACK viene congelato e rimane tale per tutta la durata del ramo. Ciò significa che non vengono accettate modifiche che causano interruzioni del KMI, a meno che non venga identificato un grave problema di sicurezza che non può essere mitigato senza influire sul KMI stabile. Per evitare interruzioni del KMI, alcune patch unite dall'LTS potrebbero essere modificate o eliminate se la correzione non è necessaria per i dispositivi Android.

Quando un ramo KMI ACK è bloccato, le correzioni di bug e le funzionalità dei partner possono essere accettate purché il kernel comune KMI esistente non funzioni. Il KMI può essere esteso con nuovi simboli esportati, a condizione che le interfacce che compongono il KMI attuale non siano interessate. Quando vengono aggiunte nuove interfacce al KMI, diventano immediatamente stabili e non possono essere interrotte da modifiche future.

Ad esempio, una modifica che aggiunge un campo a una struttura utilizzata da un kernel comune dell'interfaccia KMI non è consentita perché cambia la definizione dell'interfaccia:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

Tuttavia, l'aggiunta di una nuova funzione è consentita:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

Per tutta la durata del kernel GKI, viene mantenuta la compatibilità con le versioni precedenti con lo spazio utente, in modo che il kernel possa essere usato in sicurezza per la release della piattaforma Android con cui è stato lanciato il dispositivo. I test continui con le release precedenti garantiscono il mantenimento della compatibilità. Pertanto, nella Figura 2, il kernel android15-6.6 può essere utilizzato per dispositivi Android 15 e versioni successive. Poiché la release della piattaforma Android è compatibile anche con le versioni precedenti, è possibile utilizzare il kernel android14-6.1 per i dispositivi Android 15 per il lancio o l'upgrade.

Numero di generazione del KMI

Se durante la fase di stabilizzazione si verifica un'unione LTS o un problema di sicurezza o un altro evento che richiede l'accettazione di una patch che modifica il KMI, il numero di generazione del KMI registrato in build.config.common viene incrementato. La generazione KMI corrente può essere trovata utilizzando il comando uname:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

Il numero dopo il rilascio della piattaforma è la generazione KMI (in questo caso 6).

Se la generazione dei KMI cambia, il kernel non è compatibile con i moduli del fornitore conformi alla precedente generazione di KMI, quindi i moduli devono essere ricreati e aggiornati in modo sincrono con il kernel. Dopo il blocco dei KMI, le modifiche alla generazione dei KMI dovrebbero essere molto rare.

Compatibilità tra i kernel

I requisiti di compatibilità tra i kernel della stessa famiglia LTS stanno cambiando a partire dai nuovi kernel GKI.

Kernel GKI

I kernel GKI mantengono la compatibilità con le versioni precedenti di tutte le release della piattaforma Android che supportavano la versione del kernel. Inoltre, le release della piattaforma Android sono compatibili con le versioni precedenti dei kernel GKI delle release precedenti. Pertanto, puoi utilizzare in sicurezza il kernel android14-6.1 sviluppato per Android 14 (2023) sui dispositivi con Android 15 (2024). La compatibilità viene verificata tramite test VTS e CTS continui dei kernel GKI con tutte le release supportate.

Il KMI è stabile, pertanto il kernel può essere aggiornato senza richiedere una ricostruzione degli eventuali moduli del kernel nell'immagine del fornitore.

La compatibilità KMI non viene mantenuta tra i diversi kernel GKI. Ad esempio, un kernel android14-6.1 non può essere sostituito con un kernel android15-6.6 senza ricostruire tutti i moduli.

I kernel GKI sono supportati solo per le release iniziali e successive. Non sono supportati per le release precedenti. Pertanto, un kernel android15-6.6 non è supportato per i dispositivi con Android 14 (2023).

Matrice di compatibilità

Questa tabella mostra le versioni del kernel supportate e testate con ogni release della piattaforma Android.

Release della piattaforma Android Kernel supportati per l'upgrade Kernel supportati per il lancio
Android 15 (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android15-6.6
android14-6.1
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

Supporta le patch di sicurezza e le durate

Gli ACK ricevono le unioni LTS dall'upstream e le correzioni di bug per il codice specifico di Android. Queste correzioni includono tutte le patch di sicurezza del kernel citate nei Bollettini sulla sicurezza di Android mensili pertinenti per ACK.

Gli ACK potrebbero essere supportati per più tempo rispetto al kernel stabile upstream corrispondente su kernel.org. In questo caso, Google fornisce assistenza estesa fino alla data di fine del ciclo di vita indicata in questa sezione. Quando i kernel sono EOL, non sono più supportati da Google e i dispositivi che li eseguono sono considerati vulnerabili.

A partire dal kernel 6.6, il ciclo di vita del supporto per i kernel stabili è di 4 anni.

Questa tabella mostra le durate degli ACK supportati:

Ramo ACK Data di
lancio
Supporto
a vita
(anni)
EOL
android-4.19-stabile 2018-10-22 6 2025-01-01
android11-5.4 2019-11-24 6 2026-01-01
Android 12-5.4 2019-11-24 6 2026-01-01
android12-5.10 2020-12-13 6 2027-07-01
android13-5.10 2020-12-13 6 2027-07-01
android13-5.15 2021-10-31 6 2028-07-01
android14-5.15 2021-10-31 6 2028-07-01
android14-6.1 2022-12-11 6 2029-07-01
android15-6.6 2023-10-29 4 2028-07-01

Test comuni del kernel

I kernel comuni vengono testati con diversi sistemi CI, oltre ai test a valle eseguiti dai fornitori.

Test funzionale del kernel Linux

I test Linux Kernel Functional Test (LKFT) avviano varie suite di test, tra cui kselftest, LTP, VTS e CTS, su un insieme di dispositivi fisici ARM32 e ARM64. I risultati dei test recenti sono disponibili qui.

Test KernelCI

I test di build e avvio KernelCI vengono avviati ogni volta che viene eseguito il commit di una nuova patch in un ramo del kernel comune. Diverse centinaia di configurazioni di build vengono testate e avviate su varie schede. I risultati recenti per i kernel Android sono disponibili qui.

Test pre-submit e post-submit di Android

I test di preinvio vengono utilizzati per evitare l'introduzione di errori nei kernel comuni di Android. Il riepilogo dei risultati del test è disponibile nella scheda "Controlli" della modifica del codice in Android Common Kernel Gerrit.

I test post-invio di Android vengono eseguiti su nuove build pubblicate nei rami del kernel comune di Android quando vengono eseguiti commit di nuove patch in un ramo del kernel comune di Android in ci.android.com. Inserendo aosp_kernel come nome parziale del ramo in ci.android.com, viene visualizzato un elenco di rami del kernel con risultati disponibili. Ad esempio, i risultati per android-mainline sono disponibili qui. Quando fai clic su una determinata build, troverai lo stato del test nella scheda Test Results.

I test definiti da test-mapping con il gruppo di test kernel-presubmit nella struttura della sorgente della piattaforma Android verranno eseguiti come pre-submit per i branch del kernel di Android. Ad esempio, la seguente configurazione in test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING attiverà vts_kernel_proc_file_api_test come test di presbumit al check-in del codice del kernel comune di Android.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

Test zero-day

Il test di 0 giorni esegue test patch per patch su tutti i rami del kernel comuni di Android quando vengono confermate nuove patch. Vengono eseguiti vari test di avvio, funzionali e di prestazioni. Unisciti al gruppo pubblico cros-kernel-buildreports

Matrice di test

Kernel comune Android Release della piattaforma Android Suite di test
Principale 15 14 13 12 11 10 LKFT CI kernel Prima dell'invio Post-invio zero-day
android-mainline
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable

Contribuisci ai kernel comuni di Android

In genere, lo sviluppo delle funzionalità deve essere eseguito sui sistemi Linux principali e non sui kernel comuni Android. Lo sviluppo upstream è fortemente incoraggiato e, una volta accettato lo sviluppo, può essere facilmente sottoposto a backporting al ramo ACK specifico, se necessario. Il team del kernel di Android è felice di supportare le attività di upstreaming a beneficio dell'ecosistema Android.

Invia le patch a Gerrit e rispetta queste linee guida per i contributi.