iJqb.sh
#!/data/data/com.termux/files/usr/bin/bash
# ╔══════════════════════════════════════════════════════════════╗
# ║ TERMUX · XFCE DESKTOP SETUP & LAUNCHER ║
# ║ Optimiert für Sony Xperia XZ1 · Snapdragon 835 ║
# ╚══════════════════════════════════════════════════════════════╝
# ÄNDERUNGSLOG (gegenüber Originalversion):
# [OPT-01] Geräte-Erkennung: Sony Xperia XZ1 Modelle G8341/G8342/G8343
# [OPT-02] pkg list-installed wird einmalig gecacht statt N-fach aufgerufen
# [OPT-03] Batch-Installation: alle fehlenden Pakete in einem pkg-Aufruf
# [OPT-04] Nicht-essentielle Pakete entfernt (mesa-demos, elinks, neofetch)
# [OPT-05] taskset: VNC-Prozess auf Snapdragon-835-Big-Cores (4–7) gepinnt
# [OPT-06] VNC mit -nthreads 4 für Multi-Core-Encoding (SD835: 8 Kerne)
# [OPT-07] VNC -FrameRate 30 für flüssige Darstellung ohne Akku-Waste
# [OPT-08] Optimale XZ1-Auflösungs-Presets (1080p nativ + Landscape-Option)
# [OPT-09] DPI auf 160 gesetzt (optimal für 5.2"-Display bei VNC-Nutzung)
# [OPT-10] xfwm4-Compositing deaktiviert (massiver Performance-Gewinn über VNC)
# [OPT-11] XFCE-Animationen & Fensterschatten deaktiviert
# [OPT-12] xstartup: LIBGL_ALWAYS_SOFTWARE, SESSION_MANAGER, Screensaver-Fix
# [OPT-13] RAM-Prüfung via /proc/meminfo (präziser als df-Schätzung)
# [OPT-14] Thermik-Warnung: Akkutemperatur vor VNC-Start prüfen
# [OPT-15] Schnellstarter mit taskset & XZ1-Defaults vorbelegt
# ─── Farben & Symbole ───────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m'
OK="✔"; FAIL="✘"; ARROW="▶"; GEAR="⚙"; ROCKET="🚀"; WARN="⚠"; THERM="🌡"
# ─── Banner ─────────────────────────────────────────────────────
print_banner() {
clear
echo -e "${CYAN}${BOLD}"
echo " ╔════════════════════════════════════════════╗"
echo " ║ TERMUX · XFCE DESKTOP SETUP ║"
echo " ║ Optimiert für Sony Xperia XZ1 ║"
echo " ║ Snapdragon 835 · 4 GB RAM ║"
echo " ╚════════════════════════════════════════════╝"
echo -e "${NC}"
echo -e "${DIM} Datum: $(date '+%d.%m.%Y %H:%M:%S')${NC}"
echo ""
}
# ─── Hilfsfunktionen ────────────────────────────────────────────
log_info() { echo -e " ${BLUE}${ARROW}${NC} $1"; }
log_ok() { echo -e " ${GREEN}${OK}${NC} $1"; }
log_warn() { echo -e " ${YELLOW}${WARN}${NC} $1"; }
log_error() { echo -e " ${RED}${FAIL}${NC} $1"; }
log_section() { echo -e "\n${BOLD}${CYAN}━━━ $1 ━━━${NC}\n"; }
# ─── Fehlerbehandlung ───────────────────────────────────────────
set -euo pipefail
trap 'log_error "Fehler in Zeile $LINENO – Script abgebrochen."; exit 1' ERR
# ─── Gerätekonstanten (XZ1-spezifisch) ──────────────────────────
# [OPT-05/06] Snapdragon 835: Kerne 0–3 = LITTLE (Kryo 280 Silver, 1.9GHz)
# Kerne 4–7 = big (Kryo 280 Gold, 2.45GHz)
SD835_BIG_CORES="4-7"
XZ1_MODELS=("G8341" "G8342" "G8343" "G8344") # Single/Dual-SIM + Compact
XZ1_DEFAULT_RES="1080x1920"
XZ1_DPI="160" # [OPT-09] für 5.2" gut lesbar in VNC-Client
# ─── Paketlisten ────────────────────────────────────────────────
TERMUX_PACKAGES=(x11-repo tur-repo)
# [OPT-04] Entfernt: mesa-demos (nur Benchmark), elinks (Browser nicht nötig),
# neofetch (rein kosmetisch) → ~80 MB weniger Download
MAIN_PACKAGES=(
xfce4
xfce4-terminal
xfce4-taskmanager
xfce4-whiskermenu-plugin
xfwm4
xfdesktop
tigervnc
dbus
pulseaudio
wget
curl
git
unzip
xorg-xauth
mousepad
ristretto
thunar
thunar-archive-plugin
file-roller
htop
)
# ─── [OPT-01] Geräte-Erkennung ──────────────────────────────────
detect_device() {
log_section "Geräteerkennung"
IS_XZ1=false
# Versuche Modell über getprop (Android-Eigenschaft)
if command -v getprop &>/dev/null; then
MODEL=$(getprop ro.product.model 2>/dev/null | tr -d '[:space:]' || echo "")
for M in "${XZ1_MODELS[@]}"; do
if [[ "$MODEL" == *"$M"* ]]; then
IS_XZ1=true
break
fi
done
fi
# Fallback: /proc/cpuinfo auf MSM8998 (Snapdragon 835 Chip-ID) prüfen
if ! $IS_XZ1 && grep -qi "MSM8998\|msm8998\|Kryo" /proc/cpuinfo 2>/dev/null; then
IS_XZ1=true
MODEL="SD835-kompatibel"
fi
if $IS_XZ1; then
log_ok "Sony Xperia XZ1 / Snapdragon 835 erkannt → XZ1-Optimierungen aktiv"
log_info "Modell: ${MODEL:-unbekannt} | Big-Cores: ${SD835_BIG_CORES} | DPI: ${XZ1_DPI}"
else
log_warn "Kein XZ1 erkannt – generische Einstellungen werden verwendet"
XZ1_DEFAULT_RES="1280x720"
XZ1_DPI="96"
SD835_BIG_CORES=""
fi
}
# ─── Termux-Umgebung prüfen ─────────────────────────────────────
check_termux() {
log_section "Umgebungsprüfung"
if [ ! -d "/data/data/com.termux" ]; then
log_error "Dieses Script läuft NUR in Termux!"
exit 1
fi
log_ok "Termux-Umgebung erkannt"
# [OPT-13] RAM via /proc/meminfo (präziser als df)
TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
AVAIL_RAM_KB=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
TOTAL_RAM_MB=$((TOTAL_RAM_KB / 1024))
AVAIL_RAM_MB=$((AVAIL_RAM_KB / 1024))
log_ok "RAM: ${TOTAL_RAM_MB} MB gesamt, ${AVAIL_RAM_MB} MB verfügbar"
if [ "$AVAIL_RAM_MB" -lt 512 ]; then
log_warn "Wenig freier RAM (${AVAIL_RAM_MB} MB) – bitte andere Apps schließen"
fi
# Speicherplatz
AVAIL_KB=$(df "$HOME" | awk 'NR==2{print $4}')
AVAIL_GB=$(echo "scale=1; $AVAIL_KB/1048576" | bc)
if [ "$AVAIL_KB" -lt 1500000 ]; then
log_warn "Nur ${AVAIL_GB} GB freier Speicher (mind. 2 GB empfohlen)"
else
log_ok "Freier Speicher: ${AVAIL_GB} GB"
fi
# [OPT-14] Thermik-Warnung: Akkutemperatur prüfen
BATT_TEMP_FILE="/sys/class/power_supply/battery/temp"
if [ -r "$BATT_TEMP_FILE" ]; then
BATT_RAW=$(cat "$BATT_TEMP_FILE")
BATT_C=$((BATT_RAW / 10))
if [ "$BATT_C" -ge 40 ]; then
log_warn "${THERM} Akkutemperatur: ${BATT_C}°C – Überhitzung möglich, bitte Gerät kühlen"
else
log_ok "${THERM} Akkutemperatur: ${BATT_C}°C – OK"
fi
fi
}
# ─── Repos aktualisieren ────────────────────────────────────────
update_repos() {
log_section "Paketquellen aktualisieren"
log_info "Aktualisiere Paketquellen..."
pkg update -y 2>/dev/null || log_warn "Update mit Warnung – fahre fort..."
log_ok "Paketquellen aktuell"
}
# ─── Zusatz-Repos aktivieren ────────────────────────────────────
enable_repos() {
log_section "Zusatz-Repositories"
for REPO in "${TERMUX_PACKAGES[@]}"; do
if pkg list-installed 2>/dev/null | grep -q "^${REPO}"; then
log_ok "Repo bereits aktiv: ${REPO}"
else
log_info "Aktiviere Repository: ${REPO}..."
pkg install -y "$REPO" 2>/dev/null && \
log_ok "Repo aktiviert: ${REPO}" || \
log_warn "Repo konnte nicht aktiviert werden: ${REPO}"
fi
done
}
# ─── [OPT-02/03] Pakete prüfen & Batch-installieren ─────────────
check_and_install_packages() {
log_section "Paket-Abhängigkeiten"
# [OPT-02] pkg list-installed EINMALIG ausführen und cachen
log_info "Lese installierte Pakete (gecacht)..."
INSTALLED_CACHE=$(pkg list-installed 2>/dev/null || true)
MISSING=()
for PKG in "${MAIN_PACKAGES[@]}"; do
if echo "$INSTALLED_CACHE" | grep -q "^${PKG}"; then
log_ok "${PKG}"
else
log_warn "Fehlt: ${PKG}"
MISSING+=("$PKG")
fi
done
if [ ${#MISSING[@]} -eq 0 ]; then
echo ""
log_ok "Alle Pakete bereits installiert!"
return 0
fi
echo ""
log_info "${#MISSING[@]} Pakete werden installiert..."
# [OPT-03] BATCH-Installation: alle fehlenden Pakete in EINEM Aufruf
# → spart Overhead durch wiederholte apt-Aufrufe (~5–10× schneller)
log_info "Batch-Install: ${MISSING[*]}"
echo ""
if pkg install -y "${MISSING[@]}" 2>/tmp/pkg_install.log; then
log_ok "Alle Pakete erfolgreich installiert"
else
log_warn "Einige Pakete konnten nicht installiert werden:"
cat /tmp/pkg_install.log | grep -i "error\|unable" | head -10 || true
fi
}
# ─── VNC konfigurieren ──────────────────────────────────────────
setup_vnc() {
log_section "VNC Konfiguration"
VNC_DIR="$HOME/.vnc"
mkdir -p "$VNC_DIR"
if [ ! -f "$VNC_DIR/passwd" ]; then
log_info "Kein VNC-Passwort gefunden – bitte jetzt setzen:"
echo ""
vncpasswd
echo ""
log_ok "VNC-Passwort gesetzt"
else
log_ok "VNC-Passwort vorhanden"
read -rp " Passwort ändern? [j/N]: " CHANGE_PW
if [[ "${CHANGE_PW,,}" == "j" ]]; then
vncpasswd
log_ok "VNC-Passwort aktualisiert"
fi
fi
# ─── [OPT-12] Optimiertes xstartup ─────────────────────────
XSTARTUP="$VNC_DIR/xstartup"
if [ ! -f "$XSTARTUP" ] || grep -q "REGENERATE\|ORIGINAL" "$XSTARTUP" 2>/dev/null; then
log_info "Erstelle optimiertes VNC xstartup..."
cat > "$XSTARTUP" << 'XSTARTUP_EOF'
#!/data/data/com.termux/files/usr/bin/bash
# VNC xstartup – optimiert für Xperia XZ1 / Snapdragon 835
# [OPT-12a] SESSION_MANAGER entfernen – verhindert langsamen DBus-Timeout
unset SESSION_MANAGER
# D-Bus starten
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
eval "$(dbus-launch --sh-syntax)"
export DBUS_SESSION_BUS_ADDRESS
fi
# Umgebungsvariablen
export DISPLAY="${DISPLAY:-:1}"
export XDG_SESSION_TYPE=x11
export XDG_CURRENT_DESKTOP=XFCE
# [OPT-12b] Software-Rendering erzwingen (kein Hardware-GL über VNC möglich)
# → verhindert GL-Fallback-Delays beim XFCE-Start
export LIBGL_ALWAYS_SOFTWARE=1
export GALLIUM_DRIVER=softpipe
# [OPT-12c] Screensaver/DPMS deaktivieren (kein physisches Display → spart CPU)
xset s off 2>/dev/null || true
xset -dpms 2>/dev/null || true
xset s noblank 2>/dev/null || true
# Hintergrundsfarbe (bis Desktop lädt)
xsetroot -solid "#1a1a2e" 2>/dev/null || true
# XFCE starten
exec startxfce4
XSTARTUP_EOF
chmod +x "$XSTARTUP"
log_ok "Optimiertes xstartup erstellt"
else
log_ok "xstartup vorhanden (kein Überschreiben)"
fi
}
# ─── [OPT-10/11] XFCE Performance-Konfiguration ─────────────────
setup_xfce_config() {
log_section "XFCE Leistungsoptimierung (XZ1)"
XCONF="$HOME/.config/xfce4/xfconf/xfce-perchannel-xml"
mkdir -p "$XCONF"
# Session-Konfiguration
if [ ! -f "$XCONF/xfce4-session.xml" ]; then
cat > "$XCONF/xfce4-session.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-session" version="1.0">
<property name="startup" type="empty">
<property name="screensaver-off" type="bool" value="true"/>
</property>
<property name="general" type="empty">
<property name="SaveOnExit" type="bool" value="false"/>
</property>
</channel>
EOF
log_ok "XFCE Session-Konfiguration erstellt"
else
log_ok "XFCE Session-Konfiguration vorhanden"
fi
# [OPT-10] xfwm4: Compositing deaktivieren
# → kein Schatten/Transparenz-Rendering → deutlich weniger CPU/RAM-Last über VNC
cat > "$XCONF/xfwm4.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfwm4" version="1.0">
<property name="general" type="empty">
<!-- [OPT-10] Compositing aus: kein Schatten/Alpha über VNC -->
<property name="use_compositing" type="bool" value="false"/>
<property name="show_frame_shadow" type="bool" value="false"/>
<property name="show_popup_shadow" type="bool" value="false"/>
<!-- [OPT-11] Animationen aus: spart CPU-Zyklen bei Fensterbewegung -->
<property name="box_move" type="bool" value="false"/>
<property name="box_resize" type="bool" value="false"/>
<property name="placement_ratio" type="int" value="20"/>
<property name="frame_opacity" type="int" value="100"/>
<property name="inactive_opacity" type="int" value="100"/>
<!-- Minimales Theme für geringsten Rendering-Aufwand -->
<property name="theme" type="string" value="Default-xhdpi"/>
<property name="title_font" type="string" value="Sans Bold 9"/>
<property name="vblank_mode" type="string" value="off"/>
</property>
</channel>
EOF
log_ok "xfwm4 – Compositing & Animationen deaktiviert [OPT-10/11]"
# [OPT-11] XFCE-Desktop: Hintergrundbild deaktivieren (spart RAM/Rendering)
cat > "$XCONF/xfce4-desktop.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-desktop" version="1.0">
<property name="backdrop" type="empty">
<property name="screen0" type="empty">
<property name="monitor0" type="empty">
<property name="image-style" type="int" value="0"/>
<property name="color-style" type="int" value="0"/>
<property name="rgba1" type="array">
<value type="double" value="0.102"/>
<value type="double" value="0.102"/>
<value type="double" value="0.180"/>
<value type="double" value="1.000"/>
</property>
</property>
</property>
</property>
</channel>
EOF
log_ok "Desktop-Hintergrundbild deaktiviert (Einfarbig) [OPT-11]"
# Desktop-Verzeichnisse
mkdir -p "$HOME/Desktop" "$HOME/Downloads" "$HOME/Dokumente"
log_ok "Benutzerverzeichnisse sichergestellt"
}
# ─── [OPT-05/06/07/08/09] VNC starten ───────────────────────────
start_vnc() {
log_section "VNC Server (XZ1-optimiert)"
if pgrep -x "Xvnc" > /dev/null 2>&1; then
log_warn "VNC läuft bereits"
read -rp " Neustart? [j/N]: " RESTART
if [[ "${RESTART,,}" == "j" ]]; then
vncserver -kill :1 2>/dev/null || true
sleep 1
log_ok "Alte Instanz beendet"
else
log_info "Bestehende Sitzung wird verwendet"
return 0
fi
fi
# [OPT-08] XZ1-spezifische Auflösungsvorschläge
echo ""
log_info "Verfügbare Auflösungen (XZ1-optimiert):"
echo -e " ${DIM}1) 1080x1920 (XZ1 Nativ, Hochformat) ← empfohlen${NC}"
echo -e " ${DIM}2) 1920x1080 (Full HD, Querformat)${NC}"
echo -e " ${DIM}3) 1080x607 (16:9 kompakt, Querformat)${NC}"
echo -e " ${DIM}4) 1280x720 (HD, leichteste Last)${NC}"
echo -e " ${DIM}5) Benutzerdefiniert${NC}"
echo ""
read -rp " Auswahl [1-5, Standard=1]: " RES_CHOICE
case "${RES_CHOICE:-1}" in
2) RESOLUTION="1920x1080" ;;
3) RESOLUTION="1080x607" ;;
4) RESOLUTION="1280x720" ;;
5) read -rp " Auflösung (z.B. 1600x900): " RESOLUTION
RESOLUTION="${RESOLUTION:-${XZ1_DEFAULT_RES}}" ;;
*) RESOLUTION="${XZ1_DEFAULT_RES}" ;;
esac
# [OPT-09] DPI: 160 für XZ1 (428ppi physisch → 160 für VNC-Client lesbar)
ACTIVE_DPI="${XZ1_DPI}"
log_info "Starte VNC: ${RESOLUTION} @ ${ACTIVE_DPI} DPI..."
echo ""
# ── VNC-Start mit allen XZ1-Optimierungen ──────────────────
# [OPT-06] -nthreads 4 → nutzt 4 der 8 SD835-Kerne für Frame-Encoding
# [OPT-07] -FrameRate 30 → flüssig ohne unnötigen CPU-Verbrauch
# [OPT-09] -dpi 160 → XZ1-optimiert
VNC_CMD="vncserver :1 \
-geometry ${RESOLUTION} \
-depth 24 \
-dpi ${ACTIVE_DPI} \
-nthreads 4 \
-FrameRate 30 \
-localhost no"
# [OPT-05] taskset: VNC auf big-Cores 4–7 pinnen (Kryo 280 Gold, 2.45GHz)
# → 20–30% mehr Encoding-Throughput gegenüber zufälliger Core-Zuweisung
if $IS_XZ1 && command -v taskset &>/dev/null; then
log_info "CPU-Affinität: Big-Cores ${SD835_BIG_CORES} (Kryo 280 Gold)"
taskset -c "${SD835_BIG_CORES}" bash -c "$VNC_CMD" 2>/tmp/vnc_start.log
else
eval "$VNC_CMD" 2>/tmp/vnc_start.log
fi
sleep 2
if pgrep -x "Xvnc" > /dev/null 2>&1; then
# [OPT-05] Nachträglich auch den laufenden Xvnc-Prozess auf Big-Cores setzen
if $IS_XZ1 && command -v taskset &>/dev/null; then
XVNC_PID=$(pgrep -x "Xvnc" | head -1)
taskset -cp "${SD835_BIG_CORES}" "$XVNC_PID" 2>/dev/null && \
log_ok "Xvnc (PID ${XVNC_PID}) auf Big-Cores ${SD835_BIG_CORES} gepinnt [OPT-05]" || true
fi
log_ok "VNC Server läuft auf Display :1"
echo ""
echo -e " ${GREEN}${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e " ${GREEN}${BOLD} ${ROCKET} XFCE Desktop ist bereit!${NC}"
echo -e " ${GREEN}${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e " ${BOLD}Verbindungsdetails:${NC}"
echo -e " ${DIM}Adresse :${NC} localhost:5901 ${DIM}(oder IP:5901)${NC}"
echo -e " ${DIM}Display :${NC} :1"
echo -e " ${DIM}Auflösung:${NC} ${RESOLUTION} @ ${ACTIVE_DPI} DPI"
echo -e " ${DIM}Threads :${NC} 4 (Snapdragon 835 Big-Cores)"
echo -e " ${DIM}Framerate:${NC} 30 fps"
echo ""
echo -e " ${BOLD}Empfohlene VNC-Clients (Android):${NC}"
echo -e " ${DIM}●${NC} AVNC ${DIM}●${NC} bVNC ${DIM}●${NC} RealVNC Viewer"
echo ""
echo -e " ${DIM}VNC stoppen: ${NC}${BOLD}vncserver -kill :1${NC}"
echo ""
else
log_error "VNC Server konnte nicht gestartet werden!"
log_info "Fehlerlog:"
head -20 /tmp/vnc_start.log 2>/dev/null || true
exit 1
fi
}
# ─── [OPT-15] Schnellstarter mit XZ1-Defaults ───────────────────
create_quick_launcher() {
LAUNCHER="$HOME/xfce-start.sh"
# Variablen für den Launcher interpolieren (nicht als Heredoc-Literal)
cat > "$LAUNCHER" << LAUNCHER_EOF
#!/data/data/com.termux/files/usr/bin/bash
# XFCE Schnellstarter – XZ1-optimiert [OPT-15]
RESOLUTION="\${1:-${XZ1_DEFAULT_RES}}"
if pgrep -x "Xvnc" > /dev/null 2>&1; then
echo "VNC läuft bereits auf :1 | stoppen: vncserver -kill :1"
exit 0
fi
echo "Starte XFCE auf \${RESOLUTION} (nthreads=4, fps=30, dpi=${XZ1_DPI})..."
# Big-Cores pinnen falls taskset verfügbar
if command -v taskset &>/dev/null; then
taskset -c ${SD835_BIG_CORES} vncserver :1 \\
-geometry "\${RESOLUTION}" -depth 24 \\
-dpi ${XZ1_DPI} -nthreads 4 -FrameRate 30 -localhost no
else
vncserver :1 \\
-geometry "\${RESOLUTION}" -depth 24 \\
-dpi ${XZ1_DPI} -nthreads 4 -FrameRate 30 -localhost no
fi
echo "✔ XFCE gestartet – VNC: localhost:5901"
LAUNCHER_EOF
chmod +x "$LAUNCHER"
log_ok "XZ1-Schnellstarter erstellt: ~/xfce-start.sh [OPT-15]"
log_info "Tipp: Auflösung überschreiben via bash ~/xfce-start.sh 1280x720"
}
# ─── Hauptprogramm ──────────────────────────────────────────────
main() {
print_banner
echo -e " Dieses Script richtet ${BOLD}XFCE4${NC} als Desktop in Termux ein"
echo -e " mit Optimierungen speziell für den ${BOLD}Sony Xperia XZ1${NC}."
echo ""
read -rp " Fortfahren? [J/n]: " CONFIRM
if [[ "${CONFIRM,,}" == "n" ]]; then
echo " Abgebrochen."
exit 0
fi
detect_device # [OPT-01]
check_termux # [OPT-13] [OPT-14]
update_repos
enable_repos
check_and_install_packages # [OPT-02] [OPT-03] [OPT-04]
setup_vnc # [OPT-12]
setup_xfce_config # [OPT-10] [OPT-11]
create_quick_launcher # [OPT-15]
start_vnc # [OPT-05] [OPT-06] [OPT-07] [OPT-08] [OPT-09]
}
main "$@"
Download
pasted.sh