AndroidSA ist ein Android-Projekt für einen SA:MP- / Open:MP-orientierten Client-Prototypen. Das Repository kombiniert eine Jetpack-Compose-Oberfläche, eine Kotlin/JNI-Bridge und einen nativen C++20-Kern, um Verbindungsstatus, Serverprofile, Diagnosemeldungen und simulierten Netzwerkverkehr gemeinsam abzubilden.
- Projektüberblick
- Ziele
- Architektur
- Repository-Struktur
- Funktionsumfang
- Native Command-Spezifikation
- Build, Tests und CI
- Entwicklungsablauf
- Troubleshooting
- Lizenz
Die App visualisiert einen nativen Laufzeitzustand als Android-Oberfläche. Nutzer können Serverprofile verwalten, geführte Commands auslösen, manuelle Commands an die JNI-Bridge senden und die daraus resultierenden Status-, Statistik- und Eventdaten direkt beobachten.
Die Standarddarstellung umfasst:
- Client-Name und aktiven Transport
- Verbindungszustand und Diagnostik
- Server- und Spielerprofil
- Latenz, Paket-Zähler und Verbindungsversuche
- letzte ausgeführte Aktion
- begrenzte Event-Historie aus dem nativen Layer
- Android-Grundgerüst für eine spätere SA:MP- / Open:MP-Integration bereitstellen
- UI-, Bridge- und Native-Logik klar voneinander trennen
- JNI-Kommunikation mit deterministischer Command-Validierung absichern
- Netzwerknahe Zustandswechsel und Telemetrie reproduzierbar simulieren
- Build-, Test- und Release-Abläufe nachvollziehbar dokumentieren
Datei: app/src/main/java/com/xrdoge/xrpl/androidsa/MainActivity.kt
Die Compose-Oberfläche stellt mehrere Funktionsbereiche bereit:
- Session-Überblick mit Transport, Connection State, Diagnostics, Server und Player
- Runtime-Statistiken für Latenz, TX/RX-Pakete, Reconnect-Versuche und letzten Command
- Server-Browser mit vordefinierten und benutzerdefinierten Serverprofilen
- Guided Controls für Connect, Reconnect, Disconnect, Ping, Player, Transport, Latenz, Diagnostics und Reset
- manuelle Command-Eingabe mit sofortiger Validierungsrückmeldung
- Anzeige der letzten nativen Events
Wichtige UI-Eigenschaften:
- Snapshot wird beim Start asynchron geladen
- parallele Command-Dispatches werden per
Mutexblockiert - bei aktiver Verbindung werden Metriken zyklisch nachgeladen
- lokale Validierungsfehler werden direkt als Fehler-Snapshot eingeblendet
Datei: app/src/main/java/com/xrdoge/xrpl/androidsa/NativeBridge.kt
Die Bridge ist für folgende Aufgaben verantwortlich:
- Laden der nativen Bibliothek
androidsa - Validierung und Normalisierung eingehender Commands
- Parsen des nativen Summary-Formats
- Parsen und Begrenzen der nativen Event-Historie
- Vereinheitlichung von Fehlerzuständen, wenn Diagnostics auf native Fehler hindeuten
Dateien:
app/src/main/cpp/native-lib.cppapp/src/main/cpp/native/network/ClientState.happ/src/main/cpp/native/network/ClientState.cppapp/src/main/cpp/native/logging/Logger.happ/src/main/cpp/native/logging/Logger.cpp
Der Native-Layer hält den Laufzeitzustand thread-sicher und stellt JNI-Einstiegspunkte für Summary, Event-Log und Command-Dispatch bereit. Netzwerknahe Abläufe werden über einen Loopback-UDP-Flow simuliert. Eingehende Probe-Pakete werden dekodiert und als Events protokolliert.
AndroidSA/
├── .github/workflows/android-background-build.yml
├── CHANGELOG.md
├── Projectvorstellungs.md
├── README.md
├── docs/
│ └── RELEASE_CHECKLIST.md
├── app/
│ ├── README.md
│ ├── build.gradle.kts
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── cpp/
│ │ │ ├── README.md
│ │ │ ├── CMakeLists.txt
│ │ │ ├── native-lib.cpp
│ │ │ └── native/
│ │ │ ├── logging/
│ │ │ └── network/
│ │ ├── java/com/xrdoge/xrpl/androidsa/
│ │ │ ├── MainActivity.kt
│ │ │ └── NativeBridge.kt
│ │ └── res/values/strings.xml
│ └── test/java/com/xrdoge/xrpl/androidsa/
│ └── NativeBridgeTest.kt
├── build.gradle.kts
├── gradle.properties
├── gradlew
└── settings.gradle.kts
Die native Summary transportiert aktuell elf Felder:
AndroidSA|<transport>|<state>|<diagnostics>|<server>|<player>|<latencyMs>|<packetsSent>|<packetsReceived>|<connectionAttempts>|<lastCommand>
Die Kotlin-Seite ergänzt Fallback-Werte, wenn Segmente fehlen, leer sind oder numerische Werte ungültig bleiben.
- Standard-Serverprofile:
Demo EUundLocal Dev - benutzerdefinierte Serverprofile können in der UI ergänzt und wieder entfernt werden
connectnutzt das aktuell gespeicherte Serverprofilconnect:<server>setzt das Serverprofil und verbindet direktreconnectverwendet die zuletzt aktive Serveradresseresetstellt Transport, Diagnostics, Profile, Statistiken und Event-Historie auf Ausgangswerte zurück
packetsSentundpacketsReceivedwerden über realesendto- undrecvfrom-Aufrufe erhöht- empfangene UDP-Probes werden als RakNet-/Open:MP-orientierte Events beschrieben
- die UI zeigt die jüngsten Events; Kotlin kappt auf 48 Einträge, der native State hält eine kompakte Historie
pingconnectconnect:<server>reconnectdisconnectresetstatustransport:<name>player:<name>latency:<ms>simulate:rxsimulate:txdiagnostics:<text>fail:<reason>
Diese Regeln gelten in Kotlin und im nativen Layer:
- der Command wird getrimmt und darf nicht leer sein
- maximale Länge:
64Zeichen - keine Steuerzeichen
|ist verboten- wertbasierte Commands müssen die exakte Form
keyword:<value>nutzen latency:<ms>akzeptiert nur nicht-negative Integersimulate:<value>akzeptiert nurrxodertx
pingsetzt den State aufreadyconnectundconnect:<server>setzen den State aufconnecteddisconnectsetzt den State aufdisconnectedfail:<reason>setzt den State auferrorstatuserzeugt einen Diagnose-Snapshot ohne Profilwechsel
- JDK 17
- Android SDK 34
- minSdk 26
- Android NDK
27.3.13750724 - CMake 3.22.1+ (Android-Gradle-Konfiguration nutzt 3.31.5)
chmod +x ./gradlew
./gradlew build
./gradlew check build
./gradlew :app:build
./gradlew :app:check
./gradlew :app:testDebugUnitTestZusätzlich für native Host-Tests:
cmake -S app/src/main/cpp -B build/native-tests -DANDROIDSA_ENABLE_NATIVE_TESTS=ON
cmake --build build/native-tests --target client_state_test
ctest --test-dir build/native-tests --output-on-failurebuild/native-tests liegt unter build/ und ist per .gitignore vom Commit ausgeschlossen.
Wenn dl.google.com lokal nicht aufgelöst oder durch die Laufzeitumgebung blockiert wird, kann ein lokaler Mirror-Proxy für Google-Maven-Artefakte gestartet werden:
python3 tools/google_maven_proxy.py --port 38473
ANDROIDSA_GOOGLE_MAVEN_URL=http://127.0.0.1:38473/ ./gradlew check build
ANDROIDSA_GOOGLE_MAVEN_URL=http://127.0.0.1:38473/ ./gradlew :app:testDebugUnitTest :app:assembleDie Standard-Konfiguration bleibt unverändert auf google()/mavenCentral(). Der Proxy wird nur verwendet, wenn ANDROIDSA_GOOGLE_MAVEN_URL oder -Pandroidsa.google.maven.url=... explizit gesetzt ist.
Das Root-Projekt aktiviert base und verdrahtet:
build→:app:buildcheck→:app:check
Workflow-Datei: .github/workflows/android-background-build.yml
Die Pipeline führt aus:
- Checkout mit voller Historie
- JDK-17-Setup und Gradle-Cache
- Gradle-Setup und Wrapper-Validierung
- optionaler Start des lokalen Google-Maven-Proxys, wenn
dl.google.comnicht erreichbar ist - Warmup der Plugin- und Dependency-Auflösung mit Retry
- native Host-Tests via CMake/CTest
./gradlew --no-daemon :app:testDebugUnitTest --stacktracemit Retry./gradlew --no-daemon :app:assemble --stacktracemit Retry- Upload der Testreports als Artefakt
- fachliche Änderungen zuerst im passenden Layer lokalisieren
- Änderungen an Commands immer in Kotlin und C++ gegeneinander prüfen
- bei UI-Anpassungen Snapshot-, Busy- und Error-Flows mitdenken
- vor Releases
CHANGELOG.mdunddocs/RELEASE_CHECKLIST.mdaktualisieren - für eine kompakte Projektvorstellung siehe
Projectvorstellungs.md
- JNI-Library lädt nicht: sicherstellen, dass
androidsaerfolgreich gebaut wurde - Gradle-Abhängigkeiten schlagen fehl: Google Maven und Maven Central Erreichbarkeit prüfen; in blockierten Agent-Umgebungen den lokalen Mirror via
tools/google_maven_proxy.pyundANDROIDSA_GOOGLE_MAVEN_URL=http://127.0.0.1:38473/verwenden - Native Tests schlagen fehl: Build-Verzeichnis unter
build/native-testsneu erzeugen - Command wird abgelehnt: Syntax, Maximallänge, verbotene Zeichen und Wertebereich prüfen
- Keine Paketereignisse sichtbar: Connect- oder Simulations-Commands erneut auslösen, damit neue UDP-Probes erzeugt werden
-
Repository klonen und in das Projektverzeichnis wechseln.
-
Gradle Wrapper ausführbar machen:
chmod +x ./gradlew
-
Android-Toolchain bereitstellen:
- JDK 17
- Android SDK 34
- NDK
27.3.13750724 - CMake 3.22.1+
-
Optional in eingeschränkten Netzumgebungen den lokalen Google-Maven-Proxy starten:
python3 tools/google_maven_proxy.py --port 38473
-
Dependency-/Plugin-Auflösung vorwärmen:
./gradlew --no-daemon help :app:testDebugUnitTest :app:assemble --stacktrace --refresh-dependencies -
JVM-Unit-Tests ausführen:
./gradlew --no-daemon :app:testDebugUnitTest --stacktrace
-
Native Host-Tests ausführen:
cmake -S app/src/main/cpp -B build/native-tests -DANDROIDSA_ENABLE_NATIVE_TESTS=ON cmake --build build/native-tests --target client_state_test ctest --test-dir build/native-tests --output-on-failure
-
Vollständige Projektvalidierung abschließen:
./gradlew --no-daemon check build --stacktrace
Proprietary (XRDOGE-XRPL)