2 Commits
Author SHA1 Message Date
BiasFandClaude Opus 5 3f37e6f047 Android: Release-Build signieren und veröffentlichen
Der Release-Build lieferte bisher app-release-unsigned.apk - und die
installiert Android nicht, auch nicht per Sideload. Ohne Signatur kann das
System nicht feststellen, ob ein Update vom selben Absender stammt wie die
Erstinstallation; das ist unabhängig davon, woher die Datei kommt.

Der Build signiert jetzt. Liegt Android/keystore.properties vor, mit dem
eigenen Schlüssel; sonst wird aus der Umgebung gelesen, damit ein Bauknecht
sie aus seinen Geheimnissen setzen kann, ohne dass ein Passwort im Verlauf
landet. Fehlt beides, wird mit dem Debug-Schlüssel signiert - der Build
sagt das dann deutlich, denn eine so signierte Release-APK sieht sonst aus
wie eine richtige, lässt sich aber vom nächsten Rechner aus nicht mehr
aktualisieren. Schlüssel und Passwörter sind ausgeschlossen.

Version und Versionszähler lassen sich beim Bauen setzen, damit sie aus
einem Etikett kommen können.

Dazu ein Ablauf für Gitea Actions: ein Etikett hochschieben baut die APK,
legt das Release an, falls es noch nicht besteht, und hängt sie an. Beides
muss gehen - sonst scheitert es je nachdem, ob man das Release vorher von
Hand angelegt hat.

Android/RELEASE.md erklärt beide Wege und sagt auch, warum die APK nicht
ins Repository gehört: Release-Anhänge liegen in Gitea neben dem
Repository. Eine 11-MB-Binärdatei je Version im Verlauf wäre unwiderruflich
- Git vergisst nichts, ein späteres Löschen bringt den Platz nicht zurück.

Geprüft: die signierte APK installiert sich im Emulator, meldet sich mit
der übergebenen Version und trägt keine Debug-Kennzeichnung mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 11:49:07 +02:00
BiasFandClaude Opus 5 0cf8448f34 Android: Protokollschicht portiert und geprüft
Erster Teil der Android-Fassung. Portiert ist die Schicht, in der die
ganze Erfahrung aus unseren Fehlersuchen steckt: Victron-Entschlüsselung,
Daly klassisch und Modbus, JBD, WattCycle, Alpicool, der Neigungsmesser
samt Einbaulage, Ausrichtungs-Assistent und Keilrechner.

Sie liegt in einem eigenen Gradle-Modul aus reinem Kotlin, ohne
Android-Abhängigkeiten. Das ist keine Förmlichkeit: nur so laufen ihre
Prüfungen auf der Kommandozeile, ohne Emulator und ohne Android SDK -
genau wie das run-tests.sh der iOS-Fassung. 50 Prüfungen, alle grün.

Dieselben Vektoren wie unter iOS, darunter die, die uns Tage gekostet
haben: der AES-Vektor aus NIST SP 800-38A, der echte Orion-XS-Rahmen aus
der Diagnoseansicht, das mitgeschnittene Ausschaltpaket der IceCube Dual
und die 30-Byte-Antwort der Box im Fahrzeug, an der sich zeigt, dass ein
Fühlerplatzhalter von -128 keine zweite Zone ist.

Zwei Dinge weichen bewusst ab. AES-CTR kommt aus der JVM statt aus
CommonCrypto - der Zähler wird dort ebenso big-endian gezählt. Und
Zeitstempel sind Millisekunden statt Date-Objekten: das läuft ohne
Rücksicht auf die Android-Version und lässt sich in Prüfungen vorgeben,
statt von der Uhr abzuhängen.

Die Werkzeugkette steht in Android/env.sh: JDK 17, Gradle 8.11.1 über den
Wrapper, Android SDK 35.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 10:20:01 +02:00