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
+159
@@ -0,0 +1,159 @@
|
||||
#!/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."
|
||||
Reference in New Issue
Block a user