De Fabricated Overlay API van Android 12 brengt rootless-thema's terug

Weet je nog hoe Android 8 het gemakkelijk maakte om je apparaat van een thema te voorzien? Weet je nog hoe leuk dat was? Nou, het is terug in Android 12, met een twist.

De volledige stal Androïde 12 release staat voor de deur, en Google heeft zelfs de broncode gepost naar zijn AOSP-repository. Er is een veel dat nieuw is in Android 12, inclusief een toevoeging aan resource-overlays genaamd Fabricated Overlays. Wat bedoeld was als een API om het systeem te helpen bij het beheren van de dynamische veranderingen die daarin worden gebruikt Materiaal Jij en monet kan iets veel groters worden – tenminste tot de release van Android 13.

Achtergrond

Mishaal Rahman ontdekte deze nieuwe API en bracht deze onder mijn aandacht. Hij had de shell-opdracht gebruikt om verschillende bronwaarden in Android 12 te testen zonder dat hij dat had gedaan om overlay-APK's handmatig te compileren, en hij dacht dat dit een interessant app-idee zou kunnen zijn voor geroote apparaten. Toen hij het onder mijn aandacht bracht, heb ik veel gekeken naar de broncode voor Android 12 en merkte ik iets op waarvan ik dacht dat het behoorlijk interessant was. Ik heb getest wat ik heb gevonden, en nu zijn we hier: het blijkt dat de Fabricated Overlay API kan worden gebruikt om wortelloze thema's terug te brengen. Voordat ik te ver inga op wat hier gebeurt, zal ik uitleggen wat Fabricated Overlays eigenlijk zijn.

Wat zijn gefabriceerde overlays?

