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
+139
@@ -0,0 +1,139 @@
|
||||
#!/bin/bash
|
||||
# Läuft INNERHALB des Debian-Rootfs, aufgerufen von 01-s1-plasma-mobile.sh.
|
||||
# Direkt aufrufen ergibt keinen Sinn — die Umgebung kommt vom äußeren Skript.
|
||||
set -uo pipefail
|
||||
|
||||
GPU_PROFIL="${HPOS_GPU_PROFIL:-virgl}"
|
||||
BREITE="${HPOS_BREITE:-1080}"
|
||||
HOEHE="${HPOS_HOEHE:-2340}"
|
||||
|
||||
echo "── Debian-Seite: Plasma Mobile ──"
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
export DISPLAY=:0
|
||||
export XDG_RUNTIME_DIR=/tmp/hpos-runtime
|
||||
export PULSE_SERVER=127.0.0.1
|
||||
export LANG=de_DE.UTF-8
|
||||
mkdir -p "$XDG_RUNTIME_DIR" && chmod 700 "$XDG_RUNTIME_DIR"
|
||||
|
||||
# Plasma Mobile ist Touch-first: ohne diese Variablen kommt eine Desktop-Skalierung
|
||||
# heraus, die auf einem Telefon unbedienbar ist.
|
||||
export QT_QPA_PLATFORM=wayland
|
||||
export QT_QUICK_CONTROLS_MOBILE=1
|
||||
export PLASMA_PLATFORM=phone
|
||||
export KDE_FULL_SESSION=true
|
||||
|
||||
case "$GPU_PROFIL" in
|
||||
turnip)
|
||||
# Zink übersetzt OpenGL auf Vulkan, Turnip liefert Vulkan direkt aus dem
|
||||
# Adreno-Treiber — zusammen der schnellste Weg ohne Root.
|
||||
export MESA_LOADER_DRIVER_OVERRIDE=zink
|
||||
export GALLIUM_DRIVER=zink
|
||||
export TU_DEBUG=noconform
|
||||
;;
|
||||
virgl)
|
||||
export GALLIUM_DRIVER=virpipe
|
||||
export MESA_GL_VERSION_OVERRIDE=4.3
|
||||
;;
|
||||
esac
|
||||
echo " GPU-Profil: $GPU_PROFIL"
|
||||
|
||||
# ── Pakete ───────────────────────────────────────────────────────────────────
|
||||
# Bewusst ohne empfohlene Pakete: sonst zieht Plasma Mobile eine komplette
|
||||
# Desktop-Umgebung samt Drucksystem mit, was auf einem Telefon nur Platz kostet.
|
||||
if ! command -v kwin_wayland >/dev/null 2>&1; then
|
||||
echo "── Installiere Plasma Mobile (einmalig, gut 1 GB) ──"
|
||||
apt-get update -qq
|
||||
apt-get install -y --no-install-recommends \
|
||||
plasma-mobile kwin-wayland plasma-workspace maliit-keyboard \
|
||||
xdg-desktop-portal-kde qtwayland5 libqt5waylandclient5 \
|
||||
|| echo " ! Paketinstallation unvollständig — Details oben"
|
||||
fi
|
||||
|
||||
for b in kwin_wayland plasmashell; do
|
||||
if command -v "$b" >/dev/null 2>&1; then echo " ✓ $b vorhanden"
|
||||
else echo " ✗ $b fehlt"; fi
|
||||
done
|
||||
|
||||
# ── GPU-Nachweis, bevor der Desktop startet ──────────────────────────────────
|
||||
# Wenn hier schon nichts kommt, ist ein Fehlschlag von Plasma keine Aussage über
|
||||
# Plasma, sondern über den GPU-Pfad. Deshalb vorher messen.
|
||||
echo "── GPU-Nachweis ──"
|
||||
timeout 20 glxinfo -B 2>&1 | grep -Ei 'OpenGL (renderer|version)|Device' || echo " ! glxinfo lieferte nichts"
|
||||
timeout 20 vulkaninfo --summary 2>&1 | grep -Ei 'driverName|deviceName' || echo " ! vulkaninfo lieferte nichts"
|
||||
|
||||
# ── D-Bus ────────────────────────────────────────────────────────────────────
|
||||
if [ ! -e /run/dbus/system_bus_socket ]; then
|
||||
mkdir -p /run/dbus
|
||||
dbus-daemon --system --fork 2>/dev/null && echo " ✓ System-D-Bus gestartet" \
|
||||
|| echo " ! System-D-Bus nicht gestartet (ohne logind oft verschmerzbar)"
|
||||
fi
|
||||
|
||||
# ── Versuch A: KWin genestet im X11-Backend ──────────────────────────────────
|
||||
# Das ist die eigentliche Wette. In diesem Modus braucht KWin weder DRM noch Seat.
|
||||
echo ""
|
||||
echo "── Versuch A: kwin_wayland --x11-display ──"
|
||||
LOGA=/tmp/hpos-s1-versuchA.log
|
||||
dbus-run-session -- kwin_wayland \
|
||||
--x11-display "$DISPLAY" \
|
||||
--width "$BREITE" --height "$HOEHE" \
|
||||
--xwayland \
|
||||
-- plasmashell -p org.kde.plasma.phoneshell \
|
||||
>"$LOGA" 2>&1 &
|
||||
PID_A=$!
|
||||
echo " gestartet (PID $PID_A), warte 25 s auf die Oberfläche …"
|
||||
sleep 25
|
||||
|
||||
if kill -0 "$PID_A" 2>/dev/null; then
|
||||
echo " ✓ Versuch A läuft noch — jetzt in die Termux:X11-App wechseln und schauen."
|
||||
echo ""
|
||||
echo " Beenden mit: pkill -f kwin_wayland"
|
||||
echo " Protokoll: $LOGA"
|
||||
tail -n 25 "$LOGA" 2>/dev/null | sed 's/^/ /'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo " ✗ Versuch A beendet. Letzte Zeilen:"
|
||||
tail -n 40 "$LOGA" 2>/dev/null | sed 's/^/ /'
|
||||
|
||||
# ── Versuch B: die von Debian mitgelieferte Sitzung ──────────────────────────
|
||||
# Startet KWin selbst und wählt sein Backend eigenständig. Weniger Kontrolle,
|
||||
# aber manchmal weiß das Distributionsskript etwas, das wir nicht wissen.
|
||||
echo ""
|
||||
echo "── Versuch B: startplasmamobile ──"
|
||||
if command -v startplasmamobile >/dev/null 2>&1; then
|
||||
LOGB=/tmp/hpos-s1-versuchB.log
|
||||
KWIN_COMPOSE=O2 dbus-run-session -- startplasmamobile >"$LOGB" 2>&1 &
|
||||
PID_B=$!
|
||||
sleep 25
|
||||
if kill -0 "$PID_B" 2>/dev/null; then
|
||||
echo " ✓ Versuch B läuft — in die Termux:X11-App wechseln."
|
||||
tail -n 25 "$LOGB" 2>/dev/null | sed 's/^/ /'
|
||||
exit 0
|
||||
fi
|
||||
echo " ✗ Versuch B beendet. Letzte Zeilen:"
|
||||
tail -n 40 "$LOGB" 2>/dev/null | sed 's/^/ /'
|
||||
else
|
||||
echo " ! startplasmamobile nicht vorhanden"
|
||||
fi
|
||||
|
||||
# ── Rückfallebene: XFCE, damit der Abend nicht umsonst war ───────────────────
|
||||
# Beweist zumindest, dass X-Server und GPU-Pfad tragen. Damit ist ein Fehlschlag
|
||||
# von S1 eindeutig Plasma zuzuordnen und nicht der Umgebung.
|
||||
echo ""
|
||||
echo "── Rückfallebene: XFCE zur Gegenprobe ──"
|
||||
if ! command -v startxfce4 >/dev/null 2>&1; then
|
||||
apt-get install -y --no-install-recommends xfce4 xfce4-terminal >/dev/null 2>&1 \
|
||||
|| echo " ! XFCE-Installation fehlgeschlagen"
|
||||
fi
|
||||
if command -v startxfce4 >/dev/null 2>&1; then
|
||||
dbus-run-session -- startxfce4 >/tmp/hpos-s1-xfce.log 2>&1 &
|
||||
sleep 12
|
||||
if pgrep -f xfwm4 >/dev/null 2>&1; then
|
||||
echo " ✓ XFCE läuft. S1 ist gescheitert, aber X-Server und GPU-Pfad tragen."
|
||||
echo " → Im Protokoll als 'S1 gescheitert, XFCE-Profil wird Hauptweg' vermerken."
|
||||
else
|
||||
echo " ✗ Auch XFCE startet nicht — dann liegt es an X-Server oder GPU, nicht an Plasma."
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
Reference in New Issue
Block a user