# Android-Share

Android ist Linux, und das `usb-client`-Binary laeuft dort unveraendert
(`GOARCH=arm64`). Der Haken sitzt woanders: eine App darf `/dev/bus/usb` nicht
oeffnen und sysfs nicht durchsuchen. Geraetezugriff laeuft ausschliesslich
ueber das Framework, das einen Berechtigungsdialog zeigt und einen **bereits
geoeffneten Dateideskriptor** zurueckgibt.

Diese App tut deshalb genau drei Dinge:

1. Geraete ueber `UsbManager` auflisten und Berechtigung erfragen
2. Deskriptor und Rohdeskriptoren an das Go-Binary uebergeben
3. Das Binary als Kindprozess starten und am Leben halten

Das Go-Binary macht danach alles Weitere selbst — es spricht dieselben
usbdevfs-ioctls wie auf jedem anderen Linux, nur der Weg zum Dateideskriptor
ist ein anderer.

```
┌──────────────────────────┐
│ App (Kotlin)             │
│  UsbManager              │
│  → Berechtigungsdialog   │
│  → openDevice()          │
│  → getRawDescriptors()   │
└───────────┬──────────────┘
            │ Unix-Socket, fd per SCM_RIGHTS
┌───────────▼──────────────┐
│ usb-client (Go, arm64)   │
│  usbdevfs-ioctls auf fd  │
│  → Relay / Direkttunnel  │
└──────────────────────────┘
```

## Status

Der Go-seitige Teil ist fertig und getestet (`internal/bridge`). Was hier
liegt, ist die App-Seite als **Referenzimplementierung**: der Code ist
vollstaendig, aber ich konnte ihn nicht bauen oder auf einem Geraet laufen
lassen. Er braucht Android Studio, ein Geraet mit USB-OTG und vermutlich ein
paar Korrekturen. Die Protokollseite ist der verlaessliche Teil — sie hat
Tests.

## Bauen

```bash
# 1. Go-Binary fuer Android bauen und in die App legen
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags="-s -w" \
    -o android/app/src/main/jniLibs/arm64-v8a/libusbclient.so ./cmd/usb-client/

# 2. App bauen
cd android && ./gradlew assembleDebug
```

Die Endung `.so` ist kein Versehen: Android extrahiert nur Dateien aus
`jniLibs`, die so heissen, und nur die duerfen ausgefuehrt werden. Ein
normales Binary in den Assets bekaeme kein Ausfuehrungsrecht.

## Grenzen

- **Nur Share.** Der Use-Modus braucht `vhci-hcd`, und das ist in
  Android-Kerneln praktisch nie aktiviert. Ein Telefon kann seine Geraete
  also anbieten, aber keine fremden empfangen.
- **Berechtigung pro Geraet.** Der Dialog erscheint fuer jedes Geraet
  einzeln; ohne Bestaetigung gibt es keinen Deskriptor.
- **Der Kernel muss OTG unterstuetzen.** Ohne USB-Host-Modus gibt es nichts
  zu teilen.
- **Doze.** Android schlaefert Hintergrundprozesse ein. Die App laeuft
  deshalb als Foreground-Service mit Notification; ohne das beendet das
  System den Tunnel nach kurzer Zeit.
