APDE GSoC ’18: Android Mode 4.0 Integrationen

Wenn Sie einen Sketch mit dem Watch Face Target ausführen, wird der Sketch erstellt und an die Uhr gesendet. Dann lädt die APDE Wear Companion App automatisch die Skizze und startet die Watchface-Auswahl:

VR-Skizzen werden genau wie normale Apps installiert. Sie unterstützen Googles VR-Plattform, zu der Cardboard- und Daydream-Headsets gehören:

Wenn Sie diese neuen Funktionen ausprobieren möchten, treten Sie bitte dem APDE-Vorschaukanal bei und folgen Sie den Anweisungen oben, um sich in die Testerliste einzutragen.

Zurzeit ist v0.5.0-pre2 verfügbar und enthält Wallpapers und VR, aber keine Watchfaces.

Wie funktioniert das alles?

Der Schlüssel zur Unterstützung dieser neuen Ziele war das Upgrade auf den Android-Modus 4.0 von Desktop Processing, der Unterstützung für Wallpapers, Watchfaces und VR bietet. Meine Arbeit bestand lediglich darin, diese coolen neuen Funktionen auf APDE zu portieren, was an sich schon keine leichte Aufgabe war.

Ich habe schon früh beschlossen, dass ich möchte, dass jeder Sketch für jedes Target lauffähig ist. Ich möchte, dass Benutzer jede Skizze oder jedes Beispiel nehmen und nahtlos von einer Umgebung in eine andere übertragen können, sei es eine App, ein Hintergrundbild, ein Watchface oder VR. Auf diese Weise gibt es ein Maximum an Flexibilität und Kapazität, um das volle Potenzial von Processing-Skizzen zu erkunden. Die einzige Ausnahme von dieser Regel ist, dass VR-Skizzen 3D sein müssen (2D-Skizzen funktionieren aufgrund der Natur von VR einfach nicht).

Dieser Ansatz unterscheidet sich von dem des Android-Modus. Auf dem Desktop ist VR zum Beispiel als Bibliothek verpackt, so dass nur Skizzen, die die VR-Bibliothek explizit importieren, für das VR-Ziel ausgeführt werden können. In APDE kann jede 3D-Skizze für VR ausgeführt werden, und die korrekten Importe werden automatisch hinzugefügt.

Das Build-System verwendet jetzt eine Reihe von Vorlagen, um alle Build-Dateien wie Aktivitäten, Manifeste und Layouts zu verwalten. Diese Methode ist dem bisherigen Hardcoding deutlich vorzuziehen. Die Vorlagen wurden weitgehend wortwörtlich aus dem Android-Modus übernommen, es gibt jedoch einige Änderungen, wie z. B. die Unterstützung für Daydream-VR-Headsets.

Live-Hintergrundbilder und VR-Skizzen werden genau wie normale App-Skizzen installiert, aber für VR sind die Google VR-Bibliotheken erforderlich. Ebenso benötigen Watch Faces die Wearable Support Library, aber sie werden nicht auf die gleiche Weise installiert, da sie auf einer Uhr installiert werden müssen.

Watch Face Woes

Ich musste die Skizze auf der Uhr installieren.

Das erste, was ich versucht habe, war, die Skizze auf die Uhr zu schieben und sie dort zu installieren. Es hat sich herausgestellt, dass es nicht so einfach ist, eine APK auf eine Wear OS (ehemals Android Wear) Uhr zu laden, wie es scheint. Auf einem Android-Telefon müssen Sie nur die Installation aus unbekannten Quellen in den Einstellungen aktivieren und schon ist alles fertig. Auf einer Wear-Uhr wird diese Installation jedoch vom System blockiert und es gibt keine Möglichkeit, sie zu umgehen, ohne entweder das Telefon oder die Uhr zu rooten oder die Uhr an einen Computer anzuschließen. Nichts davon ist eine Option für eine mobile Entwicklungsumgebung der Einstiegsklasse.

