adb gezielt auswählen statt der PATH-Reihenfolge zu vertrauen
Debians Paket android-tools-adb liefert Version 29 und kennt kein 'adb pair' — das kam erst mit platform-tools 30. Wer beides installiert hat, bekommt je nach PATH-Reihenfolge und Alter der Terminalsitzung mal das eine und mal das andere, und die WLAN-Kopplung scheitert scheinbar grundlos. provision/lib.sh sucht deshalb gezielt eine Fassung, die 'pair' beherrscht, und schiebt eine Shell-Funktion 'adb' davor, sodass die Aufrufstellen unverändert bleiben. Eine ausdrücklich gesetzte Vorgabe ADB= gilt absolut, auch wenn sie kein pair kann — stillschweigend etwas anderes zu nehmen wäre die unangenehmere Überraschung. Fehlt pair, läuft provision.sh mit einer Warnung weiter (für USB reicht es), adb-wireless.sh bricht sauber ab. Die Prüfung kommt bewusst ohne Pipe aus: 'adb pair' ohne Argumente endet mit Code 1, weil es ein Aufruffehler ist. Unter 'set -o pipefail' hätte das die gesamte Pipeline als fehlgeschlagen gelten lassen, obwohl grep den Hilfetext gefunden hatte — die Erkennung meldete dadurch selbst adb 36 als zu alt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -11,24 +11,15 @@
|
||||
# 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'
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
kopf "Werkzeug"
|
||||
if adb_einrichten; then
|
||||
ok "adb $(adb_version "$ADB_BIN") — kann WLAN-Kopplung"
|
||||
hinweis "$ADB_BIN"
|
||||
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"
|
||||
fehl "Ohne 'adb pair' ist eine Kopplung über WLAN nicht möglich."
|
||||
hinweis "Entweder aktuelle platform-tools installieren, oder doch ein Kabel besorgen."
|
||||
exit 1
|
||||
fi
|
||||
adb start-server >/dev/null 2>&1
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env bash
|
||||
# Gemeinsame Hilfsfunktionen für die Provisioning-Skripte.
|
||||
# Wird eingebunden, nicht direkt ausgeführt.
|
||||
|
||||
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"; }
|
||||
|
||||
# ── Das richtige adb finden ──────────────────────────────────────────────────
|
||||
# Debians Paket android-tools-adb liefert Version 29. 'adb pair' — und damit die
|
||||
# Kopplung über WLAN — kam erst mit platform-tools 30. Wer beides installiert hat,
|
||||
# bekommt je nach PATH-Reihenfolge mal das eine und mal das andere. Deshalb wird
|
||||
# hier gezielt eine Fassung gesucht, die 'pair' beherrscht, statt sich auf PATH
|
||||
# zu verlassen.
|
||||
#
|
||||
# Setzt ADB_BIN und definiert eine Shell-Funktion 'adb', die darauf zeigt —
|
||||
# so müssen die Aufrufstellen nichts wissen.
|
||||
|
||||
# Bewusst ohne Pipe: 'adb pair' ohne Argumente beendet sich mit Code 1, weil es ein
|
||||
# Aufruffehler ist. Unter 'set -o pipefail' würde das die ganze Pipeline als
|
||||
# fehlgeschlagen gelten lassen — obwohl grep den Hilfetext gefunden hat.
|
||||
adb_kann_pair() {
|
||||
local aus
|
||||
aus="$("$1" pair 2>&1 || true)"
|
||||
case "$aus" in *"usage: adb pair"*) return 0 ;; esac
|
||||
return 1
|
||||
}
|
||||
|
||||
adb_version() { "$1" version 2>/dev/null | sed -n '2p' | sed 's/^Version //'; }
|
||||
|
||||
adb_finden() {
|
||||
local kandidaten=() k
|
||||
|
||||
# Eine ausdrücklich gesetzte Vorgabe gilt absolut — auch wenn sie kein 'pair'
|
||||
# kann. Wer ADB= setzt, meint es so; stillschweigend etwas anderes zu nehmen
|
||||
# wäre die unangenehmere Überraschung.
|
||||
if [ -n "${ADB:-}" ]; then
|
||||
if [ ! -x "$ADB" ]; then
|
||||
fehl "ADB=$ADB ist nicht ausführbar."
|
||||
return 1
|
||||
fi
|
||||
ADB_BIN="$ADB"
|
||||
adb_kann_pair "$ADB_BIN" && return 0 || return 2
|
||||
fi
|
||||
|
||||
kandidaten+=(
|
||||
"$HOME/Android/Sdk/platform-tools/adb"
|
||||
"$HOME/Library/Android/sdk/platform-tools/adb"
|
||||
"${ANDROID_HOME:-/nonexistent}/platform-tools/adb"
|
||||
"${ANDROID_SDK_ROOT:-/nonexistent}/platform-tools/adb"
|
||||
)
|
||||
# Alles, was in PATH steht, ebenfalls prüfen — in PATH-Reihenfolge.
|
||||
while IFS= read -r k; do kandidaten+=("$k"); done < <(type -pa adb 2>/dev/null)
|
||||
|
||||
local erstes_gefundenes=""
|
||||
for k in "${kandidaten[@]}"; do
|
||||
[ -x "$k" ] || continue
|
||||
[ -n "$erstes_gefundenes" ] || erstes_gefundenes="$k"
|
||||
if adb_kann_pair "$k"; then
|
||||
ADB_BIN="$k"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Keines kann pair. Das ältere trotzdem melden — für USB reicht es.
|
||||
if [ -n "$erstes_gefundenes" ]; then
|
||||
ADB_BIN="$erstes_gefundenes"
|
||||
return 2
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Muss von jedem Skript einmal aufgerufen werden, bevor adb benutzt wird.
|
||||
adb_einrichten() {
|
||||
local rc
|
||||
adb_finden; rc=$?
|
||||
case $rc in
|
||||
0) : ;;
|
||||
2)
|
||||
warn "Gefundenes adb ist zu alt für die WLAN-Kopplung: $(adb_version "$ADB_BIN")"
|
||||
hinweis "$ADB_BIN"
|
||||
hinweis "'adb pair' gibt es erst ab platform-tools 30. Debians Paket"
|
||||
hinweis "android-tools-adb hängt auf Version 29 — damit geht nur USB."
|
||||
hinweis "Aktuelle Fassung: developer.android.com/tools/releases/platform-tools"
|
||||
;;
|
||||
*)
|
||||
fehl "Kein adb gefunden."
|
||||
hinweis "Entweder android-tools-adb installieren (nur USB) oder die"
|
||||
hinweis "platform-tools von Google entpacken (USB und WLAN)."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
# Ab hier zeigt 'adb' immer auf die ausgewählte Fassung, unabhängig von PATH.
|
||||
adb() { "$ADB_BIN" "$@"; }
|
||||
return $rc
|
||||
}
|
||||
+9
-12
@@ -15,17 +15,13 @@ TERMUX=com.termux
|
||||
TROCKEN=0
|
||||
[ "${1:-}" = "--dry-run" ] && TROCKEN=1
|
||||
|
||||
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"; }
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
# Wählt eine adb-Fassung aus, statt sich auf die Reihenfolge in PATH zu verlassen:
|
||||
# Debians Paket ist Version 29 und kennt kein 'adb pair'. Rückgabewert 2 heißt
|
||||
# "gefunden, aber zu alt für WLAN" — für USB reicht es trotzdem.
|
||||
ADB_KANN_WLAN=1
|
||||
adb_einrichten || ADB_KANN_WLAN=0
|
||||
|
||||
# Führt ein adb-Kommando aus und meldet das Ergebnis, ohne bei Fehlschlag
|
||||
# abzubrechen: Hersteller-ROMs kennen nicht jedes appops-Ziel, und ein fehlendes
|
||||
@@ -53,7 +49,7 @@ adbs() {
|
||||
|
||||
# ── Gerät ────────────────────────────────────────────────────────────────────
|
||||
kopf "Gerät"
|
||||
command -v adb >/dev/null 2>&1 || { fehl "adb nicht gefunden. Bitte android-tools-adb installieren."; exit 1; }
|
||||
hinweis "adb $(adb_version "$ADB_BIN") — $ADB_BIN"
|
||||
|
||||
HIER="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
@@ -81,6 +77,7 @@ if [ "$ANZAHL" -eq 0 ]; then
|
||||
|
||||
[a] Abbrechen
|
||||
TEXT
|
||||
[ "$ADB_KANN_WLAN" = 0 ] && warn "Achtung: das gefundene adb kann kein WLAN — [w] wird scheitern."
|
||||
printf '\n Auswahl > '
|
||||
read -r WAHL </dev/tty
|
||||
case "$WAHL" in
|
||||
|
||||
Reference in New Issue
Block a user