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:
@@ -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:
|
||||
|
||||
Executable
+151
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user