Phase 0: Repo-Gerüst, Dokumentation und Machbarkeits-Spike
Vier Beweise, die das Projekt tragen, als eigenständig lauffähige Skripte:
S1 Plasma Mobile in proot über genestetes kwin_wayland im X11-Backend.
Fällt selbsttätig auf startplasmamobile und dann auf XFCE zurück, damit
ein Fehlschlag eindeutig Plasma zuzuordnen ist und nicht der Umgebung.
S2 Mikrofon über PulseAudio mit OpenSL-Quelle. Misst den Pegel statt nur die
Dateigröße — der typische Fehlschlag ist eine formal korrekte WAV-Datei
voller Stille.
S3 Virtuelle PipeWire-Kamera per GStreamer-pipewiresink, ohne Kernel-Modul.
Setzt die Firefox-Einstellung vorab, damit der Test nicht an einem
vergessenen Häkchen scheitert.
S4 Intent-Handoff mit lauffähiger Mini-Bridge: xdg-open-Handler für geo:,
tel: und sms:, Token-Authentifizierung, feste Liste erlaubter Schemata.
provision/provision.sh setzt die Hintergrundbeschränkungen per ADB und benennt,
was ADB nicht kann und von Hand erledigt werden muss.
Dokumentiert sind auch die sieben verworfenen Wege — Waydroid, AVF, QEMU, SIP,
APK-Daten-Redirect, Fenster-Durchreichung und der Android-Server — mit Belegen,
damit sie nicht erneut durchdacht werden müssen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Executable
+105
@@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env bash
|
||||
# Gemeinsame Hilfsfunktionen für die Phase-0-Spike-Skripte.
|
||||
# Wird von den 0x-Skripten eingebunden, nicht direkt ausgeführt.
|
||||
|
||||
# Farben nur wenn wir auf einem Terminal landen — sonst verschmutzen sie das Protokoll.
|
||||
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
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
OUT_DIR="$REPO_ROOT/spike/out"
|
||||
mkdir -p "$OUT_DIR"
|
||||
|
||||
# Jeder Lauf bekommt sein eigenes Protokoll. Die Sammlung ist später die halbe
|
||||
# Auswertung — deshalb wird alles mitgeschrieben, auch was funktioniert hat.
|
||||
LOG="${LOG:-$OUT_DIR/$(basename "${0%.sh}").log}"
|
||||
|
||||
log() { printf '%s\n' "$*" | tee -a "$LOG"; }
|
||||
section() { log ""; log "${C_HEAD}══ $* ══${C_OFF}"; }
|
||||
ok() { log "${C_OK} ✓${C_OFF} $*"; }
|
||||
warn() { log "${C_WARN} !${C_OFF} $*"; }
|
||||
fail() { log "${C_ERR} ✗${C_OFF} $*"; }
|
||||
hint() { log "${C_DIM} $*${C_OFF}"; }
|
||||
|
||||
# Befehl ausführen, Ausgabe ins Protokoll, Fehler nicht tödlich.
|
||||
# Für alles, was scheitern DARF, ohne den Spike abzubrechen.
|
||||
try() {
|
||||
log "${C_DIM} \$ $*${C_OFF}"
|
||||
if "$@" >>"$LOG" 2>&1; then
|
||||
return 0
|
||||
else
|
||||
local rc=$?
|
||||
warn "fehlgeschlagen (Code $rc): $*"
|
||||
return $rc
|
||||
fi
|
||||
}
|
||||
|
||||
# Wie try(), aber ein Fehlschlag beendet den Spike. Für echte Voraussetzungen.
|
||||
need() {
|
||||
log "${C_DIM} \$ $*${C_OFF}"
|
||||
if ! "$@" >>"$LOG" 2>&1; then
|
||||
fail "Abbruch — notwendiger Schritt fehlgeschlagen: $*"
|
||||
log ""
|
||||
log "Vollständiges Protokoll: $LOG"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
have() { command -v "$1" >/dev/null 2>&1; }
|
||||
|
||||
in_termux() {
|
||||
case "${PREFIX:-}" in
|
||||
*com.termux*) [ -d "$PREFIX/bin" ] ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
require_termux() {
|
||||
if ! in_termux; then
|
||||
fail "Dieses Skript läuft in Termux auf dem Telefon, nicht auf dem PC."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Fragt am Ende jedes Beweises nach dem, was nur ein Mensch beurteilen kann:
|
||||
# ob es tatsächlich funktioniert hat. Das Ergebnis geht ins Protokoll.
|
||||
verdict() {
|
||||
local beweis="$1" frage="$2"
|
||||
log ""
|
||||
log "${C_HEAD}── Beurteilung $beweis ──${C_OFF}"
|
||||
log "$frage"
|
||||
printf ' [j] ja [n] nein [t] teilweise > '
|
||||
read -r antwort </dev/tty || antwort="?"
|
||||
local text
|
||||
case "$antwort" in
|
||||
j|J) text="BESTANDEN" ;;
|
||||
n|N) text="GESCHEITERT" ;;
|
||||
t|T) text="TEILWEISE" ;;
|
||||
*) text="UNKLAR" ;;
|
||||
esac
|
||||
printf ' Anmerkung (eine Zeile, Enter für nichts) > '
|
||||
read -r notiz </dev/tty || notiz=""
|
||||
log " Ergebnis $beweis: $text ${notiz:+— $notiz}"
|
||||
printf '%s\t%s\t%s\n' "$beweis" "$text" "$notiz" >>"$OUT_DIR/ergebnisse.tsv"
|
||||
log ""
|
||||
log "Ins Protokoll übertragen: docs/spike-protokoll.md"
|
||||
log "Rohdaten: $LOG"
|
||||
}
|
||||
|
||||
# Gerätesteckbrief — landet in jedem Protokoll, damit Meldungen vergleichbar sind.
|
||||
geraete_steckbrief() {
|
||||
section "Gerät"
|
||||
local p
|
||||
for p in ro.product.manufacturer ro.product.model ro.product.device \
|
||||
ro.build.version.release ro.build.version.sdk ro.board.platform \
|
||||
ro.hardware ro.soc.model; do
|
||||
log " $p = $(getprop "$p" 2>/dev/null || echo '?')"
|
||||
done
|
||||
log " Arch = $(uname -m)"
|
||||
log " Kernel = $(uname -r)"
|
||||
if have free; then log " RAM = $(free -h 2>/dev/null | awk '/Mem:/{print $2}')"; fi
|
||||
}
|
||||
Reference in New Issue
Block a user