Fibel

12 · Native App für Android

bash
fibel apk meine-app

Herauskommt eine .apk, die man auf ein Android-Telefon schieben kann. Keine Webansicht mit Rahmen drumherum, sondern echte Android-Bedienelemente: karte wird zu einer Material-Card, feld ... regler zu einem Slider, knopf zu einem Button.

Wie das geht

                        ┌─→  render.js  →  HTML          (Browser)
meine-app.fibel  →  AST ─┤
                        └─→  baum.js    →  Ansichtsbaum  →  Compose  (Telefon)

Auf dem Telefon läuft derselbe Interpreter. Er rechnet in der JavaScript-Maschine, die Android ohnehin mitbringt — einem WebView, der nie etwas anzeigt, sondern nur rechnet. Was herauskommt, ist ein Ansichtsbaum, den Jetpack Compose mit echten Widgets zeichnet.

Der Grund für diesen Umweg: Es gibt genau einen Interpreter. Ein Baustein, der im Browser geht, geht auch im Telefon — es kann keinen Riss zwischen beidem geben. Wer stattdessen zwei Umsetzungen pflegt, hat früher oder später zwei Sprachen.

Was mitkommt

  • der Interpreter (elf Dateien, wenige hundert Zeilen)
  • dein Programm als Text
  • deine eigenen Wörter aus woerter.json, falls vorhanden
  • die hochgeladenen Bilder aus meine-app.dateien/
  • der Datenbestand von jetzt aus dem Speicher der App (meine-app.db), als Startbestand

Die letzten beiden Punkte sind wichtig: Die App braucht kein Netz — solange sie für sich rechnet. Dann fordert sie keine Internet-Berechtigung an und holt nichts von einem Server. Ein Katalog steht beim ersten Start bereits da; ab dem ersten Speichern zählt nur noch, was im Gerät liegt.

Dateien und Unterschriften gibt es in der App nur mit daten von: Ein Feld vom Typ bild, datei oder unterschrift zeigt die Auswahl von Android beziehungsweise eine Zeichenfläche, und was dabei entsteht, geht sofort zum Server. Eine App, die für sich rechnet, hat niemanden, der es annehmen könnte.

Mit daten von (Kapitel 13) ist es umgekehrt: Die App fragt nach der Internet-Berechtigung, und ins Paket kommen weder Bestand noch Uploads. Die Datei liegt dann oft neben dem Bestand des Servers — alles von allen, Unterschriften eingeschlossen —, und der gehört nicht lesbar in eine App. Ohne Netz zeigt sie den letzten Stand und reicht Änderungen nach.

Die beiden Bauarten

bash
fibel apk meine-app              # Testbau
fibel apk meine-app --release    # Fassung für den Laden

Testbau (die Vorgabe). Android signiert ihn mit einem Wegwerf-Schlüssel. Er lässt sich sofort installieren:

bash
adb install -r apk/app/build/outputs/apk/debug/app-debug.apk

Ladenbau. Kleiner und schneller, kommt aber unsigniert heraus. Das ist Absicht: Der Schlüssel für den Play Store gehört dir, und ein Werkzeug hat keinen ihn nebenbei zu erzeugen. Wer ihn verliert, kann seine App nie wieder aktualisieren — solche Schlüssel entstehen bewusst, nicht als Nebenwirkung.

bash
keytool -genkey -v -keystore meiner.jks -alias app -keyalg RSA -validity 10000
apksigner sign --ks meiner.jks --out meine-app.apk app-release-unsigned.apk

Weitere Schalter

--out <ordner>wohin das Android-Projekt kommt (Vorgabe: apk)
--nur-projektnur die Quellen erzeugen, nicht bauen — für Android Studio
--paket de.firma.appder Paketname (sonst aus dem App-Namen abgeleitet)

Ohne Gradle im System sagt der Befehl das und legt nur das Projekt an. Den Ordner kann man dann in Android Studio öffnen.

Was in der App anders ist

Dieselbe Sprache, ein anderer Bildschirm — ein paar Dinge sehen deshalb anders aus:

BausteinIm Telefon
menuehinter einem Knopf in der Kopfzeile, nicht als Leiste
rastereine Spalte — nebeneinander ist auf einem Telefon nichts
spaltenebenso untereinander
buehnewie im Browser, mit Bild, Schleier und Parallax
feld ... dateinoch nicht — Dateien wählen geht in der App bisher nicht

Die Akzentfarbe aus dem design-Block gilt auch hier, und modus automatisch folgt der Hell/Dunkel-Einstellung des Geräts.

Was noch fehlt

  • Dateien und Unterschriften in Formularen.
  • iOS. Der Ansichtsbaum ist offen beschrieben (Kapitel 11) — ein Zeichner für SwiftUI ist möglich, aber niemand hat ihn geschrieben.

Zum Ausprobieren

test/pruefstand.fibel ist dafür gebaut: jeder Baustein und jeder Feldtyp einmal, auf sieben Seiten.

bash
fibel apk test/pruefstand

Damit sieht man auf einem Bildschirm, wie Bühne, Raster, Spalten, Regler, Unterschrift und Dateiauswahl im Telefon aussehen — ohne ein ganzes Projekt übersetzen zu müssen.

Wenn die App sich nicht meldet

Bleibt beim Start ein Rädchen stehen, wartet die App auf die JavaScript-Maschine des Geräts. Nach 15 Sekunden gibt sie auf und sagt es. Was dabei schiefging, steht im Protokoll:

bash
adb logcat -s Fibel

Auf dem Testgerät kam es vor, dass der Renderer-Prozess des WebView gar nicht erst startete (process is bad im Protokoll). Das ging beim nächsten Start wieder — warum es passiert, ist ungeklärt und steht in OFFEN.md.


Zurück zur Übersicht