Files
linux-on-android-without-root/spike/lib.sh
T
StefanandClaude Opus 5 ad2c98443b 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>
2026-08-09 17:25:36 +02:00

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
}