Die Fabricated Overlay API von Android 12 bringt Rootless-Themes zurück

Erinnern Sie sich, wie Android 8 es einfacher gemacht hat, Ihr Gerät zu thematisieren? Erinnern Sie sich, wie viel Spaß das gemacht hat? Nun, es ist zurück in Android 12, mit einer Besonderheit.

Der volle Stall Android 12 Die Veröffentlichung steht vor der Tür und Google hat es sogar geschafft habe den Quellcode gepostet zu seinem AOSP-Repo. Da ist ein Vieles ist neu in Android 12, einschließlich einer Ergänzung zu Ressourcen-Overlays namens Fabricated Overlays. Was als API gedacht war, um dem System bei der Verwaltung der verwendeten dynamischen Änderungen zu helfen Material Sie und Monet könnte zu etwas viel Größerem werden – zumindest bis zur Veröffentlichung von Android 13.

Hintergrund

Mishaal Rahman hat diese neue API entdeckt und mich darauf aufmerksam gemacht. Er hatte den Shell-Befehl dafür verwendet, um verschiedene Ressourcenwerte in Android 12 zu testen, ohne dies zu tun Overlay-APKs manuell zu kompilieren, und er dachte, dass dies eine interessante App-Idee für gerootete Geräte sein könnte. Als er mich darauf aufmerksam machte, habe ich mir intensiv den Quellcode für Android 12 angesehen und dabei etwas entdeckt, das ich ziemlich interessant fand. Ich habe getestet, was ich herausgefunden habe, und jetzt sind wir da – wie sich herausstellt, kann die Fabricated Overlay API verwendet werden, um Rootless-Themes wiederherzustellen. Bevor ich zu weit auf das eingehe, was hier passiert, erkläre ich, was fabrizierte Overlays eigentlich sind.

Was sind gefertigte Overlays?

Fabricated Overlays sind eine neue Funktion, die in Android 12 eingeführt wurde. Sie ähneln den klassischen Runtime Resource Overlays (RROs), die es bei Android seit einigen Jahren gibt. Sowohl RROs als auch Fabricated Overlays können unterschiedliche Ressourcen für unterschiedliche Anwendungen überschreiben. Sie können einen booleschen Wert von „falsch“ in „wahr“ ändern (oder umgekehrt), festlegen, wie groß die Statusleiste sein soll und so weiter.

Allerdings weisen fabrizierte Overlays einige bemerkenswerte Unterschiede zu RROs auf. Zum einen müssen Sie kein Overlay-APK generieren und es dann installieren. Stattdessen teilen Sie Android einfach mit, welche Werte Sie für welche Anwendung ändern möchten, und es kümmert sich darum, Ihre Änderungen als Overlay zu registrieren, das Sie dann aktivieren können.

Sie sind auch etwas eingeschränkter als RROs. Vor Android 11 konnten RROs so ziemlich jede Ressource überschreiben: Boolesche Werte, Ganzzahlen, Dimensionen, Attribute, Layouts und sogar Rohdatendateien. Android 11 hat einige Änderungen an der Funktionsweise von RROs vorgenommen, wodurch das Überschreiben von Layouts nicht mehr wirklich möglich ist, obwohl RROs dadurch insgesamt stabiler geworden sind.

Fabrizierte Overlays hingegen können nur Werte überschreiben, die als ganze Zahlen dargestellt werden können. Dazu gehören ganze Zahlen (duh), Dimensionen, boolesche Werte und Farben. Sie können sie nicht zum Überschreiben von Rohdatenressourcen, Layouts, Strings oder Arrays verwenden – zumindest nicht einfach. Dies ist eher eine willkürliche Einschränkung in der API: Sie akzeptiert nur ganzzahlige Werte und Ressourcenkategorien, wie sie von der TypedValue-Klasse definiert werden. TypedValue tut es Unterstützung Zeichenfolgen und die anderen Ressourcentypen, aber nur, um auf ihre Ressource zu verweisen, nicht um ihre tatsächlichen Daten zu speichern.

Für den beabsichtigten Zweck von Fabricated Overlays: Material You und Monet-Effekten sind diese Einschränkungen jedoch kein allzu großes Problem. Mit vorgefertigten Overlays kann das System problemlos Farb- und Dimensionsüberlagerungen im Handumdrehen erstellen und anwenden, ohne dass ein Neustart erforderlich ist oder auf die Kompilierung einer APK gewartet werden muss.