Als Nächstes habe ich versucht, die App als Wear 1.x-App zu verpacken und auf dem Telefon zu installieren. Vor Android Wear 2.0 wurden alle Wear-Apps in Telefon-Apps gebündelt, selbst wenn diese Telefon-App nur eine leere Hülle war. Dies änderte sich mit Version 2.0, als Wear-Apps eigenständig wurden. Ich hatte gehofft, dass ich das alte System nutzen könnte, um die Uhren-App über das Telefon zu installieren, aber das war vergeblich. Ich weiß immer noch nicht, ob die alte Installationsmethode auch auf neueren Uhren unterstützt wird, aber ich konnte keinen Proof of Concept zum Laufen bringen.

Schließlich griff ich auf eine letzte Methode zurück: das Laden von Klassen, eine Art schwarze Magie. Anstatt den Sketch als eigenständige Anwendung zu installieren, kann ich die Klasse des Sketches in eine Anwendung laden, die bereits auf der Uhr läuft, so dass der Sketch nicht jedes Mal neu installiert werden muss. Dies ist ein grundlegend anderes Modell als das, wie APDE derzeit funktioniert. APDE erstellt eine Skizze, die als eigenständige Anwendung installiert wird. Auf dem Bildschirm der Anwendung sammelt sich eine Reihe von Skizzen an, wenn der Benutzer sie ausführt, und sie bleiben bestehen, wenn APDE deinstalliert wird. Bei der Uhr ist das anders. Jetzt werden die Skizzen nicht installiert, sondern nur geladen. Es ist immer nur eine Skizze als Zifferblatt verfügbar, und sie verschwindet, wenn APDE deinstalliert wird.

Es stellt sich heraus, dass dieser Ansatz funktioniert. Der Nutzer installiert auf seiner Uhr eine Bridge-App aus dem Play Store (noch nicht verfügbar) namens „APDE Wear Companion“. Wenn APDE eine Skizze erstellt, sendet es sie an den Wear Companion. Der Wear Companion entpackt die Skizze und fordert den Benutzer auf, ein in den Wear Companion integriertes Zifferblatt auszuwählen. Dann lädt dieses Zifferblatt die Skizze und zeigt sie an. Das ist überraschend nahtlos.

Es gab ein paar Herausforderungen.

Wenn die Skizze abstürzt, wird sie im Wear Companion ausgeführt, so dass auch die gesamte Wear Companion-App abstürzt. Ich versuche gerade, den Schaden einzudämmen, aber manchmal bricht der Wear Companion ab und muss neu gestartet werden, weil die Skizze zu oft abgestürzt ist. APDE kann auch die Stack Traces von abgestürzten Watch Faces im Moment nicht sehen, weil der Prozess stirbt, bevor der Stack Trace rausgeschickt werden kann. (Druckanweisungen funktionieren aber.)

Es gibt nicht nur ein Watchface, sondern zwei. Processing hat zwei Basisklassen für Watchfaces: eine für den Standard-Renderer (JAVA2D) und eine für OpenGL-basierte Renderer (P2D und P3D). Es gibt also zwei Watchfaces, eines für jeden Renderer. Wenn der Wear Companion eine Skizze entpackt, prüft er, welchen Renderer sie verwendet. Dann wird das entsprechende Zifferblatt sichtbar gemacht und das andere wird ausgeblendet. Das ist eine andere Art von schwarzer Magie, denn der Benutzer sollte es nicht einmal bemerken, aber es scheint recht gut zu funktionieren.

Ich habe gerade gelogen. Es gibt tatsächlich vier Zifferblätter. Es hat sich herausgestellt, dass das System beim Laden eines neuen Zifferblatts, wenn das neue mit dem alten identisch ist (und alle Skizzen verwenden dieselben zwei Zifferblätter), einen „Kurzschluss“ (das ist der Fachausdruck dafür) verursacht und das Zifferblatt nicht neu lädt. Das ist für normale Zifferblätter in Ordnung, aber das APDE-Zifferblatt muss neu geladen werden, um die neue Skizze zu erhalten. Die Lösung ist schmutzig, aber effektiv: Man braucht nur zwei Watchfaces für jeden Renderer (insgesamt vier) und wechselt zwischen ihnen, wenn neue Skizzen geladen werden, so dass das Watchface gezwungen ist, neu zu laden.

