Kernel comuni di Android

I kernel comuni AOSP (noti anche come kernel comuni Android o ACK ) sono a valle dei kernel kernel.org e includono patch di interesse per la comunità Android che non sono state unite nei kernel principali o supportati a lungo termine (LTS). Queste patch possono includere:

  • Backport e selezione delle funzionalità upstream necessarie per le funzionalità Android
  • Funzionalità pronte per i dispositivi Android ma ancora in fase di sviluppo a monte (ad esempio, ottimizzazioni del posizionamento delle attività di Energy Aware Scheduler).
  • Funzionalità del fornitore/OEM utili per altri partner dell'ecosistema (ad esempio, sdcardfs).

android-mainline è il ramo di sviluppo principale per le funzionalità Android. La linea principale di Linux viene unita alla android-mainline ogni volta che Linus Torvalds pubblica un rilascio o un candidato al rilascio. Prima del 2019, i kernel comuni Android venivano costruiti clonando il kernel LTS recentemente dichiarato e aggiungendo patch specifiche per Android. Questo processo è cambiato nel 2019 per ramificare il nuovo kernel comune Android da android-mainline . Questo nuovo modello evita lo sforzo significativo di eseguire il port forwarding e testare le patch Android ottenendo lo stesso risultato in modo incrementale. android-mainline è sottoposto a test continui e significativi, questo modello garantisce un kernel di alta qualità dal giorno in cui viene pubblicato.

Quando un nuovo LTS viene dichiarato a monte, il kernel comune corrispondente viene ramificato da android-mainline . Ciò consente ai partner di iniziare un progetto prima della dichiarazione della versione LTS, unendosi da android-mainline . Dopo aver creato il nuovo ramo del kernel comune, i partner possono modificare senza problemi l'origine dell'unione nel nuovo ramo.

Altri rami comuni del kernel ricevono fusioni regolari dal kernel LTS associato. Queste unioni vengono normalmente eseguite immediatamente dopo la pubblicazione del rilascio LTS. Ad esempio, quando è stato pubblicato Linux 4.19.64, è stato unito ai kernel comuni 4.19 (ad esempio, android-4.19-q ). I partner sono fortemente incoraggiati a unire regolarmente i kernel comuni ai kernel dei loro prodotti per rimanere aggiornati con LTS e correzioni di bug specifiche di Android.

ACK ramo del kernel KMI

I kernel GKI hanno un'interfaccia del modulo kernel stabile. Il KMI è identificato in modo univoco dalla versione del kernel e dalla versione della piattaforma Android, quindi i rami sono denominati <androidRelease>-<kernel version> . Ad esempio, il kernel GKI 5.4 per Android 11 si chiama android11-5.4. Per Android 12 sono disponibili due kernel GKI aggiuntivi, android12-5.4 e android12-5.10 .

Rami legacy del kernel del dessert

I kernel dessert legacy sono stati creati per garantire che lo sviluppo di nuove funzionalità non interferisse con la fusione dal kernel comune di Android. I rami sono stati creati prima del relativo rilascio di dessert e ricevono fusioni regolari da LTS, ma nessuna nuova funzionalità. Ad esempio, android-4.9-q riceve unioni dal ramo LTS 4.9.y.

Se una versione del kernel non era un kernel di lancio, non veniva creato alcun kernel dessert, ma il kernel associato alla versione più recente della piattaforma è valido per l'aggiornamento alle future versioni della piattaforma Android. Ad esempio, android-4.9-q è stato l'ultimo dei rami android-4.9* Dessert, quindi è supportato e testato con la versione originale della piattaforma, Android 10. È inoltre supportato e testato con le versioni della piattaforma che supportano gli aggiornamenti dei dispositivi che eseguono 4.9. kernel: Android 11 e Android 12.

Poiché lo schema di denominazione dessert per le versioni della piattaforma Android è stato abbandonato con Android 10, le ultime versioni dessert che sarebbero state chiamate android-4.14-r e android-4.19-r sono state invece chiamate android-4.14-stable e android-4.19-stable .