Normalerweise wäre dies nur eine weitere nette API, die Leute mit gerooteten Geräten nutzen können. Sofern es keine vom Hersteller geschaffene Lücke gibt (wie sie Synergy auf Samsung-Geräten ausnutzt), können Overlays nur von Dritten mit Root-Zugriff installiert werden. Das ist jedoch das Beste: Google hat vergessen, eine Lücke in Android 12 zu schließen.

Hergestellte Overlays ohne Root

Mit Android 8 wurde die neue Overlay Manager Service (oder OMS) API eingeführt, und die Leute entdeckten ziemlich schnell, dass Overlay-APKs als normale Apps installiert und dann mit ADB aktiviert werden konnten. Leider hat Google dies in Android 9 gepatcht und seitdem können nur Overlays, die mit demselben Schlüssel wie das System signiert sind, dynamisch installiert werden.

Wie sich herausstellt, weisen die Fabricated Overlays von Android 12 eine Lücke auf, die an die von Android 8 erinnert: Sie benötigen keinen Root-Zugriff oder Berechtigungen auf Signaturebene. Sie benötigen lediglich etwas, das als Shell-Benutzer (d. h. ADB) ausgeführt wird, um sie zu registrieren.

Es ist ziemlich klar, dass Google beabsichtigt hat, dass Fabricated Overlays nur für Root- und Systembenutzer zugänglich sind. Für deren Erstellung gibt es eine ADB-Befehlsimplementierung, die nicht ausgeführt werden kann, wenn der ausführende Benutzer kein Root-Benutzer ist. Die Lücke besteht darin, dass die Prüfung nur im Befehl und nicht in der eigentlichen API erfolgt, was bedeutet, dass wir sie mit etwas Arbeit ausnutzen können.

ADB auf dem Gerät

Android verfügt seit langem über eine drahtlose ADB-Funktion. Dadurch kann ein Computer (oder alles mit einer ADB-Binärdatei und Netzwerkzugriff) drahtlos eine Verbindung zu einem Gerät herstellen. Es ist hauptsächlich für Android-Geräte gedacht, die keine für den Benutzer zugänglichen USB-Anschlüsse haben Smartwatches und Fernseher. Darüber hinaus benötigten Sie vor Android 11 eine kabelgebundene ADB-Verbindung, um das zu aktivieren kabelloser Modus.

Android 11 hat drahtloses ADB offiziell auf Telefone und Tablets gebracht. Es ist etwas komplizierter als das klassische drahtlose ADB mit Kopplungs- und Authentifizierungscodes, kann aber vom Benutzer vollständig auf dem Gerät aktiviert werden. solange das Gerät mit WLAN verbunden ist. Das bedeutet, dass Sie über ADB von Ihrem Gerät aus eine Verbindung zu Ihrem Gerät herstellen können und alles, was Sie benötigen, ein WLAN ist Verbindung.

Verwendung erweiterter APIs in einer App

Es gibt viele Gründe, warum Sie eingeschränkte APIs in Ihrer App verwenden möchten. Normalerweise liegt es daran, dass sie bestimmte spezielle Funktionen bereitstellen, die Sie benötigen. Solange die von Ihnen benötigte API über eine Shell-Befehlsimplementierung verfügt, ist es ziemlich einfach, sie über eine App zu verwenden. Sie müssen lediglich einen Shell-Prozess als Root (oder ADB) erstellen, den richtigen Befehl ausführen und das Ergebnis (falls vorhanden) analysieren.

Was ist, wenn die API keine Shell-Implementierung hat oder der Shell-Implementierung etwas fehlt, was Sie benötigen? Wenn Sie ein gerootetes Gerät verwenden, können Sie so etwas wie verwenden libRootJava. Mit libRootJava können Sie mit den Android-Framework-APIs interagieren, als ob Ihre App als Root-Benutzer ausgeführt würde. Dies ist sowohl bequemer als auch viel schneller als das Ausführen von Shell-Befehlen, da alles in derselben Sprache erfolgt und Sie sich nicht um das manuelle Parsen von Zeichenfolgen kümmern müssen. Es gibt zwar einige Einschränkungen, aber im Großen und Ganzen funktioniert es großartig.

Die libRootJava-API ist ziemlich flexibel. Sie können es so anpassen, dass es als Shell-Benutzer statt als Root ausgeführt wird. Zum Glück müssen Sie das nicht, denn jemand hat es bereits gemacht und es heißt Shizuku. Shizuku ist fast wie eine Kombination aus Magisk Manager und libRootJava.

