Sembra che Google stia lavorando duramente per aggiornare e integrare il kernel Linux che si trova nel cuore di ogni telefono Android. L’azienda è stata una grande partecipante alla Linux Plumbers Conference di quest’anno, un incontro annuale dei migliori sviluppatori Linux, e Google ha trascorso molto tempo a parlare di come far funzionare Android con un kernel Linux generico invece della versione altamente personalizzata che usa ora. Ha anche mostrato un telefono Android che esegue un kernel Linux mainline.
Ma prima, un po’ di background sull’attuale pasticcio del kernel di Android.Attualmente, tre principali fork avvengono tra il kernel Linux “mainline” e un dispositivo Android in spedizione (notare che “mainline” qui non ha alcuna relazione con il “Project Mainline” di Google). In primo luogo, Google prende il kernel Linux LTS (Long Term Support) e lo trasforma nel “kernel Android Common” – il kernel Linux con tutte le patch specifiche del sistema operativo Android applicate. Android Common viene spedito al fornitore di SoC (di solito Qualcomm) dove riceve la sua prima serie di aggiunte specifiche per l’hardware, concentrandosi prima su un particolare modello di SoC. Questo “SoC Kernel” viene poi inviato a un produttore di dispositivi per un codice ancora più specifico per l’hardware che supporta ogni altro pezzo di hardware, come il display, la fotocamera, gli altoparlanti, le porte USB, e ogni altro hardware extra. Questo è il “Kernel del dispositivo”, ed è ciò che viene effettivamente spedito su un dispositivo.
Questo è un viaggio estremamente lungo che risulta in ogni dispositivo che spedisce milioni di linee di codice kernel fuori dall’albero. Ogni kernel di dispositivo spedito è diverso e specifico del dispositivo – in pratica nessun kernel di un telefono funzionerà su un altro telefono. La versione principale del kernel per un dispositivo è bloccata all’inizio dello sviluppo iniziale di un SoC, quindi è tipico per un dispositivo nuovo di zecca spedire un kernel Linux che ha due anni. Anche l’ultimo e più grande dispositivo di Google, il Pixel 4, è stato spedito nell’ottobre 2019 con il kernel Linux 4.14, una release LTS del novembre 2017. Sarà bloccato sul kernel 4.14 per sempre, anche. I dispositivi Android di solito non ottengono aggiornamenti del kernel, probabilmente grazie all’incredibile quantità di lavoro necessario per produrre solo un kernel per un singolo dispositivo e la catena di aziende che avrebbero bisogno di cooperare per farlo. Grazie al fatto che gli aggiornamenti del kernel non avvengono mai, questo significa che ogni nuova release di Android di solito deve supportare gli ultimi tre anni di release LTS del kernel (il minimo per Android 10 è 4.9, una release del 2016). Gli impegni di Google a supportare le vecchie versioni di Android con patch di sicurezza significa che l’azienda sta ancora supportando il kernel 3.18, che ha ormai cinque anni. La soluzione cerotto di Google per questo finora è stata quella di collaborare con la comunità Linux e supportare più a lungo le versioni LTS di Linux mainline, e ora sono arrivati a sei anni di supporto.
L’anno scorso, alla Linux Plumbers Conference 2018, Google ha annunciato la sua indagine iniziale per portare il kernel Android più vicino alla mainline Linux. Quest’anno ha condiviso un po’ più di dettagli sui suoi progressi finora, ma è sicuramente ancora un lavoro in corso. “Oggi, non sappiamo cosa serve per essere aggiunto al kernel per funzionare su un dispositivo Android”, ha detto il capo del team Android Kernel Sandeep Patil al gruppo a LPC 2019. “Sappiamo cosa serve per far girare Android ma non necessariamente su un dato hardware. Quindi il nostro obiettivo è fondamentalmente scoprire tutto questo, poi fare l’upstream e cercare di essere il più vicino possibile alla mainline.”
Mentre c’è ancora lavoro da fare per ottenere il più ampio ecosistema Android e una miriade di configurazioni di dispositivi a bordo, per specifici modelli di dispositivi, le cose sembrano procedere bene. Tom Gall, il direttore del Linaro Consumer Group, ha mostrato uno Xiaomi Poco F1 che esegue effettivamente il kernel Linux mainline sotto il solito sistema operativo Android. Gall ha detto al pubblico, “Ci sono grandi, grandi props da dare al Google Kernel Team in particolare per ottenere il loro codice a monte in modo che possiamo avviare i dispositivi con un kernel mainline.”
Insieme al piano di upstream più codice kernel possibile, Google sta anche puntando a replicare il suo precedente lavoro di modularizzazione di Android, Project Treble. Proprio come Treble ha creato un’interfaccia stabile tra il sistema operativo Android e gli HALs del dispositivo (Hardware Abstraction Layers), la proposta di Google per portare Android più vicino alla linea principale di Linux (come mai non c’è ancora un nome stupido di “progetto” per questo?) comporta la stabilizzazione dell’ABI in-kernel di Linux e un’interfaccia stabile per il kernel Linux e i fornitori di hardware per scrivere. Google vuole disaccoppiare il kernel Linux dal suo supporto hardware.
La comunità Linux è stata contro l’idea di un’interfaccia stabile per qualche tempo, con il suggerimento che se volete la capacità di aggiornare rapidamente un kernel, aprite i vostri driver e metteteli nell’albero principale del kernel, dove ogni cambiamento sarà curato per voi. L’open sourcing dei driver è una rottura assoluta per molte aziende di hardware, però, e nessuna quantità di sostegno o di degrado del prodotto sta per cambiare la situazione. Il fatto che Google sia bloccata a supportare versioni di Linux vecchie di cinque anni dimostra che questo modello non funziona.
Matthias Männich, un ingegnere software senior di Google, ha mostrato un diagramma etichettato “Android Next Generation” che mostra come sarebbe questa architettura proposta per il kernel. Google fornirebbe una “Generic Kernel Image (GKI)” insieme a diversi “GKI Modules” che esporrebbero questa API/ABI stabile nel kernel. I driver specifici dell’hardware (probabilmente driver closed source) sarebbero caricati come moduli del kernel. Quindi, invece di fork su fork, tutto viene modularizzato in pacchetti additivi.
Per ora, Google sta proponendo solo che l’ABI in-kernel sia stabile per una singola versione LTS. Quindi questo non permetterebbe ai dispositivi di aggiornarsi da una versione del kernel Linux ad un’altra – permetterebbe solo ad una singola immagine generalizzata del kernel di funzionare su più dispositivi, invece dei fork del kernel specifici del dispositivo che abbiamo oggi. Permetterebbe sicuramente aggiornamenti di sicurezza più facili, e si spera che porterebbe le nuove versioni LTS sul mercato più velocemente.
Saremmo prematuri se dicessimo che questo è un cambiamento che sta sicuramente arrivando per Android e il kernel Linux. Ci sono ancora tonnellate di problemi da risolvere (sia tecnicamente che politicamente, immagino), e alcuni di questi discorsi erano più come sessioni pubbliche di brainstorming tra i presentatori di Google e gli ingegneri Linux (molti dei quali erano anche Googlers!) nel pubblico. Questo è il secondo anno di fila che Google si è presentato a LPC e ha lanciato l’idea di utilizzare il kernel Linux mainline in Android, però, e con Android che è una delle più grandi sort-of-distros Linux sulla Terra, ha senso per tutti lavorare insieme, giusto?
“Abbiamo miglia da percorrere, e lo sappiamo, ma abbiamo fatto progressi da dove abbiamo iniziato”, ha detto Patil alla folla. “L’anno scorso, ho parlato dell’esistenza. Questa volta, abbiamo davvero dei problemi da discutere”
.