diff --git a/README.md b/README.md index ae02cf4..d380ab4 100644 --- a/README.md +++ b/README.md @@ -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: diff --git a/provision/adb-wireless.sh b/provision/adb-wireless.sh new file mode 100755 index 0000000..165903d --- /dev/null +++ b/provision/adb-wireless.sh @@ -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 _ ' + read -r PAIR_ZIEL ' +read -r CODE ' + read -r CONNECT_ZIEL /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 ' + read -r _ /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 " 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/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 < hpos && cd hpos - pkg install -y git - git clone 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 diff --git a/spike/README.md b/spike/README.md index e6a87f6..bdd4d0f 100644 --- a/spike/README.md +++ b/spike/README.md @@ -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