Gefabriceerde overlays zijn een nieuwe functie die is geïntroduceerd in Android 12. Ze lijken op de klassieke Runtime Resource Overlays (RRO's) die Android al een paar jaar heeft. Zowel RRO's als Fabricated Overlays kunnen verschillende bronnen voor verschillende toepassingen overschrijven. U kunt een booleaanse waarde wijzigen van false in true (of andersom), instellen hoe groot de statusbalk moet zijn, enzovoort.

Gefabriceerde overlays vertonen echter enkele opmerkelijke verschillen met RRO's. Ten eerste hoeft u geen overlay-APK te genereren en deze vervolgens te installeren. In plaats daarvan vertelt u Android gewoon welke waarden u voor welke applicatie wilt wijzigen en het zorgt ervoor dat uw wijzigingen worden geregistreerd als een overlay die u vervolgens kunt inschakelen.

Ze zijn ook iets beperkter dan RRO's. Vóór Android 11 konden RRO's vrijwel elke bron overschrijven: booleans, gehele getallen, dimensies, attributen, lay-outs en zelfs onbewerkte gegevensbestanden. Android 11 heeft enkele wijzigingen aangebracht in de manier waarop RRO's werken, waardoor overschrijvende lay-outs niet echt meer haalbaar zijn, hoewel het RRO's over het algemeen wel stabieler maakte.

Gefabriceerde overlays kunnen daarentegen alleen waarden overschrijven die als gehele getallen kunnen worden weergegeven. Dat omvat gehele getallen (duh), dimensies, booleans en kleuren. Je kunt ze niet gebruiken om ruwe gegevensbronnen, lay-outs, tekenreeksen of arrays te overschrijven - althans niet gemakkelijk. Dit is enigszins een willekeurige beperking in de API: deze accepteert alleen gehele waarden en resourcecategorieën zoals gedefinieerd door de TypedValue-klasse. TypedValue wel steun strings en de andere brontypen, maar alleen om naar hun bron te verwijzen, en niet om hun feitelijke gegevens vast te houden.

Deze beperkingen zijn echter niet zo'n groot probleem voor het beoogde doel van Fabricated Overlays: Material You en monet-effecten. Met gefabriceerde overlays kan het systeem eenvoudig kleur- en dimensie-overlays genereren en toepassen, zonder opnieuw op te starten of te wachten tot een APK is gecompileerd.

Normaal gesproken zou dit gewoon weer een leuke API zijn waar mensen met geroote apparaten van kunnen profiteren. Tenzij er een door de fabrikant gecreëerde maas in de wet is (zoals waar Synergy gebruik van maakt op Samsung-apparaten), kunnen overlays alleen worden geïnstalleerd door derden met root-toegang. Dat is echter het beste: Google vergat een gat in Android 12 te dichten.

Gefabriceerde overlays zonder root

Android 8 introduceerde de nieuwe Overlay Manager Service (of OMS) API, en mensen ontdekten vrij snel dat overlay APK's als normale apps konden worden geïnstalleerd en vervolgens konden worden ingeschakeld met ADB. Helaas heeft Google dit gepatcht in Android 9, en sindsdien kunnen alleen overlays die zijn ondertekend met dezelfde sleutel als het systeem dynamisch worden geïnstalleerd.

Het blijkt dat de Fabricated Overlays van Android 12 een maas in de wet hebben die doet denken aan die in Android 8: ze hebben geen root-toegang of machtigingen op handtekeningniveau nodig. Ze hebben alleen iets nodig dat als shell-gebruiker draait (dat wil zeggen ADB) om ze te registreren.

Het is vrij duidelijk dat het de bedoeling van Google was dat Fabricated Overlays alleen toegankelijk zouden zijn voor root- en systeemgebruikers. Er is een ADB-opdrachtimplementatie om ze te maken, en deze wordt niet uitgevoerd als de uitvoerende gebruiker geen root is. De maas in de wet is dat de controle alleen in de opdracht zit, en niet in de daadwerkelijke API, wat betekent dat we er met een beetje werk van kunnen profiteren.

ADB op apparaat

Android heeft al geruime tijd een draadloze ADB-functie. Hierdoor kan een computer (of iets met een ADB binaire en netwerktoegang) draadloos verbinding maken met een apparaat. Het is vooral bedoeld voor Android-apparaten die geen voor de gebruiker toegankelijke USB-verbindingen hebben, zoals smartwatches en tv's. Bovendien had je vóór Android 11 een bekabelde ADB-verbinding nodig om de draadloze modus.

Android 11 is wat officieel draadloze ADB naar telefoons en tablets heeft gebracht. Het is iets ingewikkelder dan de klassieke draadloze ADB, met koppelings- en authenticatiecodes, maar het kan volledig op het apparaat door de gebruiker worden geactiveerd. zolang het apparaat verbonden is met WiFi. Dat betekent dat het mogelijk is om vanaf uw apparaat via ADB verbinding te maken met uw apparaat, en dat u alleen WiFi nodig heeft verbinding.

Verhoogde API's gebruiken in een app

Er zijn veel redenen waarom u beperkte API's in uw app zou willen gebruiken. Meestal komt dit omdat ze een speciale functionaliteit bieden die u nodig heeft. Zolang de API die je nodig hebt een shell-opdrachtimplementatie heeft, is het vrij eenvoudig om deze vanuit een app te gebruiken. Het enige wat u hoeft te doen is een shell-proces als root (of ADB) te maken, de juiste opdracht uit te voeren en het resultaat, indien aanwezig, te parseren.

Wat als de API geen shell-implementatie heeft, of als de shell-implementatie iets mist dat je nodig hebt? Als u een geroot apparaat gebruikt, kunt u zoiets gebruiken als libRootJava. Met libRootJava kunt u communiceren met de Android-framework-API's alsof uw app als rootgebruiker wordt uitgevoerd. Dit is zowel handiger als veel sneller dan het uitvoeren van shell-opdrachten, omdat het allemaal in dezelfde taal is en u zich geen zorgen hoeft te maken over het handmatig parseren van tekenreeksen. Het heeft wel enkele beperkingen, maar voor het grootste deel werkt het prima.

De libRootJava API is behoorlijk flexibel. Je zou het kunnen aanpassen zodat het als shell-gebruiker wordt uitgevoerd in plaats van als root. Gelukkig hoeft dat niet, want iemand heeft het al gemaakt en het wordt gebeld Shizuku. Shizuku is bijna een combinatie van Magisk Manager en libRootJava.

De Shizuku Manager-app begeleidt u bij het opzetten van een proces dat wordt uitgevoerd als de shell-gebruiker waartoe Shizuku toegang heeft. De Shizuku API-bibliotheek kan in apps worden geïmplementeerd, zodat ze toegang krijgen tot systeem-API's alsof ze de shell-gebruiker zijn. Het is een veel gecentraliseerder proces dan libRootJava, omdat Shizuku slechts één keer hoeft te worden ingesteld voordat elke app die de Shizuku API-bibliotheek implementeert het kan gebruiken. Als je geïnteresseerd bent in hoe Shizuku werkt en hoe je het in je app kunt integreren, Ik heb hier een handleiding daarvoor.

Shizuku en gefabriceerde overlays

Inmiddels kun je waarschijnlijk wel zien waar dit naartoe gaat. We kunnen een service als Shizuku gebruiken om als shell-gebruiker toegang te krijgen tot de Fabricated Overlays API, en we kunnen de draadloze ADB-functie van Android 11 gebruiken om toegang op shell-niveau te krijgen, allemaal op het apparaat. Omdat de rootgebruikersbeperking alleen aanwezig is in de Fabricated Overlays shell-opdracht en niet in de daadwerkelijke API, is het uitvoeren als shell-gebruiker voldoende om deze rechtstreeks te gebruiken.

Implementatie: Bibliotheek en Voorbeeldapp

Hoe zit het met de implementatiedetails? Nou, daar heb ik je ook voor gedekt.

Ter voorbereiding hiervan heb ik zowel een bibliotheek en een volledig functionele voorbeeldapp gebruik van die bibliotheek.

De bibliotheek zelf is vooral bedoeld voor het gemak. Het omvat enkele van de verborgen systeem-API's en biedt u een paar handige methoden voor het omgaan met Shizuku-machtigingen. Het is ook flexibel, zodat u uw eigen exemplaar van de IOverlayManager API kunt leveren als u een andere manier heeft om deze op te halen.

De voorbeeld-app laat zien hoe u de bibliotheek kunt implementeren met Shizuku. Het is ook een volledig functionele en nuttige app. Op de hoofdpagina worden momenteel geregistreerde, gefabriceerde overlays weergegeven die erdoor zijn gemaakt, gegroepeerd op doel-app. U kunt ze daar ook inschakelen, uitschakelen en verwijderen.

Als u onderaan op de knop 'Overlay toevoegen' tikt, gaat u naar een lijst met alle overlaybare apps. Zoek of scroll om degene te vinden die je nodig hebt en tik erop. Vervolgens kunt u op de knop ‘Toevoegen’ onderaan het scherm drukken om de lijst met bronnen te bekijken die in die app kunnen worden overschreven. Selecteer een resource, stel de waarde ervan in en herhaal dit voor zoveel waarden als u wilt wijzigen. Druk op de knop "Opslaan", voer een naam in, bevestig en u keert terug naar het hoofdscherm, waar nu de nieuwe overlay wordt weergegeven, klaar om te worden ingeschakeld.

Hier zijn enkele screenshots van de app, dankzij Mishaal Rahman.

Even terzijde: ik heb ook een algemene overlaymanager-app genaamd... Overlay-manager. De voorgecompileerde app zelf is dat wel alleen beschikbaar op mijn Patreon, maar de broncode is vrij beschikbaar voor iedereen die het wil compileren of wijzigen.

Conclusie

De nieuwe Fabricated Overlays API in Android 12 is behoorlijk goed, vooral omdat deze geen root nodig heeft. Het is misschien niet zo geavanceerd als een volledige RRO APK, maar het geeft je veel meer flexibiliteit zonder root-toegang.

Bekijk de Fabricate Overlay-app op GitHub

Als je een apparaat met Android 12 hebt en je dit eens wilt proberen, bekijk dan de GitHub-repository die hierboven is gelinkt. In het gedeelte Releases vindt u een APK die u kunt downloaden en gebruiken. De bibliotheek moet eenvoudig in uw eigen applicatie kunnen worden opgenomen met behulp van JitPack.

Je moet natuurlijk niet verwachten dat deze functie lang blijft bestaan. Google houdt echt niet van overlays van derden, dus dit zal vrijwel zeker worden opgelost wanneer Android 13 uitkomt. Maar geniet er intussen van zolang het duurt!