From 3c41623e5259c0f5350da3ab93bc7a7341a8571b Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 10 Aug 2026 21:33:10 +0200 Subject: [PATCH] =?UTF-8?q?install-scrcpy.sh=20statt=20apt=20=E2=80=94=20i?= =?UTF-8?q?n=20Debian=2012=20gibt=20es=20das=20Paket=20nicht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Meine Anweisung 'sudo apt install scrcpy' war falsch: scrcpy ist in bookworm gar nicht enthalten, und wo es existiert (ab trixie-backports) liegt es in contrib statt main. 'Paket kann nicht gefunden werden' war also die richtige Antwort des Systems, kein Konfigurationsfehler. Das Projekt liefert ein eigenständiges Linux-Paket. Gegen das System geprüft: keine fehlenden Bibliotheken, läuft ohne root. Installiert wird nach ~/.local, Rückbau mit --deinstallieren. Wichtiger Teil ist der erzeugte Starter: das Paket bringt ein eigenes adb mit, hier 37.0.0 gegen 36.0.0 im System. Trifft ein abweichendes adb auf einen laufenden Server, beendet es ihn — und kappt damit mitten in der Arbeit die WLAN-Verbindung zum Telefon. Der Starter schiebt scrcpy deshalb dasselbe adb unter, das auch die Provisioning-Skripte benutzen. Co-Authored-By: Claude Opus 5 (1M context) --- docs/entwicklung.md | 16 ++++- tools/install-scrcpy.sh | 141 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 2 deletions(-) create mode 100755 tools/install-scrcpy.sh diff --git a/docs/entwicklung.md b/docs/entwicklung.md index 14903da..7008183 100644 --- a/docs/entwicklung.md +++ b/docs/entwicklung.md @@ -38,10 +38,22 @@ Für alles Grafische unverzichtbar: Beweis S1 zeigt sich nur auf dem Bildschirm, die Kamera in S3 prüft man in einem Browserfenster. ```bash -sudo apt install scrcpy # Debian/Ubuntu -scrcpy # nutzt die bestehende adb-Verbindung, auch über WLAN +./tools/install-scrcpy.sh # holt das offizielle Linux-Paket nach ~/.local +scrcpy # nutzt die bestehende adb-Verbindung, auch über WLAN ``` +**`apt install scrcpy` funktioniert auf Debian 12 nicht** — dort ist das Paket gar +nicht enthalten, und ab trixie-backports liegt es in `contrib` statt `main`. Das +Projekt liefert aber ein eigenständiges Linux-Paket ohne Systemabhängigkeiten, und +genau das holt das Skript. Kein root, alles unter `~/.local`, Rückbau mit +`--deinstallieren`. + +Das Skript legt dabei einen Starter an, der scrcpy **dasselbe adb unterschiebt**, das +auch die Provisioning-Skripte benutzen. Das ist kein Schönheitsfehler: das Paket +bringt eine eigene, oft neuere adb-Fassung mit, und ein abweichendes adb beendet einen +laufenden Server — was mitten in der Arbeit die WLAN-Verbindung zum Telefon kappen +würde. + Was es mitbringt, ohne weitere Einrichtung: - **Zwischenablage in beide Richtungen.** Auf dem Telefon kopieren, auf dem PC diff --git a/tools/install-scrcpy.sh b/tools/install-scrcpy.sh new file mode 100755 index 0000000..03fba26 --- /dev/null +++ b/tools/install-scrcpy.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash +# HPOS — scrcpy installieren. Läuft auf dem RECHNER, nicht auf dem Telefon. +# +# scrcpy ist in Debian 12 nicht enthalten; erst ab trixie-backports, und dort in +# contrib statt main. 'apt install scrcpy' scheitert deshalb mit "Paket kann nicht +# gefunden werden". Das Projekt liefert aber ein eigenständiges Linux-Paket, das +# ohne Systemabhängigkeiten und ohne root auskommt. +# +# Installiert wird nach ~/.local — nichts außerhalb des Benutzerverzeichnisses. +# +# Aufruf: ./tools/install-scrcpy.sh [--deinstallieren] +set -uo pipefail + +ZIEL="$HOME/.local/opt/scrcpy" +STARTER="$HOME/.local/bin/scrcpy" + +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"; } + +if [ "${1:-}" = "--deinstallieren" ]; then + rm -rf "$ZIEL" "$STARTER" + ok "Entfernt: $ZIEL und $STARTER" + exit 0 +fi + +command -v curl >/dev/null 2>&1 || { fehl "curl wird gebraucht."; exit 1; } +command -v tar >/dev/null 2>&1 || { fehl "tar wird gebraucht."; exit 1; } + +case "$(uname -m)" in + x86_64|amd64) ARCH=x86_64 ;; + aarch64|arm64) ARCH=aarch64 ;; + *) fehl "Keine fertigen Pakete für $(uname -m). Dann aus den Quellen bauen."; exit 1 ;; +esac + +# ── Herunterladen ──────────────────────────────────────────────────────────── +kopf "Aktuelle Fassung ermitteln" +URL=$(curl -sfL https://api.github.com/repos/Genymobile/scrcpy/releases/latest \ + | python3 -c " +import json, sys +d = json.load(sys.stdin) +for a in d['assets']: + if a['name'].startswith('scrcpy-linux-$ARCH') and a['name'].endswith('.tar.gz'): + print(a['browser_download_url']) + break +" 2>/dev/null) + +if [ -z "$URL" ]; then + fehl "Kein passendes Paket für linux-$ARCH gefunden." + hinweis "Releases prüfen: https://github.com/Genymobile/scrcpy/releases" + exit 1 +fi +ok "$(basename "$URL")" + +kopf "Herunterladen" +TMP=$(mktemp -d) +trap 'rm -rf "$TMP"' EXIT +if ! curl -fL --progress-bar -o "$TMP/s.tar.gz" "$URL"; then + fehl "Download fehlgeschlagen." + exit 1 +fi +tar xzf "$TMP/s.tar.gz" -C "$TMP" || { fehl "Entpacken fehlgeschlagen."; exit 1; } + +QUELLE=$(find "$TMP" -maxdepth 1 -type d -name 'scrcpy-linux-*' | head -1) +[ -n "$QUELLE" ] || { fehl "Unerwarteter Aufbau des Archivs."; exit 1; } + +kopf "Installieren" +rm -rf "$ZIEL" +mkdir -p "$(dirname "$ZIEL")" "$(dirname "$STARTER")" +mv "$QUELLE" "$ZIEL" +chmod +x "$ZIEL/scrcpy" "$ZIEL/adb" 2>/dev/null || true +ok "nach $ZIEL" + +# ── Starter mit passendem adb ──────────────────────────────────────────────── +# Das Paket bringt ein eigenes adb mit, das neuer sein kann als das im System. +# Trifft ein anderes adb auf einen laufenden Server, beendet es ihn — und genau +# das kappt eine bestehende WLAN-Verbindung zum Telefon mitten in der Arbeit. +# Deshalb bekommt scrcpy dasselbe adb wie die übrigen Skripte. +SYSTEM_ADB="" +for k in "${ADB:-}" "$HOME/Android/Sdk/platform-tools/adb" $(command -v adb 2>/dev/null); do + [ -n "$k" ] && [ -x "$k" ] && { SYSTEM_ADB="$k"; break; } +done + +if [ -n "$SYSTEM_ADB" ]; then + V_SYS=$("$SYSTEM_ADB" version 2>/dev/null | sed -n 2p) + V_MIT=$("$ZIEL/adb" version 2>/dev/null | sed -n 2p) + hinweis "System-adb: $V_SYS" + hinweis "Mitgeliefert: $V_MIT" + if [ "$V_SYS" != "$V_MIT" ]; then + warn "Verschiedene Fassungen — scrcpy bekommt das System-adb," + hinweis "sonst würde der adb-Server neu starten und die WLAN-Verbindung abreißen." + fi +fi + +cat >"$STARTER" </dev/null | grep 'not found'); then + fehl "Fehlende Bibliotheken:" + printf '%s\n' "$FEHLT" | sed 's/^/ /' + exit 1 +fi +ok "Keine fehlenden Bibliotheken" +ok "$("$STARTER" --version 2>&1 | head -1)" + +case ":$PATH:" in + *":$HOME/.local/bin:"*) ok "~/.local/bin liegt in PATH" ;; + *) warn "~/.local/bin fehlt in PATH" + hinweis "In ~/.bashrc ergänzen: export PATH=\"\$HOME/.local/bin:\$PATH\"" ;; +esac + +kopf "Loslegen" +cat <<'TEXT' + scrcpy Bildschirm spiegeln, Zwischenablage beidseitig + scrcpy --max-size 1024 weniger Bandbreite, flüssiger über WLAN + scrcpy --turn-screen-off Telefonbildschirm aus, spart Akku + scrcpy --stay-awake Bildschirm bleibt an, solange gespiegelt wird + + Tastatur und Maus des Rechners wirken direkt im Telefon — auch in Termux. + Deinstallieren: ./tools/install-scrcpy.sh --deinstallieren +TEXT