Kernel comuni Android Android

I kernel AOSP comuni (anche conosciuti come i noccioli comuni Android o ACK) sono a valle di kernel.org kernel e comprendono macchie di interesse per la comunità Android che non sono stati fusi in linea principale o Long Term Supported (LTS) kernel. Queste patch possono includere:

  • Backport e scelte di funzionalità upstream necessarie per le funzionalità di 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à di Android. Linux mainline è fusa per incorporazione in android-mainline ogni volta che i messaggi Linus Torvalds un rilascio o release candidate. Prima del 2019, i kernel comuni di Android venivano costruiti clonando il kernel LTS recentemente dichiarato e aggiungendo le patch specifiche per Android. Questo processo è cambiato nel 2019 al ramo il nuovo kernel comune Android da android-mainline . Questo nuovo modello evita lo sforzo significativo di inoltrare la porta e testare le patch Android ottenendo lo stesso risultato in modo incrementale. android-mainline subisce un significativo test continuo, questo modello assicura un kernel di alta qualità dal giorno viene pubblicato.

Quando un nuovo LTS viene dichiarato monte, il corrispondente kernel comune è ramificato da android-mainline . Questo consente ai partner di iniziare un progetto prima della dichiarazione della versione LTS, attraverso la fusione 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 unioni regolari da loro associati kernel LTS . Normalmente questo viene fatto immediatamente dopo la pubblicazione della versione LTS. Per esempio, quando Linux 4.19.64 è stato pubblicato, è stato fuso nel kernel 4.19 comuni (ad esempio, android-4.19-q ). I partner sono fortemente incoraggiati a fondersi regolarmente dai kernel comuni nei kernel dei loro prodotti per rimanere aggiornati con LTS e correzioni di bug specifici per Android.

Termini

Ecco alcuni nuovi termini utilizzati in questo documento per descrivere i criteri comuni del kernel Android.

Kernel delle funzionalità

I kernel che vengono esaltate con le caratteristiche per la versione più recente piattaforma Android sono chiamati funzionalità kernel. Per Android 11, i kernel delle funzionalità si basano sulle versioni del kernel 4.14.y, 4.19.y e 5.4.y. Nelle versioni precedenti della piattaforma, i kernel delle funzionalità erano gli stessi dei kernel di avvio. Tuttavia, in Android 12 ci saranno due kernel di funzionalità e tre kernel di avvio.

Immagine kernel generica

A partire da Android 11, vengono utilizzati kernel comuni Android per creare immagini del kernel generiche (GKI), che sono immagini del kernel Aarch64 che possono essere utilizzate per eseguire qualsiasi dispositivo con il SoC e il supporto dei driver implementati nei moduli del fornitore. Per i dettagli, vedere la panoramica GKI .

Interfaccia del modulo del kernel

GKI introduce il concetto di una stalla Kernel modulo di interfaccia (KMI) che permette al kernel nucleo per essere aggiornato in modo asincrono dai moduli fornitore. Quando il KMI è bloccato, non è possibile apportare modifiche che interrompano la compatibilità binaria con i moduli del fornitore esistenti. Vedere la panoramica GKI per i dettagli sul KMI.

Avvia kernel

I kernel di lancio designati possono essere utilizzati per il lancio di dispositivi con una particolare versione della piattaforma Android. Per Android 11, i dispositivi possono essere avviati con kernel basati sulle versioni del kernel 4.14.y, 4.19.y e 5.4.y.

Tipi di rami del kernel comuni

Ramo del kernel KMI

Kernel KMI hanno una stabile Kernel LIM. La KMI è univocamente identificato dalla versione del kernel e il rilascio piattaforma Android, in modo che i rami sono denominati <androidRelease>-<kernel version> . Ad esempio, il kernel 5.4 KMI per Android 11 è chiamato android11-5.4. Per Android 12 ci sono due ulteriori kernel KMI, android12-5.4 e android12-5.10 .

Rami di kernel di dessert legacy

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 rilascio del dessert associato e ricevono regolari unioni da LTS, ma nessuna nuova funzionalità. Ad esempio, android-4.9-q riceve unioni dal ramo 4.9.y LTS.

