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>
160 lines
7.3 KiB
Bash
Executable File
160 lines
7.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Phase 0 — Grundinstallation in Termux.
|
|
#
|
|
# Richtet Termux-X11, den GPU-Pfad und ein Debian-13-Rootfs ein, damit die Beweise
|
|
# S1 bis S4 danach laufen können. Idempotent: mehrfaches Ausführen ist unschädlich.
|
|
#
|
|
# Ausführen IN TERMUX auf dem Telefon: bash spike/00-bootstrap-termux.sh
|
|
set -uo pipefail
|
|
source "$(dirname "$0")/lib.sh"
|
|
require_termux
|
|
|
|
DISTRO=debian
|
|
BIND_ROOT="$REPO_ROOT"
|
|
|
|
log "HPOS Phase 0 — Bootstrap"
|
|
log "Protokoll: $LOG"
|
|
geraete_steckbrief
|
|
|
|
# ── Repositories ─────────────────────────────────────────────────────────────
|
|
# x11-repo bringt Termux-X11 und virglrenderer, tur-repo die Mesa-/Turnip-Pakete.
|
|
section "Paketquellen"
|
|
try pkg update -y
|
|
try pkg install -y x11-repo tur-repo
|
|
try pkg update -y
|
|
|
|
# ── Basispakete ──────────────────────────────────────────────────────────────
|
|
# Einzeln installiert und einzeln protokolliert: Paketnamen wandern in Termux
|
|
# gelegentlich, und wir wollen wissen, WELCHES Paket fehlt, statt nur dass etwas fehlt.
|
|
section "Basispakete"
|
|
BASIS=(termux-x11-nightly pulseaudio proot-distro termux-api git python openssl termux-tools)
|
|
for p in "${BASIS[@]}"; do
|
|
if try pkg install -y "$p"; then ok "$p"; else fail "$p — fehlt, betroffene Beweise siehe unten"; fi
|
|
done
|
|
|
|
# ── GPU-Pfad ─────────────────────────────────────────────────────────────────
|
|
# Adreno 6xx/7xx → Turnip greift direkt auf KGSL zu, das ist der schnellste Weg.
|
|
# Mali und alles andere → virgl/ANGLE. Wir installieren beides und entscheiden
|
|
# zur Laufzeit; das Ergebnis landet im GPU-Profil.
|
|
section "GPU-Pakete"
|
|
GPU_PKGS=(virglrenderer-android vulkan-loader-android vulkan-tools angle-android
|
|
mesa-vulkan-icd-wrapper mesa-zink virglrenderer-mesa-zink)
|
|
for p in "${GPU_PKGS[@]}"; do
|
|
if try pkg install -y "$p"; then ok "$p"; else warn "$p nicht verfügbar — kein Beinbruch"; fi
|
|
done
|
|
|
|
section "GPU erkennen"
|
|
PLATFORM="$(getprop ro.board.platform 2>/dev/null)"
|
|
HARDWARE="$(getprop ro.hardware 2>/dev/null)"
|
|
GPU_PROFIL="virgl" # konservative Vorgabe
|
|
if have vulkaninfo; then
|
|
vulkaninfo --summary >>"$LOG" 2>&1 || true
|
|
GPU_NAME="$(vulkaninfo --summary 2>/dev/null | grep -m1 -i 'deviceName' | cut -d= -f2- | xargs)"
|
|
else
|
|
GPU_NAME=""
|
|
fi
|
|
log " Plattform = ${PLATFORM:-?}"
|
|
log " Hardware = ${HARDWARE:-?}"
|
|
log " GPU = ${GPU_NAME:-unbekannt}"
|
|
|
|
case "${GPU_NAME}${PLATFORM}" in
|
|
*[Aa]dreno*|*qcom*|*sm[0-9]*|*msm*)
|
|
GPU_PROFIL="turnip"
|
|
ok "Adreno erkannt → Turnip-Profil (direkter KGSL-Zugriff, schnellster Weg)"
|
|
;;
|
|
*[Mm]ali*)
|
|
GPU_PROFIL="virgl"
|
|
warn "Mali erkannt → virgl/ANGLE-Profil. Spürbar langsamer als Turnip."
|
|
;;
|
|
*)
|
|
warn "GPU nicht eindeutig erkannt → virgl als Vorgabe."
|
|
hint "Bitte im Spike-Protokoll vermerken, welcher Pfad tatsächlich getragen hat."
|
|
;;
|
|
esac
|
|
|
|
# Das Profil ist eine Datei, kein Sonderfall im Code — so bleibt es später
|
|
# erweiterbar, ohne dass jemand Skripte anfassen muss.
|
|
mkdir -p "$REPO_ROOT/rootfs/profiles"
|
|
PROFIL_DATEI="$OUT_DIR/gpu-profil.env"
|
|
{
|
|
echo "# Automatisch erkannt von 00-bootstrap-termux.sh"
|
|
echo "HPOS_GPU_PROFIL=$GPU_PROFIL"
|
|
echo "HPOS_GPU_NAME=\"${GPU_NAME:-unbekannt}\""
|
|
echo "HPOS_PLATFORM=\"${PLATFORM:-unbekannt}\""
|
|
} >"$PROFIL_DATEI"
|
|
ok "GPU-Profil geschrieben: $PROFIL_DATEI ($GPU_PROFIL)"
|
|
|
|
# ── Termux-Eigenschaften ─────────────────────────────────────────────────────
|
|
# allow-external-apps ist die Voraussetzung dafür, dass die Bridge-APK später
|
|
# Kommandos in Termux anstoßen darf. Hier gesetzt, damit Phase 2 es vorfindet.
|
|
section "Termux-Eigenschaften"
|
|
TP="$HOME/.termux/termux.properties"
|
|
mkdir -p "$(dirname "$TP")"
|
|
touch "$TP"
|
|
if grep -q '^allow-external-apps' "$TP" 2>/dev/null; then
|
|
ok "allow-external-apps bereits gesetzt"
|
|
else
|
|
echo 'allow-external-apps = true' >>"$TP"
|
|
ok "allow-external-apps = true gesetzt"
|
|
hint "Wird erst nach 'termux-reload-settings' oder Neustart von Termux wirksam."
|
|
fi
|
|
try termux-reload-settings
|
|
|
|
section "Speicherzugriff"
|
|
if [ -d "$HOME/storage" ]; then
|
|
ok "Speicherzugriff bereits eingerichtet"
|
|
else
|
|
warn "termux-setup-storage wird gleich einen Berechtigungsdialog zeigen — bitte erlauben."
|
|
try termux-setup-storage
|
|
sleep 2
|
|
[ -d "$HOME/storage" ] && ok "Speicherzugriff eingerichtet" || fail "Speicherzugriff fehlt — Backup nach /sdcard geht später nicht"
|
|
fi
|
|
|
|
# ── Wachhalten ───────────────────────────────────────────────────────────────
|
|
# Ohne Wake-Lock schläft der Stack weg, sobald der Bildschirm aus geht.
|
|
# Die herstellerseitigen Maßnahmen kommen zusätzlich, siehe provision/.
|
|
section "Wake-Lock"
|
|
try termux-wake-lock && ok "Wake-Lock aktiv" || warn "Wake-Lock nicht gesetzt"
|
|
|
|
# ── Debian-Rootfs ────────────────────────────────────────────────────────────
|
|
section "Debian-Rootfs"
|
|
if proot-distro list --installed 2>/dev/null | grep -q "^$DISTRO\b" \
|
|
|| [ -d "$PREFIX/var/lib/proot-distro/installed-rootfs/$DISTRO" ]; then
|
|
ok "$DISTRO bereits installiert"
|
|
else
|
|
log " Installiere $DISTRO — das dauert einige Minuten."
|
|
need proot-distro install "$DISTRO"
|
|
ok "$DISTRO installiert"
|
|
fi
|
|
|
|
section "Debian-Grundausstattung"
|
|
# Der Bind macht das Repo im Rootfs unter /hpos sichtbar, damit die inneren
|
|
# Skripte dieselben Dateien benutzen und Ergebnisse am selben Ort landen.
|
|
proot-distro login "$DISTRO" --bind "$BIND_ROOT:/hpos" -- bash -lc '
|
|
set -uo pipefail
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
apt-get update -qq
|
|
apt-get install -y --no-install-recommends \
|
|
ca-certificates locales dbus-x11 sudo nano less procps \
|
|
mesa-utils vulkan-tools pulseaudio-utils
|
|
# Deutsche und englische Locale, sonst meckert die halbe Desktop-Software.
|
|
sed -i "s/^# *\(de_DE.UTF-8\|en_US.UTF-8\)/\1/" /etc/locale.gen
|
|
locale-gen >/dev/null 2>&1
|
|
echo "--- Debian-Version ---"; cat /etc/debian_version
|
|
' 2>&1 | tee -a "$LOG"
|
|
|
|
# ── Abschluss ────────────────────────────────────────────────────────────────
|
|
section "Bereit"
|
|
log "GPU-Profil : $GPU_PROFIL"
|
|
log "Rootfs : $DISTRO"
|
|
log "Repo im Rootfs sichtbar unter /hpos"
|
|
log ""
|
|
log "Nächste Schritte, in dieser Reihenfolge:"
|
|
log " bash spike/01-s1-plasma-mobile.sh # der wackligste Beweis, deshalb zuerst"
|
|
log " bash spike/02-s2-mikrofon.sh"
|
|
log " bash spike/03-s3-pipewire-kamera.sh"
|
|
log " bash spike/04-s4-intent-handoff.sh"
|
|
log ""
|
|
log "Vor dem Übernacht-Test bitte provision/provision.sh vom PC laufen lassen"
|
|
log "und die herstellerseitigen Handgriffe aus docs/machbarkeit.md erledigen."
|