Android-Version des INAV Configurator: eine Capacitor-WebView-App, die den Original-Quellcode unverändert als Git-Submodule einbindet. Verbindung zum Flight Controller per USB-OTG (MSP über VCP/CP210x/FTDI/CH340).
Read this in English.
| Funktion | Status |
|---|---|
| Verbinden per USB-OTG, alle Konfigurations-Tabs, Disconnect | ✅ funktioniert |
| Mission Control (Karte braucht Internet) | ✅ funktioniert |
Einstellungs-Backup: „In Datei speichern" (führt automatisch diff all aus) |
✅ funktioniert |
| Einstellungs-Restore: „Aus Datei laden" (speichert nach dem Übertragen automatisch) | ✅ funktioniert |
| Firmware flashen (DFU) | ❌ nicht unterstützt (eigenes USB-Protokoll) → am PC flashen; Tab ausgeblendet |
| SITL / TCP / UDP | ❌ nicht unterstützt (Stubs vorhanden); Tab ausgeblendet |
Map Generator (neu in 10.0): Kartenkacheln für ETHOS/EdgeTX-Widgets und INAV-Terrain (.TER) |
✅ Export als ZIP über den Android-Speicherdialog (Terrain-ZIP komprimiert: 53 MB .TER → ca. 17 MB) oder „Sync to SD Card“ direkt in einen per Android-Ordnerdialog gewählten Ordner (z.B. SD-Karte im Handy; Berechtigung bleibt gespeichert); Kachel-Cache im App-Speicher. „Eject“ und „Export as ZIP“ ausgeblendet; ohne gewählten Ordner speichert der Terrain-Dialog über „Generate & Save“ |
| Blackbox-Download | ❌ noch nicht angebunden |
Version 10.0.0-rc1: Upstream-Stand 10.0.0-rc1 (Release Candidate). Getestet auf
Xiaomi Pad (Android 15) mit TBS_LUCID_H7_WING_MINI (INAV 10.0.0).
Getestet mit INAV Configurator 9.1.1 auf Android, FC: TBS_LUCID_H7_WING_MINI (INAV 9.1.0) und MICOAIR743V2 (INAV 9.0.1). Der per „In Datei speichern" erzeugte Diff wurde zeichengenau gegen die Windows-Version verglichen — identisch bis auf die Sensor-Kalibrierwerte, die der FC bei jeder Kalibrierung neu ermittelt.
Der INAV Configurator ist eine Electron-App — die gesamte UI ist Web-Technologie. Nur die schmale Electron-Schicht wird ersetzt. Keine Datei im Upstream-Repo wird verändert.
-
Git-Submodule
inav-configurator/— gepinnt auf einen Upstream-Release-Stand. -
shim/electron-api.js— Nachbau der Preload-Brückewindow.electronAPI(Original:inav-configurator/js/main/preload.js). Serial → natives USB-Plugin, Datei-Dialoge → natives FileDialog-Plugin, Settings → localStorage, App-Infos → Web-Äquivalente, nicht Unterstütztes → saubere Stubs. -
vite.config.mobile.mjs— baut den Upstream-Code eigenständig (das Electron-Forge-Setup des Upstreams ist außerhalb von Forge nicht nutzbar). Enthält Aliase für Node-/Electron-Module →shim/, jQuery-Injektion, Asset-Inlining sowie selbstüberwachende Build-Zeit-Patches:upstream-patches: ein Upstream-Bug (ungeschütztescallback()inGUI.tab_switch_cleanup). Der frühereappUpdater.js-Patch ist seit 10.0 upstream behoben und entfernt.android-cli: blendet auf Android sinnlose Bedienelemente aus (.msc,.copy,.diffall, Firmware-Flasher- und SITL-Tab, im Map Generator „Eject SD Card“) und ersetzt den CLI-Save-Handler durch das Ein-Knopf-Backup; ergänzt nach „Aus Datei laden" ein automatischessave.
Findet ein Patch seine Code-Stelle nicht mehr, warnt der Build. Build-Target ist
es2022, weil Upstream ab 10.0 Top-Level-awaitnutzt (js/browser-entry.js). -
android-src/— native Capacitor-PluginsUsbSerialPlugin.java(USB Host API via usb-serial-for-android) undFileDialogPlugin.java(Storage Access Framework für Datei-Dialoge), dazuMainActivity.java. Wichtig: Der WebView-User-Agent bekommt den ZusatzElectron/0.0.0-android, weil der Upstream die Electron-Version aus dem User-Agent parst und sonst crasht.
Datenfluss: UI (unverändert) → window.electronAPI (Shim) → Capacitor → natives Plugin → USB-OTG / SAF
Wichtige Vertragsdetails, die der Shim exakt einhält (aus dem Upstream-Code abgeleitet):
listSerialDevices()liefert ein Array nackter Pfad-Strings ohne Doppelpunkt (Formatusb-<deviceId>);port_handler.jsfiltert alles mit:heraus.serialConnect()liefert{error: false, id}— ohneidsendet die App nichts.serialSend()→{bytesWritten}bzw.{error, msg};serialClose()feuert zusätzlich dasserialClose-Event (sonst bleibt der Disconnect wirkungslos).writeFile()löst mit falsy bei Erfolg auf;readFile()liefert{error, data};showOpenDialog()liefertfilePathsals Array. Als „Pfad" wird diecontent://-URI aus dem Android-Dialog durchgereicht.
Sichern: CLI-Tab → „In Datei speichern". Die App führt automatisch diff all aus,
wartet auf die vollständige Ausgabe und öffnet dann den Android-Speicherdialog —
Ordner und Dateiname frei wählbar, Vorschlag cli_<board>_<datum>.txt. Die Statuszeile
meldet die geschriebene Größe in Bytes.
Wiederherstellen: CLI-Tab → „Aus Datei laden" → Datei wählen (Android startet im
zuletzt benutzten Ordner) → Vorschau bestätigen. Die Befehle gehen an den FC, danach
sendet die App automatisch save; die Statuszeile meldet „Settings applied and saved."
Schlägt das fehl, erscheint ein Hinweis, „Einstellungen speichern" manuell zu drücken.
ℹ️ Cloud-Ordner: Wird als Ziel ein Sync-Anbieter (z.B. Nextcloud) gewählt, zeigt der Dateimanager die Datei zunächst mit 0 Bytes — der Anbieter materialisiert sie erst verzögert, oft erst nach Beenden der Apps. Die Byte-Angabe in der Statuszeile ist die verlässliche Auskunft darüber, was tatsächlich geschrieben wurde. Wer es sofort greifbar will, speichert lokal (Downloads/Dokumente) und lädt anschließend hoch.
Voraussetzungen: Node ≥ 20, Android Studio (mit SDK + mitgeliefertem JDK), Git.
git clone --recursive https://github.com/Bingo2023/inav-configurator-android.git
cd inav-configurator-android
npm install # installiert auch Submodule-Deps (postinstall)
npm run sync # Vite-Build mit Shims + Capacitor-Sync
cd android && ./gradlew assembleDebug # → app/build/outputs/apk/debug/app-debug.apkWindows/Git Bash: export JAVA_HOME="/c/Program Files/Android/Android Studio/jbr"
(am besten in ~/.bashrc).
Wird das android/-Verzeichnis neu erzeugt (npx cap add android), müssen die Dateien
aus android-src/ erneut eingespielt werden — siehe android-src/manifest-snippet.xml
und android-src/gradle-snippet.txt; beide Plugins werden in MainActivity.java
registriert.
./scripts/update-upstream.sh <tag-oder-commit> # z.B. 9.1.1 oder 19ba259Hinweis: INAV veröffentlicht Releases gelegentlich ohne Git-Tag — dann den Commit-Hash von der GitHub-Release-Seite verwenden.
Das Skript checkt aus, installiert, baut und synct — und druckt eine Prüfliste. Die drei Stellen, an denen ein Update reiben kann:
- Preload-Diff (macht das Skript automatisch gegen den vorherigen Stand):
neue/geänderte Brücken-Funktionen →
shim/electron-api.jsnachziehen. (Beispiel 9.1.1:confirmDialogwurde asynchron, drei Backup-Funktionen kamen dazu. Beispiel 10.0:pathExistsundejectDrivekamen dazu.) Zusätzlich listet das Skript alleelectronAPI.*-Aufrufe im Renderer, die der Shim nicht kennt. - Build-Warnungen lesen:
[upstream-patches] …oder[android-cli] …mit „nicht gefunden" heißt, eine gepatchte Stelle ist umgezogen oder wurde upstream gefixt → Patch invite.config.mobile.mjsprüfen, anpassen oder entfernen. - Neue Node-/Electron-Imports (greppt das Skript): ggf. neuen Alias/Shim ergänzen.
Nach dem Test: Submodule-Pin committen (git add inav-configurator && git commit …).
npm update/npm audit fix im Submodule-Ordner ausführen — das
verändert dessen package.json/yarn.lock und bricht das Prinzip „unveränderte
Quelle". Falls doch passiert: git -C inav-configurator restore package.json yarn.lock.
Releases werden mit einem festen Release-Schlüssel signiert (seit 10.0.0-rc1; davor Debug-Schlüssel wechselnder Rechner). Der Schlüssel liegt nicht im Repo.
$env:INAV_KEYSTORE_PROPERTIES = 'D:\Android\keys\keystore.properties'
npm run sync
cd android; .\gradlew.bat assembleRelease
# → android/app/build/outputs/apk/release/app-release.apkkeystore.properties enthält storeFile, storePassword, keyAlias, keyPassword.
Vor dem Release: version in package.json setzen (wird zur APK-versionName) und
versionCode in android/app/build.gradle erhöhen. Tag v<version>, GitHub-Release
mit der APK als INAV.Configurator.Android_<version>.apk.
- Beim Betreten des CLI-Tabs erscheinen kurz Binärzeichen (
$X…) in der Konsole: noch unterwegs befindliche MSP-Antworten, die als Text dargestellt werden. Rein optisch, ohne Auswirkung auf den Diff — „Bildschirm leeren" räumt sie weg. - Die Oberfläche ist für Desktop-Breiten gebaut; Tablet oder Querformat empfohlen.
- Die APK ist Debug-signiert (nicht aus dem Play Store) — bei der Installation muss „Unbekannte Quellen" für den Datei-Manager erlaubt werden.
GPL-3.0, wie der Upstream.