Se una versione del kernel non era un kernel di lancio, non è stato creato alcun kernel dessert, ma il kernel associato alla versione più recente della piattaforma è valido per l'aggiornamento alle versioni future della piattaforma Android. Ad esempio, android-4.4-p era l'ultimo dei android-4.4* rami di dessert, quindi è supportato e testato con relativo rilascio piattaforma originale, Android 9 (Pie). È anche supportato e testato con le versioni della piattaforma che supportano gli aggiornamenti dei dispositivi con kernel 4.4: Android 10 e Android 11.

Poiché il sistema di dolce di denominazione per piattaforma release di Android è stata abbandonata con Android 10, gli ultimi rilasci da dessert che sarebbe stato chiamato android-4.14-r e android-4.19-r sono stati invece chiamati android-4.14-stable e android-4.19-stable .

I kernel da dessert sono sostituiti dai kernel KMI che iniziano con Android 11, quindi l'elenco completo dei kernel da dessert supportati è in questa tabella.

Rilascio della piattaforma Android kernel Supportato fino a
Android 8.1 (Oreo) android-4.4-o
android-4.9-o
giugno 2021
Android 9 (torta) android-4.4-p
android-4.9-p
android-4.14-p
gennaio 2022
Android 10 android-4.9-q
android-4.14-q
android-4.19-q
gennaio 2023
Android 11 android-4.14-stable
android-4.19-stable
gennaio 2024

Rami del kernel di rilascio legacy

Noccioli di uscita sono mantenuti per fornire backport di patch citati nel mensile Security Bulletin Android . Sono stati creati per ogni kernel di lancio quando c'era una nuova versione della piattaforma Android. Stanno deprecato quando il rilascio del kernel o la piattaforma associata è deprecato come descritto nella vite di supporto e patch di sicurezza .

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

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

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

Rilascio della piattaforma Android kernel Supportato fino a
Android 8.0 (Oreo) android-3.18-o-release
android-4.4-o-release
android-4.9-o-release
gennaio 2021
Android 8.1 (Oreo MR1) android-3.18-o-mr1
android-4.4-o-mr1
android-4.9-o-mr1
giugno 2021
Android 9 (torta) android-4.4-p-release
android-4.9-p-release
android-4.14-p-release
gennaio 2022
Android 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 sottostante, 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 non sono generalmente richiesti durante l'aggiornamento della versione della piattaforma, i kernel a cui mancano le funzionalità più recenti per una versione della piattaforma possono comunque essere usati per avviare i dispositivi. Pertanto kernel che sono stati progettati per Android 10, come android-4.19-q , può essere utilizzato su dispositivi, anche dopo l'aggiornamento del rilascio della piattaforma di Android 11. A partire da Android 12, ci saranno meno funzionalità kernel di lancio kernel per limitare il numero di KMI stabili che devono essere supportati.

Rilascio della piattaforma Android Avvia kernel Kernel delle funzionalità
Android 9 (2018) android-4.4-p
android-4.9-p
android-4.14-p
android-4.4-p
android-4.9-p
android-4.14-p

Android 10 (2019) android-4.9-q
android-4.14-q
android-4.19-q

android-4.9-q
android-4.14-q
android-4.19-q
Android 11 (2020) android-4.14-stable
android-4.19-stable
android11-5.4
android-4.14-stable
android-4.19-stable
android11-5.4
Androide 12 (2021) android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android12-5.4
android12-5.10
Android T (AOSP sperimentale) (2022) 1 android12-5.4
android12-5.10
android13-5.10
android13-5.x
android13-5.10
android13-5.x 2

1 Android T (AOSP sperimentale) (2022), non si impegna ed è mostrata solo per dimostrare come il nuovo modello ramificazione progredirà in futuro con due funzionalità e tre noccioli di lancio.

2 Dove 5.x è la versione del kernel selezionato come LTS, alla fine del 2021.

Gerarchia del kernel comune

Ramificazione da Android-mainline

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

Creazione di kernel comuni dal kernel Android-mainline

Figura 1. Creazione di noccioli comuni da android-mainline kernel

Si noti che il nuovo comune di Android kernel android12-5.10 fu derivato dallo android-mainline nel 2020. Nel 2021, quando la prossima LTS è dichiarata, android13-5.x (dove 5.xy è la versione del kernel selezionato come LTS) si diramano da android-mainline .

