Files
linux-on-android-without-root/provision/lib.sh
T
StefanandClaude Opus 5 410cf01973 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>
2026-08-09 17:53:41 +02:00

105 lines
4.0 KiB
Bash

#!/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
}