a11d67cf70
Cliente móvil nativo: embebe un peer real del bus (unibus.aar), de modo que el cifrado E2E y el transporte NATS corren en el dispositivo. - Conexión: Host (control plane) + NATS (data plane) + identidad; defaults 10.0.2.2 para el emulador, configurables (sin IPs hardcodeadas). - BusViewModel: llamadas de red del binding en Dispatchers.IO; los frames entrantes (FrameListener.onFrame, hilo NATS) se publican en un StateFlow thread-safe que Compose recolecta en el hilo principal. - Chat: crear/unir room (toggle cifrado), enviar, recibir. - El .aar es artefacto (gitignored); se regenera con gomobile bind (README). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
84 lines
2.9 KiB
Markdown
84 lines
2.9 KiB
Markdown
# unibus · app Android
|
|
|
|
Cliente móvil nativo de unibus. La app no habla con un gateway: embebe un **peer
|
|
real** del bus a través del binding gomobile `mobile/unibus.go`, de modo que el
|
|
cifrado extremo a extremo corre **en el dispositivo**. Cada teléfono es un peer
|
|
de primera clase del bus, igual que cualquier peer Go.
|
|
|
|
## Arquitectura
|
|
|
|
```
|
|
Kotlin/Compose UI ──> BusViewModel ──> com.unibus.core.mobile.Session (.aar)
|
|
│ (NATS data plane + E2E crypto, en Go)
|
|
▼
|
|
membershipd (control plane HTTP :8470)
|
|
NATS (data plane :4250)
|
|
```
|
|
|
|
- `BusViewModel` traduce intents de UI en llamadas al binding. Las llamadas de red
|
|
(`newSession`, `createRoom`, `join`, `publish`) corren en `Dispatchers.IO`.
|
|
- Los frames entrantes llegan por `FrameListener.onFrame` en una goroutine NATS
|
|
(hilo JNI); se publican en un `StateFlow` (thread-safe) que Compose recolecta en
|
|
el hilo principal.
|
|
|
|
## Requisitos
|
|
|
|
- Android SDK (compileSdk 34), NDK (para regenerar el `.aar`), JDK 17.
|
|
- El binding `app/libs/unibus.aar` (no versionado: es un artefacto de ~24 MB).
|
|
|
|
## 1. Generar el binding (.aar)
|
|
|
|
Desde la raíz del repo de la app (`projects/message_bus/apps/unibus`):
|
|
|
|
```bash
|
|
export ANDROID_HOME=$HOME/android-sdk
|
|
export ANDROID_NDK_HOME=$HOME/android-sdk/ndk/26.3.11579264
|
|
mkdir -p android/app/libs
|
|
gomobile bind -target=android -androidapi 21 -javapkg com.unibus.core \
|
|
-o android/app/libs/unibus.aar ./mobile
|
|
```
|
|
|
|
Esto produce `unibus.aar` con la clase estática `com.unibus.core.mobile.Mobile`
|
|
(`generateIdentity`, `newSession`) y los tipos `Session` y `FrameListener`.
|
|
|
|
## 2. Compilar el APK
|
|
|
|
```bash
|
|
cd android
|
|
export JAVA_HOME=$HOME/android-sdk/jdk-17/jdk-17.0.19+10
|
|
export ANDROID_HOME=$HOME/android-sdk
|
|
./gradlew assembleDebug
|
|
# APK: app/build/outputs/apk/debug/app-debug.apk
|
|
```
|
|
|
|
`local.properties` apunta a `sdk.dir`; ajústalo si tu SDK está en otra ruta.
|
|
|
|
## 3. Arrancar el bus y probar en el emulador
|
|
|
|
```bash
|
|
# 1. En el PC: control plane + NATS embebido (HTTP :8470, NATS :4250)
|
|
cd projects/message_bus/apps/unibus && go run ./cmd/membershipd
|
|
|
|
# 2. Emulador Pixel_API34
|
|
$ANDROID_HOME/emulator/emulator -avd Pixel_API34 &
|
|
|
|
# 3. Instalar + lanzar
|
|
adb install -r app/build/outputs/apk/debug/app-debug.apk
|
|
adb shell am start -n com.unibus.app/.MainActivity
|
|
```
|
|
|
|
En la pantalla de conexión, desde el emulador el host del PC es `10.0.2.2`:
|
|
|
|
- **Host (control plane):** `http://10.0.2.2:8470`
|
|
- **NATS (data plane):** `nats://10.0.2.2:4250`
|
|
|
|
Para un teléfono físico en la misma LAN, usa la IP LAN del PC en lugar de
|
|
`10.0.2.2`.
|
|
|
|
## Notas
|
|
|
|
- La identidad del peer se guarda en `filesDir/peer.id` (claves privadas
|
|
Ed25519 + X25519). No se sincroniza ni se respalda.
|
|
- Una room creada en modo "cifrar (E2E)" usa la política Matrix (cifrada,
|
|
persistida, firmada); en modo normal usa NATS cleartext.
|