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.
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.
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
|
android15-6.6
|
Android 14 (2023) |
android14-6.1
|
android14-6.1
|
Android 13 (2022) |
android13-5.15
|
android13-5.15
|
Android 12 (2021) |
android12-5.10
|
android-4.19-stable
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
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
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
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.