Come mostrato nella Figura 1, ogni versione del kernel è la base per due kernel KMI. Ad esempio, i due kernel V5.4 sono android11-5.4 e android12-5.4 , entrambi i quali sono dotate di kernel per i rispettivi release della piattaforma. Questo sarà il caso anche per 5.10; android12-5.10 è stato creato quando è stata dichiarata la LTS e android13-5.10 si diramano dal android12-5.10 alla funzione kernel traguardo completa nella primavera del 2021 per consentire lo sviluppo di funzionalità per Android T (AOSP sperimentale).

Ciclo di vita del ramo KMI

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

5.10 Ciclo di vita del ramo KMI

Figura 2. 5.10 KMI ramo ciclo di vita

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

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

Fase di sviluppo

Quando è creato, un ramo KMI entra nella fase di sviluppo (dev in figura 2), ed è aperto per feature contributi per la prossima versione piattaforma Android. Nella figura 2, android12-5.10 stata creata quando 5.10 è stato dichiarato come il nuovo kernel upstream LTS. Il secondo ramo KMI per una versione del kernel potrebbe essere creato in precedenza per consentire lo sviluppo della versione successiva. Nella figura 2, android13-5.10 creata quando android12-5.10 transizioni dalla fase di sviluppo.

Fase di stabilizzazione

Quando il ramo KMI è dichiarata completa di funzioni, entra nella fase di stabilizzazione, etichettato come pugnalata nella Figura 2. Partner funzionalità e correzioni di bug sono ancora accettato, ma KMI è abilitata per rilevare eventuali modifiche che interessano l'interfaccia. In questa fase vengono accettate le modifiche KMI-breaking, ma la definizione KMI deve essere aggiornata se necessario. Vedere la panoramica GKI per i dettagli sul monitoraggio KMI.

KMI fase congelata

Prima che una nuova release della piattaforma è spinto al AOSP, il ramo KMI è congelato e rimane congelato per tutta la durata del ramo. Ciò significa che non vengono accettate modifiche che compromettano il KMI a meno che non venga identificato un serio problema di sicurezza che non può essere mitigato senza influire sul KMI stabile. Per evitare rotture KMI, alcune patch unite da LTS potrebbero essere modificate o eliminate se la correzione non è richiesta per i dispositivi Android.

Quando un ramo KMI è 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 corrente 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, l'aggiunta di 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 KMI, viene mantenuta la retrocompatibilità con lo spazio utente in modo che il kernel possa essere utilizzato in sicurezza per la versione della piattaforma Android con cui è stato avviato il dispositivo. I test continui con le versioni precedenti garantiscono il mantenimento della compatibilità. Quindi, in figura 2, il android12-5.10 kernel può essere utilizzata per Android 12 dispositivi e Android T (AOSP sperimentale) dispositivi. Poiché il rilascio della piattaforma Android è anche compatibile con le versioni precedenti, il android12-5.4 kernel può essere utilizzata per Android T (AOSP sperimentale) dispositivi sia per il lancio o l'aggiornamento.

Quando si entra nella fase bloccata, il ramo è contrassegnato con git con la stringa della versione KMI contenente il numero di generazione KMI. Ad esempio, quando android11-5.4 stato congelato, è stato etichettato con la versione stringa KMI 5.4-android11-0 dove l'uscita 0 è 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 rietichettato. Ad esempio, se un tale cambiamento viene accettato nella android11-5.4 , la filiale sarà etichettato con la nuova versione KMI, 5.4-android11-1 . La generazione KMI corrente può essere trovato utilizzando il uname comando:

$ 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 di 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 KMI.

Kernel KMI

I nuovi kernel KMI mantengono la retrocompatibilità con tutte le versioni della piattaforma Android che supportano la versione del kernel. Inoltre, le versioni della piattaforma Android sono retrocompatibili con i kernel KMI delle versioni precedenti. Quindi si può tranquillamente utilizzare il android12-5.4 kernel sviluppato per android 12 su dispositivi con Android T (AOSP sperimentale). La compatibilità viene verificata attraverso continui test VTS e CTS dei kernel KMI con tutte le versioni supportate.

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

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