Trotz all dieser Schwierigkeiten bin ich froh, sagen zu können, dass die Watchfaces ziemlich gut zu funktionieren scheinen, zumindest auf den beiden Geräten, auf denen ich sie getestet habe. Die anderen Ziele – Hintergrundbilder und VR – waren wesentlich einfacher zu implementieren.

Ausblick

Das nächste große Feature, das für diesen Sommer geplant ist, ist ein „Vorschau“-Modus. Derzeit müssen APDE-Skizzen jedes Mal installiert werden, wenn sie ausgeführt werden. Diese Anordnung ist nicht ideal, weil das Installationsprogramm die Zeit zwischen dem Drücken von „run“ und der Anzeige der Skizze auf einigen Handys verdoppelt. Außerdem können, wie oben beschrieben, alle Skizzen den Anwendungsbildschirm unübersichtlich machen. Keine Skizzen installieren zu müssen, ist wahrscheinlich die am meisten gewünschte Funktion von APDE.

Ich hatte ursprünglich zwei Lösungsvorschläge für dieses Problem. Erstens: Processing.js verwenden, um die Skizze in JavaScript zu konvertieren und sie in einer WebView auszuführen. Zweitens, die Vorteile von Instant Apps nutzen, um eine Skizze ohne Installation auszuführen. Beide Lösungen sind noch unvollkommen. Processing.js ist veraltet und unterstützt keine nativen Android-APIs, wie z. B. den Beschleunigungsmesser. Instant Apps ist bestenfalls eine wackelige Idee, weil ich nicht einmal weiß, ob es möglich sein wird, den Debugger zu fälschen, um die Skizzen lokal zu hosten und sie auszuführen, oder ob dies schneller wäre als die Installation.

Glücklicherweise hat mir das Knacken der Watchface-Nuss einen neuen Ansatz gegeben. APDE muss eine Skizze nicht in JavaScript umwandeln oder eine sofortige Anwendung erstellen. Es muss nur die vorhandene Skizze nehmen und sie als Klasse laden, anstatt sie zu installieren.

Bei diesem Ansatz muss APDE nur die Ressourcen mit AAPT erstellen, die Klassen mit ECJ kompilieren und die Klassen dexieren. Auf meinem Telefon dauert dieser ganze Prozess weniger als zwei Sekunden (obwohl viele Telefone deutlich langsamer sind), was eine enorme Verbesserung gegenüber der Erstellung der APK und ihrer Installation darstellt.

Im Hinblick auf die Zukunft plane ich, diesen Sommer eine inkrementelle Kompilierung zu implementieren, d.h. den Compiler im Hintergrund laufen zu lassen, um die Fehler in Echtzeit anzuzeigen. Mit diesem System wird der Sketch wahrscheinlich schon kompiliert sein, bevor der Benutzer die Schaltfläche „Ausführen“ drückt, was bedeutet, dass alles, was übrig bleibt, das Schreiben ist. Mit anderen Worten, Klassenlader könnten den Erstellungsprozess auf weniger als eine Sekunde verkürzen, natürlich abhängig von der Telefonhardware.

Es gibt noch viel Aufregendes in diesem Sommer!

Fin

Wenn Sie die Änderungen, die ich vorgenommen habe, im Detail erkunden wollen, schauen Sie sich den android-mode-4-Zweig auf GitHub an. Ich habe detaillierte Commit-Nachrichten hinterlassen (die meiste Zeit) und der gesamte Code ist dort zu finden.

Bleiben Sie dran für den Preview-Modus!