I kernel Dessert sono sostituiti dai kernel GKI a partire da Android 11, quindi l'elenco completo dei kernel Dessert supportati si trova in questa tabella.

Rilascio della piattaforma Android Nocciolo Supportato fino al
Androide 10 android-4.9-q
android-4.14-q
android-4.19-q
Gennaio 2023
Androide 11 android-4.14-stable
android-4.19-stable
Gennaio 2024
Dicembre 2024

Rami del kernel della versione legacy

I kernel di rilascio vengono mantenuti per fornire backport delle patch citate nel bollettino mensile sulla sicurezza Android . Sono stati creati per ogni kernel di lancio quando veniva rilasciata una nuova piattaforma Android. Sono deprecati quando il rilascio del kernel o della piattaforma associato è deprecato, come descritto in Durata del supporto e patch di sicurezza .

Ogni mese, quando viene pubblicato il Bollettino sulla sicurezza di Android, questi kernel vengono aggiornati con i backport delle patch citate nel bollettino che sono rilevanti per i kernel upstream e i kernel comuni di Android. Non ricevono patch LTS, quindi il numero di versione minore non cambia mai. Non contengono backport per patch specifiche del fornitore.

Nelle versioni Android 11 e successive della piattaforma, i partner devono unire i kernel Dessert o GKI per applicare le patch citate nell'Android Security Bulletin. Non verrà creato alcun kernel di rilascio per le versioni della piattaforma Android 11 o successive.

Pertanto, l'elenco completo dei 14 kernel rilasciati è mostrato in questa tabella e non ne verrà aggiunto nessuno.

Rilascio della piattaforma Android Nocciolo Supportato fino al
Androide 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
Gennaio 2023

Funzionalità e avvio dei kernel

Ogni versione della piattaforma Android supporta il lancio di nuovi dispositivi basati su una qualsiasi delle tre versioni del kernel Linux. Come mostrato nella tabella seguente, i kernel di lancio per Android 11 sono android-4.14-stable , android-4.19-stable e android11-5.4 .

Poiché gli aggiornamenti del kernel in genere non sono necessari quando si aggiorna la versione della piattaforma, i kernel a cui mancano le funzionalità più recenti per una versione della piattaforma possono comunque essere utilizzati per avviare i dispositivi. Pertanto i kernel progettati per Android 10, come android-4.19-q , possono essere utilizzati sui dispositivi anche dopo aver aggiornato la versione della piattaforma ad Android 11. A partire da Android 12, ci saranno meno feature kernel rispetto ai kernel di lancio per limitare il numero di KMI stabili che devono essere supportati.

Rilascio della piattaforma Android Avvia i kernel Kernel di funzionalità
Androide 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
Androide 13 (2022) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
Androide 12 (2021) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.19-q
android-4.14-q
android-4.9-q

android-4.19-q
android-4.14-q
android-4.9-q

1 Potrebbero applicarsi ulteriori restrizioni se il BSP associato è stato aggiornato per il rilascio della piattaforma. In termini più generali, il numero di versione Android del kernel deve essere superiore o uguale alla versione FCM di destinazione . Vedi Oggetto interfaccia fornitore: corrisponde ai rami del kernel per i dettagli.

Gerarchia del kernel comune

Ramo da Android-mainline

Il livello superiore della gerarchia del kernel comune è mostrato nella Figura 1.

Creazione di kernel comuni dal kernel Android-mainline

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

Si noti che il nuovo kernel comune Android android12-5.10 è stato ramificato da android-mainline nel 2020. Nel 2021, quando è stato dichiarato il successivo LTS, android13-5.15 è stato ramificato da android-mainline .

Come mostrato nella Figura 1, ciascuna versione del kernel costituisce la base per due kernel GKI. Ad esempio, i due kernel v5.4 sono android11-5.4 e android12-5.4 , entrambi kernel di funzionalità per le rispettive versioni della piattaforma. Questo sarà il caso anche per la versione 5.10; android12-5.10 è stato creato quando è stato dichiarato LTS e android13-5.10 si diramerà da android12-5.10 al momento del completamento delle funzionalità del kernel nella primavera del 2021 per consentire lo sviluppo di funzionalità per Android 13.

