Kernel comuni di Android

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

  • Backport e una selezione di funzionalità upstream necessarie per le funzioni 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 linea principale di Linux viene unita in android-mainline ogni volta che Linus Torvalds pubblica una release o una release candidata. 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 lo sforzo significativo di inoltrare e testare le patch di Android 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 della sua pubblicazione.

Quando un nuovo LTS viene dichiarato upstream, il kernel comune corrispondente è diramato da android-mainline. In questo modo, i partner possono iniziare un progetto prima della dichiarazione della versione LTS, unendo i dati 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.

Altri rami del kernel comuni ricevono unioni regolari dal kernel LTS associato. In genere, queste unioni vengono effettuate subito dopo la pubblicazione della release LTS. Ad esempio, quando è stato pubblicato Linux 6.1.75, questo è stato unito al kernel comune 6.1 (android14-6.1). I partner sono vivamente invitati ad aggiornare i loro kernel per essere sempre al passo con le correzioni di bug specifiche di LTS e Android.

Ramo kernel KMI ACK

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

Inserire e avviare i kernel

Prima di Android 15 (AOSP sperimentale), per l'avvio del dispositivo era possibile usare uno qualsiasi dei tre kernel più recenti. A partire da Android 15 (AOSP sperimentale), per l'avvio del dispositivo possono essere utilizzate le due versioni del kernel più recenti. I kernel di lancio per Android 15 (AOSP sperimentale) 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. Di conseguenza, 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 (AOSP sperimentale).

Rilascio della piattaforma Android Avvia kernel Kernel delle funzionalità
Android 15 (sperimentale AOSP) (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.101
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.41
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 Se il BSP associato è stato aggiornato per la release della piattaforma, potrebbero essere applicate ulteriori restrizioni. In termini più generali, il numero di release di Android del kernel deve essere superiore o uguale alla versione FCM di destinazione. Per maggiori dettagli, consulta Oggetto interfaccia fornitore - Corrispondenza rami del kernel.

Gerarchia comune del kernel

Ramo da Android-mainline

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

Creazione di kernel comuni da kernel Android-mainline

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

Tieni presente che nel 2022 è stato creato un nuovo kernel comune di Android 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, ciascuna versione del kernel può essere la base per 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. Questo è stato anche per la versione 5.10. android12-5.10 è stato creato quando è stato dichiarato LTS e android13-5.10 si è diramato da android12-5.10 al traguardo del completamento delle funzionalità del kernel nella primavera 2021 per consentire lo sviluppo di funzionalità per Android 13. A partire da Android 15 (sperimentale AOSP) (2024), esiste 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 ACK KMI è mostrato di seguito nella Figura 2.

6.6 Ciclo di vita del ramo ACK KMI

Figura 2. 6.6 Ciclo di vita del ramo ACK KMI

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

Ogni ramo KMI ACK attraversa 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 è aperta al contributo di funzionalità per la prossima release della piattaforma Android. Nella Figura 2, android15-6.6 è stato creato quando la versione 6.6 è stata dichiarata come nuovo kernel LTS a monte.

Fase di stabilizzazione

Quando il ramo KMI ACK viene dichiarato completato, entra nella fase di stabilizzazione (etichettata come stabile nella Figura 2). Le funzionalità dei partner e le correzioni di bug sono comunque accettate, ma il monitoraggio KMI è attivo per rilevare eventuali modifiche che interessano l'interfaccia. In questa fase, vengono accettate le modifiche che interrompono i KMI e la definizione dei KMI viene aggiornata con una cadenza predefinita (di solito ogni due settimane). Consulta la panoramica di GKI per i dettagli sul monitoraggio KMI.

Fase bloccata KMI

Prima che venga eseguito il push di una nuova release della piattaforma ad AOSP, il ramo ACK KMI viene bloccato e rimane bloccato per tutta la durata del ramo. Ciò significa che non vengono accettate modifiche che violano il 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 dei KMI, alcune patch unite da 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, purché le interfacce che comprendono 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 di 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, è possibile aggiungere una nuova funzione:

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 che la compatibilità sia mantenuta. Pertanto, nella Figura 2, il kernel android15-6.6 può essere utilizzato per dispositivi Android 15 (sperimentale AOSP) e dispositivi successivi. Poiché la release della piattaforma Android è compatibile anche con le versioni precedenti, è possibile utilizzare il kernel android14-6.1 per i dispositivi Android 15 (sperimentale AOSP) per il lancio o l'upgrade.

Numero di generazione KMI

Se si verifica un'unione LTS durante la fase di stabilizzazione, un problema di sicurezza o un altro evento successivo che richiede l'accettazione di una patch che modifica KMI, il numero di generazione KMI registrato in build.config.common viene incrementato. L'attuale generazione dei KMI è disponibile 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 saranno 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 con 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. Quindi puoi usare in sicurezza il kernel android14-6.1 sviluppato per Android 14 (2023) su dispositivi con Android 15 (sperimentale AOSP) (2024). La compatibilità viene verificata tramite test continui di VTS e CTS dei kernel GKI con tutte le release supportate.

Il KMI è stabile, per cui il kernel può essere aggiornato senza dover ricreare i moduli del kernel nell'immagine del fornitore.

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

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

Matrice di compatibilità

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

Rilascio della piattaforma Android Kernel supportati per l'upgrade Kernel supportati per l'avvio
Android 15 (sperimentale AOSP) (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

Durata dell'assistenza e patch di sicurezza

I kernel comuni Android sono supportati fino a quando la release del kernel LTS o della piattaforma Android associato non sarà più supportata. Sebbene sia supportato, un kernel continua a ricevere unioni LTS da upstream e correzioni di bug per codice specifico di Android. Queste correzioni includono tutte le patch di sicurezza del kernel citate nei Bollettini sulla sicurezza di Android mensili relativi ai kernel comuni di Android.

I partner possono avere la certezza che, utilizzando i kernel GKI, riceveranno tutte le patch di sicurezza del kernel possibili.

Test comuni del kernel

I kernel comuni vengono testati con diversi sistemi CI oltre ai test downstream da parte dei fornitori.

Test funzionale del kernel Linux

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

Test KernelCI

I test di build e avvio KernelCI vengono avviati ogni volta che una nuova patch viene impegnata in un ramo del kernel comune. Vengono testate e avviate diverse centinaia di configurazioni di build su varie schede. I risultati recenti relativi ai kernel Android sono disponibili qui.

Test pre-invio e post-invio di Android

I test pre-invio vengono utilizzati per evitare l'introduzione di errori nei kernel comuni di Android. Il riepilogo dei risultati del test si trova nella scheda "Controlli" della modifica del codice nella gerrit del kernel comune di Android.

I test post-invio di Android vengono eseguiti su nuove build pubblicate nei rami del kernel comuni di Android quando vengono eseguite nuove patch in un ramo di kernel comune 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. Se fai clic su una build specifica, troverai lo stato del test nella scheda Test Results.

I test definiti dalla mappatura dei test con il gruppo di test kernel-presubmit nell'albero di origine della piattaforma Android verranno eseguiti come preinvio 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 comune del codice kernel Android.

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

Test per 0 giorni

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, funzionamento e 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 Pre-invio Invio del post zero-day
android-mainline
android5-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 di Android Kernel è lieto di supportare le iniziative di upstream a vantaggio dell'ecosistema Android.

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