Die Shizuku Manager-App führt Sie durch die Einrichtung eines Prozesses, der als Shell-Benutzer ausgeführt wird, auf den Shizuku zugreifen kann. Die Shizuku-API-Bibliothek kann in Apps implementiert werden, um ihnen den Zugriff auf System-APIs zu ermöglichen, als wären sie der Shell-Benutzer. Es ist ein viel zentralerer Prozess als libRootJava, da Shizuku nur einmal eingerichtet werden muss, bevor jede App, die die Shizuku-API-Bibliothek implementiert, es verwenden kann. Wenn Sie daran interessiert sind, wie Shizuku funktioniert und wie Sie es in Ihre App integrieren können, Eine Anleitung dafür habe ich hier.

Shizuku und fabrizierte Overlays

Inzwischen können Sie wahrscheinlich erkennen, wohin das führt. Wir können einen Dienst wie Shizuku verwenden, um als Shell-Benutzer auf die Fabricated Overlays API zuzugreifen, und wir können die drahtlose ADB-Funktion von Android 11 verwenden, um Zugriff auf Shell-Ebene zu erhalten, alles auf dem Gerät. Da die Root-Benutzerbeschränkung nur im Shell-Befehl „Fabrizierte Overlays“ und nicht in der eigentlichen API vorhanden ist, reicht die Ausführung als Shell-Benutzer aus, um ihn direkt zu verwenden.

Implementierung: Bibliothek und Beispiel-App

Wie sieht es mit den Implementierungsdetails aus? Nun, auch dafür bin ich auf der sicheren Seite.

Zur Vorbereitung darauf habe ich beides gemacht: Bibliothek und eine voll funktionsfähige Beispiel-App Verwenden dieser Bibliothek.

Die Bibliothek selbst dient hauptsächlich der Bequemlichkeit. Es umschließt einige der versteckten System-APIs und bietet Ihnen einige praktische Methoden für den Umgang mit Shizuku-Berechtigungen. Es ist außerdem flexibel, sodass Sie Ihre eigene Instanz der IOverlayManager-API bereitstellen können, wenn Sie eine andere Möglichkeit zum Abrufen haben.

Die Beispiel-App zeigt, wie Sie die Bibliothek mit Shizuku implementieren können. Es ist auch eine voll funktionsfähige und nützliche App. Auf der Hauptseite werden aktuell registrierte Fabricated Overlays angezeigt, die über sie erstellt wurden, gruppiert nach Ziel-App. Sie können sie dort auch aktivieren, deaktivieren und löschen.

Wenn Sie unten auf die Schaltfläche „Overlay hinzufügen“ tippen, gelangen Sie zu einer Liste aller überlagerbaren Apps. Suchen oder scrollen Sie, um das gewünschte zu finden, und tippen Sie darauf. Anschließend können Sie unten auf dem Bildschirm auf die Schaltfläche „Hinzufügen“ klicken, um die Liste der Ressourcen anzuzeigen, die in dieser App überschrieben werden können. Wählen Sie eine Ressource aus, legen Sie ihren Wert fest und wiederholen Sie den Vorgang für so viele Werte, wie Sie ändern möchten. Klicken Sie auf die Schaltfläche „Speichern“, geben Sie einen Namen ein, bestätigen Sie und Sie kehren zum Hauptbildschirm zurück, auf dem nun das neue Overlay angezeigt wird, das zur Aktivierung bereit ist.

Hier sind einige Screenshots der App, danke an Mishaal Rahman.

Nebenbei bemerkt, ich habe auch eine allgemeine Overlay-Manager-App namens... Overlay-Manager. Die vorkompilierte App selbst ist Nur auf meinem Patreon verfügbar, aber die Der Quellcode ist frei verfügbar an jeden, der es kompilieren oder ändern möchte.

Abschluss

Die neue Fabricated Overlays API in Android 12 ist ziemlich großartig, vor allem, weil sie keinen Root benötigt. Es ist vielleicht nicht so anspruchsvoll wie ein vollwertiges RRO-APK, bietet Ihnen aber viel mehr Flexibilität ohne Root-Zugriff.

Schauen Sie sich die Fabricate Overlay-App auf GitHub an

Wenn Sie ein Gerät mit Android 12 haben und es ausprobieren möchten, sehen Sie sich das oben verlinkte GitHub-Repository an. Im Abschnitt „Releases“ steht eine APK zum Herunterladen und Verwenden zur Verfügung. Die Bibliothek sollte mit JitPack einfach in Ihre eigene Anwendung einzubinden sein.

Natürlich sollten Sie nicht damit rechnen, dass diese Funktion lange erhalten bleibt. Google mag Overlays von Drittanbietern wirklich nicht, daher wird dies mit der Veröffentlichung von Android 13 mit ziemlicher Sicherheit behoben. Aber genießen Sie es in der Zwischenzeit, solange es anhält!