ACK Ciclo di vita del ramo KMI

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

5.10 ACK Ciclo di vita del ramo KMI

Figura 2. 5.10 Ciclo di vita del ramo ACK KMI

Per chiarire il processo di sviluppo e il ciclo di vita del ramo, la Figura 2 si concentra sui rami ACK KMI per 5.10.

Ciascun ramo ACK KMI scorre attraverso tre fasi indicate nella Figura 2 da colori diversi in ciascun ramo. Come mostrato, LTS viene regolarmente unito indipendentemente dalla fase.

Fase di sviluppo

Una volta creato, un ramo ACK KMI entra nella fase di sviluppo ( dev nella Figura 2) ed è aperto a contributi di funzionalità per la prossima versione della piattaforma Android. Nella Figura 2, android12-5.10 è stato creato quando 5.10 è stato dichiarato come il nuovo kernel LTS upstream. Il secondo ramo ACK KMI per una versione del kernel potrebbe essere creato prima per consentire lo sviluppo della versione successiva. Nella Figura 2, android13-5.10 viene creato quando android12-5.10 esce dalla fase di sviluppo.

Fase di stabilizzazione

Quando il ramo ACK KMI viene dichiarato completo di funzionalità, entra nella fase di stabilizzazione , etichettata come stab 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 importanti per il KMI, ma la definizione del KMI deve essere aggiornata se necessario. Consulta la panoramica GKI per i dettagli sul monitoraggio KMI.

Fase congelata KMI

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

Quando un ramo ACK KMI viene bloccato, le correzioni di bug e le funzionalità dei partner possono essere accettate purché il kernel comune KMI esistente non sia danneggiato. Il KMI può essere esteso con nuovi simboli esportati purché 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é modifica 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, aggiungere una nuova funzione va bene:

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 utilizzato in sicurezza per la versione della piattaforma Android con cui è stato lanciato il dispositivo. I test continui con le versioni precedenti garantiscono il mantenimento della compatibilità. Pertanto, nella Figura 2, il kernel android12-5.10 può essere utilizzato per i dispositivi Android 12 e Android 13. Poiché la versione della piattaforma Android è compatibile anche con le versioni precedenti, il kernel android12-5.4 può essere utilizzato per i dispositivi Android 13 sia per il lancio che per l'aggiornamento.

Quando si entra nella fase congelata, il ramo viene contrassegnato da git con la stringa della versione KMI contenente il numero di generazione KMI. Ad esempio, quando android11-5.4 è stato bloccato, è stato contrassegnato con la stringa della versione KMI 5.4-android11-0 dove lo 0 finale è il numero di generazione KMI. Se si verifica un problema di sicurezza o un altro evento che richiede l'accettazione di una patch di modifica del KMI, il numero di generazione del KMI viene incrementato e il ramo viene ritaggato. Ad esempio, se tale modifica viene accettata in android11-5.4 , il ramo verrà contrassegnato con la nuova versione KMI, 5.4-android11-1 . L'attuale generazione KMI può essere trovata utilizzando il comando uname :

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

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

Se la generazione KMI cambia, il kernel non è compatibile con i moduli del fornitore conformi alla generazione KMI precedente, quindi i moduli devono essere ricostruiti e aggiornati in modo sincrono con il kernel. Si prevede che i cambiamenti nella generazione KMI saranno molto rari.

Compatibilità tra 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 tutte le versioni della piattaforma Android che supportavano la versione del kernel. Inoltre, le versioni della piattaforma Android sono retrocompatibili con i kernel GKI delle versioni precedenti. Quindi puoi utilizzare in sicurezza il kernel android12-5.4 sviluppato per Android 12 su dispositivi con Android 13. La compatibilità viene verificata attraverso continui test VTS e CTS dei kernel GKI con tutte le versioni supportate.

Il KMI è stabile in modo che il kernel possa essere aggiornato senza richiedere la ricostruzione dei moduli del kernel nell'immagine del fornitore.

