12 · Native App für Android
fibel apk meine-appHerauskommt 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
fibel apk meine-app # Testbau
fibel apk meine-app --release # Fassung für den LadenTestbau (die Vorgabe). Android signiert ihn mit einem Wegwerf-Schlüssel. Er lässt sich sofort installieren:
adb install -r apk/app/build/outputs/apk/debug/app-debug.apkLadenbau. 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.
keytool -genkey -v -keystore meiner.jks -alias app -keyalg RSA -validity 10000
apksigner sign --ks meiner.jks --out meine-app.apk app-release-unsigned.apkWeitere Schalter
--out <ordner> | wohin das Android-Projekt kommt (Vorgabe: apk) |
--nur-projekt | nur die Quellen erzeugen, nicht bauen — für Android Studio |
--paket de.firma.app | der 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:
| Baustein | Im Telefon |
|---|---|
menue | hinter einem Knopf in der Kopfzeile, nicht als Leiste |
raster | eine Spalte — nebeneinander ist auf einem Telefon nichts |
spalten | ebenso untereinander |
buehne | wie im Browser, mit Bild, Schleier und Parallax |
feld ... datei | noch 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.
fibel apk test/pruefstandDamit 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:
adb logcat -s FibelAuf 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