Provisioning ohne Kabel: ADB über WLAN

provision.sh fragt beim Start nach USB oder WLAN, statt ohne Gerät einfach
abzubrechen. Der WLAN-Weg braucht kein Kabel — Android 11 und neuer koppeln
per sechsstelligem Code.

adb-wireless.sh sucht Kopplungs- und Verbindungsdienst per mDNS, statt die
Adressen abtippen zu lassen. Beide Ports vergibt Android bei jedem Einschalten
neu, und sie sind verschieden — das ist die häufigste Verwechslung dabei.
Fällt auf manuelle Eingabe zurück, wenn das Netz Multicast blockiert.

provision.sh kann die Skripte anschließend per adb push aufs Telefon legen.
Das erspart es, Zugangsdaten für ein privates Repo auf einer Bildschirmtastatur
einzutippen. Mit dem Hinweis, dass /sdcard keine Ausführungsrechte kennt und
die Dateien deshalb erst nach ~ kopiert werden müssen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan
2026-08-09 17:43:31 +02:00
co-authored by Claude Opus 5
parent ad2c98443b
commit d334219c4f
4 changed files with 257 additions and 11 deletions
+2 -1
View File
@@ -42,7 +42,8 @@ Ergebnisse landen in [`docs/spike-protokoll.md`](docs/spike-protokoll.md).
Getestet wird auf einem **OnePlus 7 Pro (Snapdragon 855, Adreno 640) mit Stock OxygenOS 12**.
```bash
# 1. Auf dem PC, Telefon per USB, USB-Debugging an:
# 1. Auf dem PC. Verbindet per USB oder WLAN — das Skript fragt danach.
# Ein Kabel wird nicht gebraucht: Android 11+ kann Wireless Debugging.
./provision/provision.sh
# 2. Auf dem Telefon in Termux:
+151
View File
@@ -0,0 +1,151 @@
#!/usr/bin/env bash
# HPOS — ADB über WLAN verbinden, ohne USB-Kabel.
#
# 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.
#
# Aufruf: ./provision/adb-wireless.sh
set -uo pipefail
if [ -t 1 ]; then
C_OK=$'\033[32m'; C_WARN=$'\033[33m'; C_ERR=$'\033[31m'
C_HEAD=$'\033[1;36m'; C_DIM=$'\033[2m'; C_OFF=$'\033[0m'
else
C_OK=""; C_WARN=""; C_ERR=""; C_HEAD=""; C_DIM=""; C_OFF=""
fi
kopf() { printf '\n%s══ %s ══%s\n' "$C_HEAD" "$*" "$C_OFF"; }
ok() { printf '%s ✓%s %s\n' "$C_OK" "$C_OFF" "$*"; }
warn() { printf '%s !%s %s\n' "$C_WARN" "$C_OFF" "$*"; }
fehl() { printf '%s ✗%s %s\n' "$C_ERR" "$C_OFF" "$*"; }
hinweis() { printf '%s %s%s\n' "$C_DIM" "$*" "$C_OFF"; }
command -v adb >/dev/null 2>&1 || { fehl "adb nicht gefunden."; exit 1; }
# Ab Version 30 gibt es 'adb pair'. Ältere Fassungen können Wireless Debugging nicht.
if ! adb pair 2>&1 | grep -q 'usage: adb pair'; then
fehl "Dieses adb kennt 'adb pair' nicht — zu alt für Wireless Debugging."
hinweis "Aktuelle platform-tools von developer.android.com/tools/releases/platform-tools"
exit 1
fi
adb start-server >/dev/null 2>&1
# 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
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
printf '.' >&2
sleep 1
done
return 1
}
# ── Schon verbunden? ─────────────────────────────────────────────────────────
kopf "Aktueller Stand"
VERBUNDEN=$(adb devices | grep -w 'device$' | wc -l)
if [ "$VERBUNDEN" -gt 0 ]; then
adb devices | grep -w 'device$' | sed 's/^/ /'
ok "Es ist bereits ein Gerät verbunden."
hinweis "Weiter mit: ./provision/provision.sh"
exit 0
fi
hinweis "Kein Gerät verbunden — Kopplung wird eingerichtet."
# ── Anleitung ────────────────────────────────────────────────────────────────
kopf "Auf dem Telefon"
cat <<'TEXT'
1. Sicherstellen, dass Telefon und dieser Rechner im SELBEN WLAN sind.
Ein Gäste-WLAN oder eine aktive Client-Isolierung verhindert die Verbindung.
2. Einstellungen → System → Entwickleroptionen → "Drahtloses Debugging" EIN
3. Dort auf "Gerät mit Kopplungscode koppeln" tippen.
Es erscheint ein sechsstelliger Code und eine Adresse.
Dieses Fenster BITTE OFFEN LASSEN, bis die Kopplung durch ist —
der Kopplungsdienst verschwindet sonst sofort wieder.
TEXT
printf '\n Wenn das Fenster mit dem Code offen ist, hier Enter drücken > '
read -r _ </dev/tty
# ── Kopplung ─────────────────────────────────────────────────────────────────
kopf "Kopplungsdienst suchen"
printf ' Suche per mDNS '
if PAIR_ZIEL=$(suche_dienst _adb-tls-pairing._tcp 25); then
printf '\n'; ok "gefunden: $PAIR_ZIEL"
else
printf '\n'; warn "Nichts per mDNS gefunden."
hinweis "Manche Netze blockieren Multicast, dann klappt die automatische Suche nicht."
printf ' Adresse aus dem Kopplungsfenster eintippen (IP:PORT) > '
read -r PAIR_ZIEL </dev/tty
[ -n "$PAIR_ZIEL" ] || { fehl "Ohne Adresse geht es nicht."; exit 1; }
fi
printf ' Sechsstelligen Kopplungscode eingeben > '
read -r CODE </dev/tty
kopf "Koppeln"
if adb pair "$PAIR_ZIEL" "$CODE"; then
ok "Kopplung erfolgreich"
else
fehl "Kopplung fehlgeschlagen."
hinweis "Häufigste Ursachen: Code abgelaufen (er gilt nur kurz),"
hinweis "Fenster zu früh geschlossen, oder Telefon in einem anderen Netz."
exit 1
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."
printf ' Suche Verbindungsdienst '
if CONNECT_ZIEL=$(suche_dienst _adb-tls-connect._tcp 20); then
printf '\n'; ok "gefunden: $CONNECT_ZIEL"
else
printf '\n'; warn "Nichts per mDNS gefunden."
hinweis "Adresse steht auf der Hauptseite von 'Drahtloses Debugging'."
printf ' Adresse eintippen (IP:PORT) > '
read -r CONNECT_ZIEL </dev/tty
[ -n "$CONNECT_ZIEL" ] || { fehl "Ohne Adresse geht es nicht."; exit 1; }
fi
if adb connect "$CONNECT_ZIEL"; then
sleep 2
if adb devices | grep -qw 'device$'; then
ok "Verbunden"
adb devices | grep -w 'device$' | sed 's/^/ /'
else
fehl "Verbindung kam nicht zustande."
adb devices | sed 's/^/ /'
hinweis "Steht dort 'unauthorized', den Dialog auf dem Telefon bestätigen."
exit 1
fi
else
fehl "adb connect fehlgeschlagen."
exit 1
fi
# ── Weiter ───────────────────────────────────────────────────────────────────
kopf "Fertig"
cat <<TEXT
Jetzt läuft die Einrichtung wie mit Kabel:
./provision/provision.sh
Gut zu wissen für später:
· Die Kopplung bleibt bestehen. Nach einem Neustart des Telefons oder
nach dem Aus- und Einschalten von "Drahtloses Debugging" ändert sich
aber 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
+97 -9
View File
@@ -5,8 +5,8 @@
# System mit gewöhnlichen App-Berechtigungen aus — das ist eine harte Regel des
# Projekts, siehe CONTRIBUTING.md.
#
# Voraussetzung: Telefon per USB, Entwickleroptionen und USB-Debugging aktiv,
# der Dialog "Diesem Computer vertrauen" bestätigt.
# Voraussetzung: Entwickleroptionen aktiv. Die Verbindung geht per USB-Kabel ODER
# per WLAN (Android 11 und neuer) — das Skript fragt danach, wenn kein Gerät da ist.
#
# Aufruf: ./provision/provision.sh [--dry-run]
set -uo pipefail
@@ -55,13 +55,70 @@ adbs() {
kopf "Gerät"
command -v adb >/dev/null 2>&1 || { fehl "adb nicht gefunden. Bitte android-tools-adb installieren."; exit 1; }
HIER="$(cd "$(dirname "$0")" && pwd)"
ANZAHL=$(adb devices | grep -cw 'device$' || true)
# Ohne Gerät nicht einfach abbrechen: der häufigste Fall ist, dass gar kein Kabel
# zur Hand ist. Android 11+ kann Wireless Debugging, das reicht für alles hier.
if [ "$ANZAHL" -eq 0 ]; then
fehl "Kein Gerät verbunden oder nicht autorisiert."
hinweis "adb devices prüfen. Steht dort 'unauthorized', den Dialog auf dem Telefon bestätigen."
exit 1
warn "Kein Gerät verbunden."
if [ ! -t 0 ]; then
hinweis "Keine Eingabe möglich — bitte erst ./provision/adb-wireless.sh ausführen."
exit 1
fi
cat <<'TEXT'
Wie soll verbunden werden?
[u] USB-Kabel
Entwickleroptionen und USB-Debugging aktiv, Dialog "Diesem Computer
vertrauen" auf dem Telefon bestätigt.
[w] WLAN, ohne Kabel (Android 11 und neuer)
Einmalige Kopplung per sechsstelligem Code. Danach läuft alles
über das Netz — ein Kabel wird nie gebraucht.
[a] Abbrechen
TEXT
printf '\n Auswahl > '
read -r WAHL </dev/tty
case "$WAHL" in
w|W)
if [ ! -x "$HIER/adb-wireless.sh" ]; then
fehl "adb-wireless.sh nicht gefunden neben diesem Skript."
exit 1
fi
"$HIER/adb-wireless.sh" || exit 1
ANZAHL=$(adb devices | grep -cw 'device$' || true)
;;
u|U)
printf ' Kabel anschließen und Enter drücken > '
read -r _ </dev/tty
adb wait-for-device &
WARTE=$!
# Nicht ewig hängen bleiben, falls das Kabel nur lädt und keine Daten überträgt.
( sleep 60; kill "$WARTE" 2>/dev/null ) >/dev/null 2>&1 &
wait "$WARTE" 2>/dev/null
ANZAHL=$(adb devices | grep -cw 'device$' || true)
;;
*)
hinweis "Abgebrochen."
exit 0
;;
esac
if [ "$ANZAHL" -eq 0 ]; then
fehl "Es ist weiterhin kein Gerät verbunden."
adb devices | sed 's/^/ /'
hinweis "Steht dort 'unauthorized', den Dialog auf dem Telefon bestätigen."
exit 1
fi
ok "Gerät verbunden"
elif [ "$ANZAHL" -gt 1 ]; then
fehl "Mehrere Geräte verbunden — bitte nur eines anschließen."
fehl "Mehrere Geräte verbunden — bitte nur eines aktiv lassen."
adb devices | sed 's/^/ /'
hinweis "Überzählige trennen, per WLAN verbundene mit: adb disconnect <ip:port>"
exit 1
fi
@@ -142,14 +199,45 @@ case "$HERSTELLER" in
;;
esac
# ── Repo aufs Telefon ────────────────────────────────────────────────────────
# adb push funktioniert auch über WLAN. Das erspart es, auf dem Telefon Zugangsdaten
# für ein privates Repo eintippen zu müssen — auf einer Bildschirmtastatur eine Qual.
kopf "Skripte aufs Telefon"
REPO_ROOT="$(cd "$HIER/.." && pwd)"
ZIEL=/sdcard/hpos
if [ "$TROCKEN" = 1 ]; then
warn "Trockenlauf — es wird nichts übertragen."
else
printf ' Die Spike-Skripte jetzt nach %s übertragen? [J/n] > ' "$ZIEL"
read -r UEBERTRAGEN </dev/tty || UEBERTRAGEN=n
case "${UEBERTRAGEN:-j}" in
j|J|"")
adb shell rm -rf "$ZIEL" >/dev/null 2>&1
if adb push "$REPO_ROOT" "$ZIEL" >/dev/null 2>&1; then
ok "Übertragen nach $ZIEL"
hinweis "In Termux nach ~ kopieren, damit die Dateien ausführbar sein können:"
hinweis " cp -r /sdcard/hpos ~/hpos && cd ~/hpos"
hinweis "(auf /sdcard gibt es keine Ausführungsrechte — das ist normal)"
else
warn "Übertragung fehlgeschlagen — dann per git clone auf dem Telefon."
fi
;;
*) hinweis "Übersprungen." ;;
esac
fi
kopf "Fertig"
cat <<TEXT
Nächster Schritt auf dem Telefon, in Termux:
Nächste Schritte auf dem Telefon, in Termux:
cp -r /sdcard/hpos ~/hpos && cd ~/hpos # falls oben übertragen
# oder: pkg install -y git && git clone <repo-url> hpos && cd hpos
pkg install -y git
git clone <repo-url> hpos && cd hpos
bash spike/00-bootstrap-termux.sh
Danach die Beweise der Reihe nach — S1 zuerst, weil er der wackligste ist.
Ergebnisse gehören nach docs/spike-protokoll.md.
Nicht vergessen: die oben genannten Handgriffe von Hand erledigen.
Ohne sie beendet das ROM den Stack über Nacht.
TEXT
+7 -1
View File
@@ -25,10 +25,16 @@ Scheitert er, ist das ein früher Warnschuss fürs Gesamtkonzept, kein Detail.
- Etwa 6 GB freier Speicher (Debian-Rootfs, Plasma Mobile, Firefox)
- Geduld beim ersten Lauf: rund 1 GB Pakete
**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
Telefon übertragen, sodass dort keine Zugangsdaten für ein privates Repo auf einer
Bildschirmtastatur eingetippt werden müssen.
## Ablauf
```bash
# Einmalig, vom PC mit angeschlossenem Telefon
# Einmalig, vom PC. Fragt selbst nach USB oder WLAN.
./provision/provision.sh
# Auf dem Telefon in Termux