La compatibilità KMI non viene mantenuta tra i diversi kernel GKI. Quindi, ad esempio, un android12-5.10 non può essere sostituito con un kernel android13-5.10 senza ricostruire tutti i moduli.

I kernel GKI sono supportati solo per le versioni iniziali e successive. Non sono supportati per le versioni precedenti. Quindi un kernel android13-5.10 non è supportato sui dispositivi Android 12.

Kernel legacy

I kernel dessert legacy ( *-q e *-stable ) non sono compatibili con le versioni precedenti delle versioni della piattaforma Android, ma i kernel delle due versioni precedenti della piattaforma Android sono supportati per l'aggiornamento. Pertanto, un dispositivo lanciato con Android 10 utilizzando un kernel basato su android-4.19-q può continuare a utilizzare il kernel android-4.19-q durante l'aggiornamento ad Android 2020 oppure aggiornare il codice specifico del fornitore per supportare android-4.19-stable .

Matrice di compatibilità

Questa tabella mostra le versioni del kernel supportate e testate con ciascuna versione della piattaforma Android.

Rilascio della piattaforma Android Kernel supportati per l'aggiornamento Kernel supportati per il lancio
Androide 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
android-4.14-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Androide 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Androide 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

Durata del supporto e patch di sicurezza

I kernel comuni Android sono supportati fino a quando il kernel LTS associato o la versione della piattaforma Android non saranno più supportati. Sebbene un kernel sia supportato, continua a ricevere unioni LTS da upstream e correzioni di bug per il codice specifico di Android. Queste correzioni includono tutte le patch di sicurezza del kernel citate nei bollettini mensili sulla sicurezza di Android che sono rilevanti per i kernel comuni di Android.

I partner possono essere certi che, mediante la fusione regolare dei kernel comuni Android, otterranno tutte le patch di sicurezza del kernel possibili.

Test comuni del kernel

I kernel comuni vengono testati con diversi sistemi CI oltre ai test a valle da parte dei 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 set di dispositivi fisici arm32 e arm64. I risultati dei test recenti possono essere trovati qui .

Test KernelCI

I test di compilazione e avvio di KernelCI vengono avviati ogni volta che una nuova patch viene inserita in un ramo comune del kernel. Diverse centinaia di configurazioni di build vengono testate e avviate su varie schede. I risultati recenti per i kernel Android possono essere trovati qui .

Test pre-invio e post-invio Android

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

Il test post-invio di Android viene eseguito sulle nuove build pubblicate nei rami comuni del kernel Android quando le nuove patch vengono impegnate in un ramo comune del kernel Android in ci.android.com . Inserendo aosp_kernel come nome di ramo parziale in ci.android.com , viene visualizzato un elenco di rami del kernel con i risultati disponibili. Ad esempio, i risultati per android-mainline possono essere trovati qui . Facendo clic su una build particolare, troverai lo stato del test nella scheda Test Results .

I test definiti da test-mapping con il gruppo di test kernel-presubmit nell'albero dei sorgenti della piattaforma Android verranno eseguiti come presubmit per i rami del kernel Android. Ad esempio, la seguente configurazione in test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING abiliterà vts_kernel_proc_file_api_test come test presbumit al check-in del codice kernel comune di Android.

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

test a 0 giorni

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

Matrice di prova

Kernel comune di Android Versioni della piattaforma Android Suite di prova
Principale 14 13 12 11 10 LKFT KernelCI Pre-invio Invia messaggio 0 giorni
android-mainline
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
android-4.19-stable
android-4.14-stable

Contribuisci ai kernel comuni di Android

In generale, lo sviluppo delle funzionalità dovrebbe essere eseguito su Linux principale e non sui kernel comuni Android. Lo sviluppo a monte è fortemente incoraggiato e, dopo che lo sviluppo è stato accettato lì, può essere facilmente riportato al ramo ACK specifico secondo necessità. Il team del kernel Android è lieto di supportare gli sforzi di upstreaming a vantaggio dell'ecosistema Android.

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