# 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.