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>
140 lines
6.0 KiB
Bash
Executable File
140 lines
6.0 KiB
Bash
Executable File
#!/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
|