diff --git a/provision/adb-wireless.sh b/provision/adb-wireless.sh index ed24f5a..abfb91a 100755 --- a/provision/adb-wireless.sh +++ b/provision/adb-wireless.sh @@ -4,15 +4,33 @@ # Android 11 und neuer bringen "Wireless Debugging" mit: einmal per sechsstelligem # Code koppeln, danach verbindet sich adb über das Netz. Ein Kabel wird nie gebraucht. # -# Die Ports vergibt Android bei jedem Einschalten neu — deshalb werden sie hier per -# mDNS gesucht statt abgetippt. Wichtig: Kopplungs- und Verbindungsport sind zwei -# verschiedene Dinge, das ist die häufigste Verwechslung. +# Zwei Dinge, die regelmäßig für Verwirrung sorgen und die dieses Skript deshalb +# auseinanderhält: # -# Aufruf: ./provision/adb-wireless.sh +# · Die KOPPLUNG bleibt dauerhaft bestehen. Nur die VERBINDUNG geht verloren, +# und der Port wechselt bei jedem Einschalten. Ein zweiter Kopplungscode wird +# daher nie gebraucht — deshalb wird immer erst ein Verbindungsversuch gemacht. +# · Kopplungsport und Verbindungsport sind VERSCHIEDEN. Der eine steht im +# Kopplungsfenster, der andere auf der Hauptseite von "Drahtloses Debugging". +# +# Aufruf: ./provision/adb-wireless.sh +# Umgebung: HPOS_ADB_MANUELL=1 überspringt die mDNS-Suche und fragt direkt nach +# der Adresse (nützlich, wenn das Netz kein +# Multicast durchlässt) set -uo pipefail - source "$(dirname "$0")/lib.sh" +# Das Skript lebt von Rückfragen und liest bewusst aus /dev/tty statt von stdin — +# sonst würde eine Pipe die Antworten wegfressen. Ohne Terminal ist das aussichtslos, +# und ein klarer Hinweis ist besser als eine Kette von /dev/tty-Fehlern. +# Umleitungen wertet bash von links nach rechts aus — 2>/dev/null muss deshalb VOR +# dem Schreibversuch stehen, sonst landet der Fehler trotzdem auf dem Bildschirm. +if ! { : 2>/dev/null >/dev/tty; }; then + fehl "Dieses Skript braucht ein Terminal für die Rückfragen." + hinweis "Bitte direkt in einer Shell aufrufen, nicht in einer Pipe oder aus einem Dienst." + exit 1 +fi + kopf "Werkzeug" if adb_einrichten; then ok "adb $(adb_version "$ADB_BIN") — kann WLAN-Kopplung" @@ -24,11 +42,15 @@ else fi adb start-server >/dev/null 2>&1 +# ── Hilfsmittel ────────────────────────────────────────────────────────────── + +ist_verbunden() { adb devices | grep -qw 'device$'; } + # Sucht einen mDNS-Dienst und gibt HOST:PORT zurück. Der Kopplungsdienst wird nur # angekündigt, solange der Kopplungsdialog auf dem Telefon offen ist — deshalb wird # wiederholt gesucht statt einmal. suche_dienst() { - local typ="$1" versuche="${2:-20}" i zeile + local typ="$1" versuche="${2:-15}" i zeile for ((i = 1; i <= versuche; i++)); do zeile=$(adb mdns services 2>/dev/null | awk -v t="$typ" '$2 == t {print $3; exit}') if [ -n "$zeile" ]; then printf '%s' "$zeile"; return 0; fi @@ -38,7 +60,71 @@ suche_dienst() { return 1 } -ist_verbunden() { adb devices | grep -qw 'device$'; } +plausibel() { + case "$1" in + *:[0-9]*) return 0 ;; + *) return 1 ;; + esac +} + +# Wie die Adresse ermittelt wird — einmal gefragt, dann für beide Schritte gemerkt. +# mDNS ist bequem, scheitert aber in Netzen, die Multicast filtern. Das ist keine +# Seltenheit und kein Fehler des Nutzers, deshalb steht die manuelle Eingabe +# gleichberechtigt daneben statt nur als Notnagel nach einer Wartezeit. +ADRESS_MODUS="${HPOS_ADB_MANUELL:+manuell}" + +modus_erfragen() { + [ -n "$ADRESS_MODUS" ] && return 0 + { + printf '\n Wie soll die Adresse ermittelt werden?\n\n' + printf ' [m] automatisch per mDNS (bequem, scheitert in manchen Netzen)\n' + printf ' [e] von Hand eingeben (Adresse steht auf dem Telefon)\n\n' + printf ' Auswahl [m] > ' + } >&2 + local wahl + read -r wahl &2 + if ziel=$(suche_dienst "$typ" "$wartezeit"); then + printf '\n' >&2 + ok "gefunden: $ziel" >&2 + printf '%s' "$ziel" + return 0 + fi + printf '\n' >&2 + warn "Per mDNS nichts gefunden." >&2 + hinweis "Viele Netze filtern Multicast — dann hilft nur die Eingabe von Hand." >&2 + ADRESS_MODUS=manuell + continue + fi + + hinweis "$wo" >&2 + printf ' Adresse eingeben (IP:PORT), [m] für mDNS, leer für Abbruch > ' >&2 + read -r ziel &2 + hinweis "Beispiel: 192.168.178.42:37123" >&2 + done +} weiter_mit_provision() { adb devices | grep -w 'device$' | sed 's/^/ /' @@ -48,28 +134,18 @@ weiter_mit_provision() { ./provision/provision.sh - Gut zu wissen: ADB wird in diesem Projekt nur für die Ersteinrichtung - gebraucht. Im Dauerbetrieb kommt HPOS ohne Privilegienkanal aus. + Für später: die Kopplung bleibt bestehen. Nach einem Neustart oder nach dem + Aus- und Einschalten von "Drahtloses Debugging" ändert sich nur der Port — + dann genügt dieses Skript erneut, ohne neuen Code. + + ADB wird in diesem Projekt nur für die Ersteinrichtung gebraucht. Im + Dauerbetrieb kommt HPOS ohne Privilegienkanal aus. Trennen mit: adb disconnect TEXT } -# Versucht zu verbinden und meldet Erfolg. Die Adresse kommt per mDNS oder, -# wenn das Netz kein Multicast durchlässt, von Hand. -verbinden_versuchen() { - local wartezeit="${1:-8}" ziel - printf ' Suche Verbindungsdienst ' >&2 - if ziel=$(suche_dienst _adb-tls-connect._tcp "$wartezeit"); then - printf '\n' >&2 - ok "gefunden: $ziel" - else - printf '\n' >&2 - return 1 - fi - adb connect "$ziel" >/dev/null 2>&1 - sleep 2 - ist_verbunden -} +WO_VERBINDUNG="Auf dem Telefon: Drahtloses Debugging → 'IP-Adresse und Port' (Hauptseite)" +WO_KOPPLUNG="Auf dem Telefon: im Fenster 'Mit Kopplungscode koppeln' (ANDERER Port!)" # ── Schon verbunden? ───────────────────────────────────────────────────────── kopf "Aktueller Stand" @@ -80,23 +156,39 @@ if ist_verbunden; then fi # ── Erst verbinden, dann erst koppeln ──────────────────────────────────────── -# Die Kopplung bleibt dauerhaft bestehen — nur die Verbindung geht verloren, und -# der Port ändert sich bei jedem Einschalten. Wer schon einmal gekoppelt hat, -# braucht deshalb keinen neuen Code, sondern nur ein neues connect. Ohne diesen -# Schritt landet man bei jedem Aufruf wieder im Kopplungsdialog. -hinweis "Kein Gerät verbunden. Prüfe zuerst, ob schon eine Kopplung besteht …" -if verbinden_versuchen 8; then - ok "Bereits gekoppelt — es war nur die Verbindung weg." - weiter_mit_provision - exit 0 -fi -hinweis "Keine bestehende Kopplung nutzbar — richte eine neue ein." +# Wer schon einmal gekoppelt hat, braucht keinen neuen Code, sondern nur ein neues +# connect. Ohne diesen Schritt landet man bei jedem Aufruf wieder im Kopplungsdialog. +hinweis "Kein Gerät verbunden." +printf '\n Wurde dieses Telefon hier schon einmal gekoppelt? [j/N] > ' +read -r SCHON_GEKOPPELT ' read -r _ ' - read -r PAIR_ZIEL ' @@ -136,8 +221,6 @@ else fi # ── Verbinden ──────────────────────────────────────────────────────────────── -# Der Verbindungsport ist ein ANDERER als der Kopplungsport. Er steht auf der -# Hauptseite von "Drahtloses Debugging" unter "IP-Adresse und Port". kopf "Verbinden" hinweis "Das Kopplungsfenster kann jetzt geschlossen werden." @@ -149,33 +232,22 @@ if ist_verbunden; then exit 0 fi -if verbinden_versuchen 20; then +if ! ZIEL=$(adresse_holen _adb-tls-connect._tcp "$WO_VERBINDUNG" 20); then + fehl "Ohne Adresse geht es nicht." + hinweis "Die Kopplung ist aber erfolgt — beim nächsten Aufruf 'j' antworten." + exit 1 +fi + +adb connect "$ZIEL" +sleep 2 +if ist_verbunden; then ok "Verbunden" weiter_mit_provision exit 0 fi -warn "Nichts per mDNS gefunden." -hinweis "Manche Netze blockieren Multicast. Die Adresse steht auf der Hauptseite" -hinweis "von 'Drahtloses Debugging' unter 'IP-Adresse und Port'." -hinweis "Achtung: das ist ein ANDERER Port als der aus dem Kopplungsfenster." -printf ' Adresse eintippen (IP:PORT) > ' -read -r CONNECT_ZIEL /dev/null | tr -d '\r' | grep -q "^package:$TERM ok "$TERMUX ist installiert" else fehl "$TERMUX ist nicht installiert." - hinweis "Termux von F-Droid oder GitHub installieren, dann dieses Skript erneut laufen lassen." - hinweis "Nicht aus dem Play Store — die dortige Fassung ist veraltet und unbrauchbar." + cat <<'TEXT' + + Termux muss zuerst aufs Telefon. WICHTIG: nicht aus dem Play Store — die + Fassung dort ist seit Jahren nicht mehr gepflegt und für dieses Projekt + unbrauchbar. Alle Bestandteile müssen aus derselben Quelle stammen, sonst + passen die Signaturen nicht zusammen und die Zusatz-Apps verweigern den Dienst. + + Empfohlen — F-Droid: + Termux https://f-droid.org/packages/com.termux/ + Termux:API https://f-droid.org/packages/com.termux.api/ + Termux:Boot https://f-droid.org/packages/com.termux.boot/ + + Oder direkt von GitHub: + Termux https://github.com/termux/termux-app/releases/latest + Termux:API https://github.com/termux/termux-api/releases/latest + Termux:Boot https://github.com/termux/termux-boot/releases/latest + + Termux:X11 gibt es nur bei GitHub (Nightly, app-universal-debug.apk): + https://github.com/termux/termux-x11/releases + + Auf dem Telefon einfach im Browser öffnen und die APK installieren. + "Installation aus unbekannten Quellen" muss für den Browser erlaubt sein. +TEXT + if [ "$TROCKEN" != 1 ]; then + printf '\n Soll ich die Termux-Seite auf dem Telefon öffnen? [J/n] > ' + read -r OEFFNEN /dev/null 2>&1 \ + && ok "Seite auf dem Telefon geöffnet" \ + || warn "Konnte den Browser nicht starten — bitte von Hand aufrufen." + ;; + esac + fi + printf '\n' + hinweis "Danach dieses Skript erneut aufrufen." exit 1 fi diff --git a/spike/README.md b/spike/README.md index bdd4d0f..84fb3bd 100644 --- a/spike/README.md +++ b/spike/README.md @@ -19,12 +19,31 @@ Scheitert er, ist das ein früher Warnschuss fürs Gesamtkonzept, kein Detail. ## Voraussetzungen - Android-Telefon, Adreno 6xx/7xx bevorzugt (Turnip-Pfad) -- **Termux von F-Droid oder GitHub** — nicht aus dem Play Store, die Fassung dort ist - veraltet und unbrauchbar +- Termux samt Zusatz-Apps — siehe unten - Einmalig `provision/provision.sh` vom PC, plus die dort genannten Handgriffe von Hand - Etwa 6 GB freier Speicher (Debian-Rootfs, Plasma Mobile, Firefox) - Geduld beim ersten Lauf: rund 1 GB Pakete +### Termux installieren + +**Nicht aus dem Play Store** — die Fassung dort wird seit Jahren nicht mehr gepflegt und +ist für dieses Projekt unbrauchbar. Alle Bestandteile müssen aus **derselben Quelle** +stammen, sonst passen die Signaturen nicht zusammen und die Zusatz-Apps verweigern den Dienst. + +| App | F-Droid | GitHub | +|---|---|---| +| Termux | [f-droid.org](https://f-droid.org/packages/com.termux/) | [Releases](https://github.com/termux/termux-app/releases/latest) | +| Termux:API | [f-droid.org](https://f-droid.org/packages/com.termux.api/) | [Releases](https://github.com/termux/termux-api/releases/latest) | +| Termux:Boot | [f-droid.org](https://f-droid.org/packages/com.termux.boot/) | [Releases](https://github.com/termux/termux-boot/releases/latest) | +| Termux:X11 | — | [Releases](https://github.com/termux/termux-x11/releases) (Nightly, `app-universal-debug.apk`) | + +Termux:X11 gibt es nur bei GitHub. Wer die anderen drei von F-Droid nimmt, muss +Termux:X11 trotzdem von dort holen — das ist in Ordnung, weil Termux:X11 eine +eigenständige App ohne Signaturbindung an Termux ist. + +Fehlt Termux, bietet `provision.sh` an, die Download-Seite direkt auf dem Telefon +zu öffnen. + **Ein USB-Kabel wird nicht gebraucht.** Ab Android 11 geht die Ersteinrichtung über WLAN — `provision.sh` fragt beim Start, ob per Kabel oder per Netz verbunden werden soll, und übernimmt die Kopplung. Es kann die Skripte anschließend auch gleich aufs