Nur ein Startskript per adb, Rest über git; Berechtigungen beim Installieren

Bisher schob provision.sh das ganze Repo nach /sdcard. Auf dem Telefon lag damit
eine Kopie, und jede Änderung hätte wieder den PC gebraucht. Jetzt kommt per adb
nur init-phone.sh: es installiert git und klont die Quellen nach ~/hpos. Danach
ist das eine echte Arbeitskopie und Aktualisieren heißt

    cd ~/hpos && git pull

Die Repo-Adresse liest provision.sh aus dem origin-Remote und schreibt sie fest
ins übertragene Skript, damit auf einer Bildschirmtastatur nichts abgetippt
werden muss. Bei privaten Repos bietet init-phone.sh an, das Passwort zu
speichern — mit dem ausdrücklichen Hinweis, dass das im Klartext geschieht.

Die Berechtigungen wandern von provision.sh nach install-termux.sh, direkt hinter
die Installation. Eine frisch installierte App ohne Berechtigungen ist eine Falle,
die erst Stunden später zuschnappt: im ersten Gerätelauf als stumme Tonaufnahme
in Beweis S2. RECORD_AUDIO für com.termux wird danach ausdrücklich nachgeprüft,
weil genau daran der Beweis hängt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan
2026-08-10 16:52:50 +02:00
co-authored by Claude Opus 5
parent f08399ba1d
commit a58754dbfc
4 changed files with 211 additions and 17 deletions
+115
View File
@@ -0,0 +1,115 @@
#!/data/data/com.termux/files/usr/bin/bash
# HPOS — Startpunkt auf dem Telefon.
#
# Dieses Skript ist absichtlich das EINZIGE, was per adb aufs Telefon kommt.
# Alles Weitere holt es sich per git. Der Grund: danach ist das Repo auf dem
# Telefon eine Arbeitskopie, keine Kopie. Aktualisieren heißt dann schlicht
#
# cd ~/hpos && git pull
#
# statt jedes Mal wieder den PC anzuwerfen und Dateien zu schieben.
#
# Aufruf in Termux:
# bash /sdcard/hpos-init.sh
# bash /sdcard/hpos-init.sh https://beispiel/anderes-repo.git
set -uo pipefail
REPO="${1:-${HPOS_REPO:-@@REPO_URL@@}}"
ZIEL="$HOME/hpos"
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"; }
case "$REPO" in
@@*) fehl "Keine Repo-Adresse hinterlegt."
hinweis "Aufruf mit Adresse: bash /sdcard/hpos-init.sh <url>"
exit 1 ;;
esac
kopf "HPOS — Ersteinrichtung auf dem Telefon"
hinweis "Repo: $REPO"
# ── git ──────────────────────────────────────────────────────────────────────
kopf "git"
if command -v git >/dev/null 2>&1; then
ok "bereits vorhanden ($(git --version))"
else
pkg update -y >/dev/null 2>&1
if pkg install -y git; then ok "installiert"
else fehl "Installation von git fehlgeschlagen"; exit 1; fi
fi
# ── Zugangsdaten ─────────────────────────────────────────────────────────────
# Bei einem privaten Repo fragt git bei jedem Zugriff nach dem Passwort. Auf einer
# Bildschirmtastatur ist das eine Zumutung, deshalb wird der Speicher angeboten.
# Er legt die Zugangsdaten im Klartext unter ~/.git-credentials ab — das gehört
# gesagt, damit die Entscheidung bewusst fällt.
case "$REPO" in
https://*@*)
if [ ! -f "$HOME/.git-credentials" ]; then
kopf "Zugangsdaten"
hinweis "Das Repo verlangt vermutlich ein Passwort."
printf ' Nach der Eingabe dauerhaft merken? (Klartext in ~/.git-credentials) [j/N] > '
read -r MERKEN
case "${MERKEN:-n}" in
j|J) git config --global credential.helper store
ok "Passwort wird nach der ersten Eingabe gespeichert" ;;
*) hinweis "Dann fragt git bei jedem Zugriff erneut." ;;
esac
fi
;;
esac
# ── Holen oder aktualisieren ─────────────────────────────────────────────────
kopf "Repo"
if [ -d "$ZIEL/.git" ]; then
ok "Arbeitskopie vorhanden — aktualisiere"
if git -C "$ZIEL" pull --ff-only; then
ok "aktuell"
else
warn "git pull fehlgeschlagen."
hinweis "Lokale Änderungen? Dann: cd ~/hpos && git stash && git pull"
exit 1
fi
else
if git clone "$REPO" "$ZIEL"; then
ok "geklont nach $ZIEL"
else
fehl "git clone fehlgeschlagen."
hinweis "Bei privaten Repos: Benutzername und Passwort prüfen."
hinweis "Adresse war: $REPO"
exit 1
fi
fi
chmod +x "$ZIEL"/spike/*.sh "$ZIEL"/spike/inner/*.sh 2>/dev/null || true
# ── Weiter ───────────────────────────────────────────────────────────────────
kopf "Fertig"
cat <<TEXT
Das Repo liegt jetzt unter ~/hpos und ist eine Arbeitskopie.
Aktualisieren später:
cd ~/hpos && git pull
Nächster Schritt:
cd ~/hpos
bash spike/00-bootstrap-termux.sh
Danach die Beweise der Reihe nach — S1 zuerst, weil er der wackligste ist:
bash spike/01-s1-plasma-mobile.sh
bash spike/02-s2-mikrofon.sh
bash spike/03-s3-pipewire-kamera.sh
bash spike/04-s4-intent-handoff.sh
TEXT
+48
View File
@@ -173,6 +173,54 @@ for eintrag in "${DATEIEN[@]}"; do
fi
done
# ── Berechtigungen ───────────────────────────────────────────────────────────
# Direkt nach der Installation, nicht erst in provision.sh: eine frisch
# installierte App ohne Berechtigungen ist eine Falle, die erst Stunden später
# zuschnappt — etwa als stumme Tonaufnahme in Beweis S2.
#
# Wichtig ist vor allem RECORD_AUDIO für com.termux SELBST. PulseAudio läuft im
# Termux-Prozess und öffnet das Mikrofon von dort über OpenSL ES; eine
# Berechtigung, die nur Termux:API hat, nützt ihm nichts.
if [ "$FEHLER" = 0 ]; then
kopf "Berechtigungen"
erteile() {
local paket="$1" perm="$2"
if adb shell pm grant "$paket" "$perm" >/dev/null 2>&1; then
ok "${perm##*.}$paket"
else
warn "${perm##*.}$paket (abgelehnt)"
hint_gegeben=1
fi
}
hint_gegeben=0
for p in android.permission.RECORD_AUDIO \
android.permission.READ_EXTERNAL_STORAGE \
android.permission.WRITE_EXTERNAL_STORAGE; do
erteile com.termux "$p"
done
for p in android.permission.RECORD_AUDIO \
android.permission.CAMERA \
android.permission.ACCESS_FINE_LOCATION \
android.permission.READ_EXTERNAL_STORAGE \
android.permission.WRITE_EXTERNAL_STORAGE; do
erteile com.termux.api "$p"
done
if [ "$hint_gegeben" = 1 ]; then
hinweis "Abgelehnt heißt meist: die App meldet diese Berechtigung gar nicht an."
hinweis "Das ist unkritisch, solange RECORD_AUDIO für com.termux durchging."
fi
# Kontrolle statt Vertrauen — genau diese eine Berechtigung entscheidet über S2.
if adb shell dumpsys package com.termux 2>/dev/null | grep -q 'RECORD_AUDIO.*granted=true'; then
ok "Nachgeprüft: com.termux darf aufnehmen"
else
warn "com.termux hat RECORD_AUDIO NICHT — Beweis S2 wird sonst stumm bleiben."
hinweis "Auf dem Telefon: Einstellungen → Apps → Termux → Berechtigungen → Mikrofon"
fi
fi
# ── Abschluss ────────────────────────────────────────────────────────────────
kopf "Ergebnis"
adb shell pm list packages 2>/dev/null | tr -d '\r' | grep -E '^package:com\.termux' | sed 's/^package:/ /'
+33 -15
View File
@@ -266,28 +266,43 @@ 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"
# ── Startskript aufs Telefon ─────────────────────────────────────────────────
# Bewusst NUR dieses eine Skript, nicht das ganze Repo. Es installiert git und
# klont die Quellen — danach ist auf dem Telefon eine Arbeitskopie, keine Kopie.
# Aktualisieren heißt dann 'git pull' statt jedes Mal wieder den PC anzuwerfen.
kopf "Startskript aufs Telefon"
REPO_ROOT="$(cd "$HIER/.." && pwd)"
ZIEL=/sdcard/hpos
REPO_URL="$(git -C "$REPO_ROOT" remote get-url origin 2>/dev/null || true)"
ZIEL=/sdcard/hpos-init.sh
if [ -z "$REPO_URL" ]; then
warn "Keine Repo-Adresse gefunden (kein origin-Remote gesetzt)."
hinweis "Ohne sie kann das Telefon die Quellen nicht holen."
printf ' Adresse von Hand eingeben (leer = überspringen) > '
read -r REPO_URL </dev/tty || REPO_URL=""
fi
if [ "$TROCKEN" = 1 ]; then
warn "Trockenlauf — es wird nichts übertragen."
elif [ -z "$REPO_URL" ]; then
hinweis "Übersprungen."
else
printf ' Die Spike-Skripte jetzt nach %s übertragen? [J/n] > ' "$ZIEL"
hinweis "Repo: $REPO_URL"
printf ' Startskript 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
# Adresse fest ins Skript schreiben, damit auf dem Telefon nichts
# abgetippt werden muss. sed mit | als Trenner, weil URLs Schrägstriche
# enthalten.
TMP=$(mktemp)
sed "s|@@REPO_URL@@|$REPO_URL|" "$HIER/init-phone.sh" >"$TMP"
if adb push "$TMP" "$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."
warn "Übertragung fehlgeschlagen."
fi
rm -f "$TMP"
;;
*) hinweis "Übersprungen." ;;
esac
@@ -297,11 +312,14 @@ kopf "Fertig"
cat <<TEXT
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
bash /sdcard/hpos-init.sh # installiert git und klont das Repo
cd ~/hpos
bash spike/00-bootstrap-termux.sh
Ab dann genügt zum Aktualisieren:
cd ~/hpos && git pull
Danach die Beweise der Reihe nach — S1 zuerst, weil er der wackligste ist.
Ergebnisse gehören nach docs/spike-protokoll.md.
+15 -2
View File
@@ -73,10 +73,14 @@ Bildschirmtastatur eingetippt werden müssen.
## Ablauf
```bash
# Einmalig, vom PC. Fragt selbst nach USB oder WLAN.
# Einmalig, vom PC. Fragt selbst nach USB oder WLAN, installiert Termux
# und legt ein Startskript nach /sdcard/hpos-init.sh.
./provision/provision.sh
# Auf dem Telefon in Termux
# Auf dem Telefon in Termux: git installieren und das Repo holen
bash /sdcard/hpos-init.sh
cd ~/hpos
bash spike/00-bootstrap-termux.sh
# Beweise in dieser Reihenfolge — S1 zuerst, weil er der wackligste ist
@@ -86,6 +90,15 @@ bash spike/03-s3-pipewire-kamera.sh
bash spike/04-s4-intent-handoff.sh
```
**Aktualisieren später** — kein PC nötig, kein erneutes Übertragen:
```bash
cd ~/hpos && git pull
```
Per adb kommt bewusst nur das Startskript aufs Telefon, nicht das Repo selbst.
Dadurch liegt dort eine echte Arbeitskopie statt einer Kopie.
Jedes Skript fragt am Ende nach deiner Beurteilung und schreibt sie nach
`spike/out/ergebnisse.tsv`. Rohprotokolle liegen daneben in `spike/out/*.log`.