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>
106 lines
3.4 KiB
Bash
Executable File
106 lines
3.4 KiB
Bash
Executable File
#!/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
|
|
}
|