Aus dem Gerätelauf: S2 lief bis Stufe 1 durch und scheiterte dann an 'proot-distro: cannot execute: required file not found'. Danach meldete die Auswertung folgerichtig 'S2 gescheitert' — was den Beweis inhaltlich belastet, obwohl nur die Grundlage fehlte. Genau diese Verwechslung soll der Spike nicht produzieren. Alle Beweise prüfen jetzt vorab, ob proot-distro ausführbar ist und das Rootfs steht, und brechen sonst mit klarer Ansage ab statt mitten im Test aufzulaufen. Die Meldung selbst ist irreführend: 'required file not found' heißt nicht, dass proot-distro fehlt — bash hat es gefunden und nennt den vollen Pfad. Es fehlt der Interpreter aus dessen Shebang-Zeile. Die Prüfung sagt das ausdrücklich und nennt Datei und Shebang, statt den Suchenden an der falschen Stelle graben zu lassen. 00-bootstrap versucht in dem Fall selbsttätig eine Neuinstallation. Dazu die Berechtigungsprüfung entschärft: dumpsys verlangt die DUMP-Berechtigung, die eine gewöhnliche App nicht hat. Das Fehlschlagen ist erwartbar und kein Warnsignal; die Meldung nennt jetzt den Weg über adb statt Ratlosigkeit zu säen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
178 lines
8.1 KiB
Bash
Executable File
178 lines
8.1 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"
|
|
# Erst prüfen, ob proot-distro überhaupt LÄUFT. Ein installiertes Paket, dessen
|
|
# Shebang-Interpreter fehlt, meldet sich mit "cannot execute: required file not
|
|
# found" — eine Meldung, die aussieht als fehle das Programm, obwohl es da ist.
|
|
if ! proot-distro list >/dev/null 2>&1; then
|
|
fail "proot-distro ist installiert, lässt sich aber nicht ausführen"
|
|
PD="$(command -v proot-distro)"
|
|
log " Datei: $PD"
|
|
log " Shebang: $(head -1 "$PD" 2>/dev/null)"
|
|
hint "Meist fehlt der Interpreter aus der Shebang-Zeile, nicht das Programm."
|
|
hint "Reparaturversuch:"
|
|
try pkg install -y bash coreutils proot proot-distro
|
|
if ! proot-distro list >/dev/null 2>&1; then
|
|
fail "Bleibt defekt — ohne proot-distro geht es nicht weiter."
|
|
exit 1
|
|
fi
|
|
ok "Nach der Neuinstallation läuft proot-distro"
|
|
fi
|
|
|
|
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."
|