I kernel KMI sono supportati solo per le versioni iniziali e successive. Non sono supportati per le versioni precedenti. Quindi, un android13-5.10 kernel non è supportata su Android 12 dispositivi.

Kernel legacy

I kernel legacy da dessert ( *-o , *-p , *-q , *-stable ) non sono compatibili tra di piattaforma release Android, ma i kernel dei due precedenti release 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ò scegliere se continuare a utilizzare il android-4.19-q kernel quando aggiornamento a Android 2020, o aggiornare il codice specifico del fornitore al supporto android-4.19-stable .

Matrice di compatibilità

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

Rilascio della piattaforma Android Kernel supportati per l'aggiornamento Kernel supportati per il lancio
Android 9 (2018) android-3.10
android-3.18
android-4.4-o
android-4.9-o
android-4.4-p
android-4.9-p
android-4.14-p
Android 10 (2019) android-3.18
android-4.4-o
android-4.9-o
android-4.4-p
android-4.9-p
android-4.14-p
android-4.9-q
android-4.14-q
android-4.19-q
Android 11 (2020) android-4.4-o
android-4.4-p
android-4.9-o
android-4.9-p
android-4.9-q
android-4.14-p
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
Androide 12 (2021) android-4.9-o
android-4.9-p
android-4.9-q
android-4.14-p
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10

Supporta la durata e le patch di sicurezza

I kernel comuni Android sono supportati fino a quando il kernel LTS associato o la versione della piattaforma Android non sono 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 citato nei mensili Android Bollettini sulla sicurezza che sono rilevanti per i kernel comuni Android.

I partner possono essere certi che unendo regolarmente i kernel comuni di Android, ottengono 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 dai fornitori.

Test funzionale del kernel Linaro

Funzionali Linaro kernel Testing (LKFT) test di avviare varie suite di test, tra cui kselftest, LTP, VTS, e CTS su una serie di dispositivi ARM32 e arm64 fisici. Recenti risultati dei test possono essere trovati qui .

Test KernelCI

KernelCI test di build-and-avvio vengono avviati ogni volta che una nuova patch è impegnata ad un ramo del kernel comune. Diverse centinaia di configurazioni di build vengono testate e avviate su varie schede. Risultati recenti per i kernel Android può essere trovato qui .

Test pre-invio e post-invio Android

I test di preinvio vengono utilizzati per impedire l'introduzione di errori nei kernel comuni. I risultati non sono disponibili pubblicamente in questo momento.

Test postsubmit Android viene eseguita quando una nuova patch è impegnata ad un ramo del kernel comune. Inserendo aosp_kernel come nome del ramo parziale, viene visualizzato un elenco di rami del kernel con risultati disponibili. Ad esempio, i risultati per android-mainline può essere trovato qui .

Test di 0 giorni

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

Matrice di prova

Kernel comune Android Rilasci della piattaforma Android Suite di prova
Maestro 11 10 9 (torta) 8 (Oreo) LKFT KernelCI Pre-invio Invia Invia 0 giorni
android-mainline ? ? ? ? ? ? ? ? ? ?
android12-5.4 ? ? ? ? ? ? ? ? ? ?
android11-5.4
android-4.19-stable
android-4.14-stable
? ? ? ? ? ? ? ? ? ?
android-4.19-q
android-4.14-q
android-4.9-q
? ? ? ? ? ? ? ? ? ?
android-4.14-p
android-4.9-p
android-4.4-p
? ? ? ? ? ? ? ? ? ?
android-4.9-o
android-4.4-o
android-3.18
? ? ? ? ? ? ? ? ? ?

Contribuire ai kernel comuni di Android

In generale, lo sviluppo delle funzionalità dovrebbe essere eseguito su Linux principale e non su kernel comuni Android. Lo sviluppo a monte è fortemente incoraggiato e, dopo che lo sviluppo è stato accettato lì, può essere facilmente eseguito il backport al ramo ACK specifico secondo necessità. Il kernel Android Team è lieto di sostenere gli sforzi a flusso ascendente a beneficio dell'ecosistema Android.

Inviare patch per Gerrit e conformi a tali linee guida di contribuzione .