Het lijkt erop dat Google hard werkt aan het updaten en upstreamen van de Linux kernel die in het hart van elke Android telefoon zit. Het bedrijf was een grote deelnemer aan de Linux Plumbers Conference van dit jaar, een jaarlijkse bijeenkomst van de top Linux-ontwikkelaars, en Google besteedde veel tijd aan het praten over het krijgen van Android om te werken met een generieke Linux-kernel in plaats van de sterk aangepaste versie die het nu gebruikt. Het toonde zelfs een Android-telefoon die een mainline Linux-kernel draaide.
Maar eerst wat achtergrond over Android’s huidige kernel-rommel.Momenteel gebeuren er drie belangrijke vorken tussen de “mainline” Linux-kernel en een verschepend Android-toestel (merk op dat “mainline” hier geen relatie heeft met Google’s eigen “Project Mainline”). Ten eerste neemt Google de LTS (Long Term Support) Linux kernel en verandert deze in de “Android Common kernel”-de Linux kernel met alle Android OS-specifieke patches toegepast. Android Common wordt verscheept naar de SoC-leverancier (meestal Qualcomm) waar het zijn eerste ronde van hardware-specifieke toevoegingen krijgt, eerst gericht op een bepaald model van SoC. Deze “SoC Kernel” wordt dan naar een toestelfabrikant gestuurd voor nog meer hardware-specifieke code die elk ander stukje hardware ondersteunt, zoals het scherm, de camera, luidsprekers, usb poorten, en alle extra hardware. Dit is de “Device Kernel,” en het is wat daadwerkelijk wordt geleverd op een apparaat.
Dit is een extreem lange reis die resulteert in elk apparaat dat miljoenen regels van out-of-tree kernel code verscheept. Elke kernel is anders en apparaatspecifiek – in principe werkt geen enkele kernel van een telefoon op een andere telefoon. De hoofdversie van de kernel voor een apparaat wordt vastgelegd aan het begin van de ontwikkeling van een SoC, dus het is gebruikelijk dat een gloednieuw apparaat wordt geleverd met een Linux-kernel die twee jaar oud is. Zelfs Google’s nieuwste en, uh, grootste apparaat, de Pixel 4, verscheepte in oktober 2019 met Linux-kernel 4.14, een LTS-release uit november 2017. Het zal ook voor altijd vastzitten aan kernel 4.14. Android-apparaten krijgen meestal geen kernelupdates, waarschijnlijk dankzij de ongelooflijke hoeveelheid werk die nodig is om slechts een enkele apparaatkernel te produceren en de keten van bedrijven die zouden moeten samenwerken om het te doen. Dankzij het feit dat kernelupdates nooit gebeuren, betekent dit dat elke nieuwe release van Android meestal de laatste drie jaar van LTS-kernelreleases moet ondersteunen (het minimum voor Android 10 is 4.9, een release uit 2016). Google’s toezeggingen om oudere versies van Android te ondersteunen met beveiligingspatches betekent dat het bedrijf nog steeds kernel 3.18 ondersteunt, die nu vijf jaar oud is. Google’s pleisteroplossing hiervoor is tot nu toe geweest om samen te werken met de Linux-gemeenschap en mainline Linux LTS-releases langer te ondersteunen, en ze zijn nu op weg naar zes jaar ondersteuning.
Vorig jaar, op Linux Plumbers Conference 2018, kondigde Google zijn eerste onderzoek aan om de Android-kernel dichter bij mainline Linux te brengen. Dit jaar deelde het een beetje meer details over zijn vooruitgang tot nu toe, maar het is zeker nog steeds een werk in uitvoering. “Vandaag weten we niet wat er nodig is om aan de kernel te worden toegevoegd om op een Android-apparaat te draaien,” Android Kernel Team lead Sandeep Patil vertelde de groep op LPC 2019. “We weten wat er nodig is om Android te laten draaien, maar niet noodzakelijkerwijs op een bepaalde hardware. Dus ons doel is om dat in principe allemaal uit te zoeken, het vervolgens te upstreamen en te proberen zo dicht mogelijk bij mainline te zijn.”
Hoewel er nog werk aan de winkel is om het bredere Android-ecosysteem en talloze apparaatconfiguraties aan boord te krijgen, lijkt het voor specifieke apparaatmodellen goed te gaan. Tom Gall, de directeur van de Linaro Consumer Group, toonde een Xiaomi Poco F1 die daadwerkelijk de mainline Linux kernel draait onder het gebruikelijke Android OS. Gall vertelde het publiek: “Er zijn grote, grote props te geven aan het Google Kernel Team in het bijzonder voor het krijgen van hun code upstream, zodat we apparaten kunnen opstarten met een mainline kernel.”
Naast het plan om zoveel mogelijk kernelcode te upstreamen, streeft Google er ook naar om zijn eerdere werk aan het modulariseren van Android, Project Treble, te repliceren. Net zoals Treble een stabiele interface creëerde tussen het Android OS en de apparaat HAL’s (Hardware Abstraction Layers), Google’s voorstel om Android dichter bij mainline Linux te brengen (Hoe is er nog geen domme “project” naam voor dit?) omvat het stabiliseren van Linux’s in-kernel ABI en het hebben van een stabiele interface voor de Linux-kernel en hardware-leveranciers om naar te schrijven. Google wil de Linux-kernel loskoppelen van zijn hardware-ondersteuning.
De Linux-gemeenschap is al een tijdje tegen het idee van een stabiele interface, met de suggestie dat als je de mogelijkheid wilt hebben om snel een kernel te updaten, open source je stuurprogramma’s en krijg je ze in de hoofdkernelboom, waar eventuele wijzigingen voor je zullen worden verzorgd. Het open source maken van drivers is voor veel hardwarebedrijven echter een absolute spelbreker, en geen enkele vorm van pleitbezorging of productdegradatie zal daar iets aan veranderen. Het feit dat Google vijf jaar oude versies van Linux blijft ondersteunen, toont aan dat dit model niet werkt.
Matthias Männich, een senior software engineer bij Google, toonde een diagram met de titel “Android Next Generation” dat liet zien hoe deze voorgestelde kernelarchitectuur eruit zou zien. Google zou een “Generic Kernel Image (GKI)” leveren samen met verschillende “GKI Modules” die deze stabiele API/ABI in de kernel zouden blootleggen. De hardware-specifieke drivers (waarschijnlijk closed source drivers) zouden worden geladen als kernel modules. Dus in plaats van forks bovenop forks, wordt alles gemodulariseerd in additieve pakketten.
Voorlopig stelt Google alleen voor dat de in-kernel ABI stabiel is voor een enkele LTS versie. Dus dit zou apparaten niet in staat stellen om te upgraden van de ene versie van de Linux kernel naar de andere – het zou alleen een enkele gegeneraliseerde kernel image mogelijk maken om te werken op meerdere apparaten, in plaats van de apparaat-specifieke kernel forks die we vandaag hebben. Het zou zeker eenvoudiger beveiligingsupdates mogelijk maken, en hopelijk zou het nieuwe LTS-releases sneller op de markt brengen.
We zouden voorbarig zijn als we zeiden dat dit een verandering is die zeker naar Android en de Linux-kernel komt. Er zijn nog steeds tonnen problemen op te lossen (zowel technisch als politiek, zou ik me kunnen voorstellen), en sommige van deze gesprekken waren meer als openbare brainstormsessies tussen de Google-presentatoren en de Linux-ingenieurs (waarvan er veel ook Googlers waren!) in het publiek. Dit is het tweede jaar op rij dat Google naar LPC is gekomen en het idee heeft geopperd om de mainline Linux kernel in Android te gebruiken, hoewel, en met Android als een van de grootste Linux sort-of-distro’s op aarde, is het logisch voor iedereen om samen te werken, toch?
“We hebben nog mijlen te gaan, en dat weten we, maar we zijn verder gekomen van waar we begonnen,” vertelde Patil de menigte. “Vorig jaar, praatte ik het in het bestaan. Deze keer hebben we problemen te bespreken.”