Fire TV Stick: TV-Apps automatisch starten per ADB – Autostart mit Home-Server oder Raspberry Pi

- Veröffentlicht unter Makerspace von

Hinweis: Der Beitrag wurde von KI entworfen und manuell nachbearbeitet. Er beschreibt ein real aufgebautes Projekt; Zugangsdaten, IP-Adressen und Gerätenamen wurden anonymisiert.

Update 24.02.2026: Bash-Script erweitert

Der Amazon Fire TV Stick ist eigentlich nicht dafür gedacht, sich wie ein klassischer TV-Receiver zu verhalten.
Nach dem Einschalten landet man immer im Amazon-Launcher – die gewünschte TV-App muss jedes Mal manuell gestartet werden.

Ziel dieses Projekts war es daher, nach dem Einschalten des Fire TV Sticks automatisch eine TV-App zu starten:

  • ohne Root
  • ohne Launcher-Ersatz
  • ohne zusätzliche Apps auf dem Fire TV
  • stabil und reproduzierbar

Die Lösung nutzt ADB über das Netzwerk und einen externen Linux-Rechner, der ohnehin dauerhaft läuft (z. B. Home-Server oder Raspberry Pi).


Wichtige Einschränkung vorab

Der Fire TV Stick selbst bietet keine Autostart-Funktion für Apps.
Alles, was hier beschrieben wird, ist ein externer Workaround.

Das bedeutet konkret:

  • ein dauerhaft laufender Rechner ist zwingend erforderlich
  • der Fire TV Stick muss per Netzwerk erreichbar sein
  • die Lösung ist nicht offiziell unterstützt, funktioniert im Alltag aber zuverlässig

Voraussetzungen

Hardware / Umgebung

  • Amazon Fire TV Stick
  • dauerhaft laufender Linux-Rechner (Home-Server, Raspberry Pi, NAS o. Ä.)
  • funktionierende Netzwerkverbindung zwischen beiden Geräten

Netzwerk

Der Fire TV Stick benötigt eine feste IP-Adresse.

Empfohlen: - feste Zuordnung im Router (DHCP-Reservierung)

Im gesamten Beitrag wird deshalb mit folgendem Platzhalter gearbeitet:

IP_DES_FIRESTICKS

Fire OS: Entwickleroptionen und ADB

Getestet mit:

  • Amazon Fire TV Stick (3. Generation)
  • Fire OS 7.7.0.8

Je nach Fire-OS-Version können sich Menübezeichnungen leicht unterscheiden.

Entwickleroptionen aktivieren

  1. Einstellungen → Mein Fire TV → Info
  2. Mehrfach auf „Fire TV Stick“ klicken, bis der Entwicklermodus freigeschaltet ist

ADB-Debugging aktivieren

  • Einstellungen → Mein Fire TV → Entwickleroptionen
  • ADB-Debugging auf EIN setzen

Hinweis:
„Apps aus unbekannten Quellen“ existiert bei neueren Fire-OS-Versionen nicht mehr global.
Beim ersten ADB-Zugriff erscheint stattdessen eine Sicherheitsabfrage auf dem Fernseher, die einmalig bestätigt werden muss.


ADB auf dem Linux-Rechner einrichten

ADB installieren (Beispiel Debian/Ubuntu):

sudo apt install adb

Verbindung zum Fire TV Stick herstellen:

adb connect IP_DES_FIRESTICKS:5555

Dabei steht IP_DES_FIRESTICKS für die feste IP-Adresse des eigenen Fire TV Sticks.


App-Name und Activity ermitteln

Um eine App gezielt starten zu können, benötigt man Paketname und Activity.

Alle installierten Pakete anzeigen:

adb shell pm list packages

Aktive App ermitteln (wenn sie gerade läuft):

adb shell dumpsys window | grep -E 'mCurrentFocus|mFocusedApp'

Beispiel:

de.o2tv.firetv/com.telefonica.video.stv.launcher.LauncherActivity

Die O₂-TV-App dient hier nur als Beispiel.
Das Vorgehen ist identisch für andere TV-Apps.


Autostart-Script (Bash)

Das Script läuft auf dem externen Linux-Rechner.
Es wartet, bis der Fire TV Stick erreichbar ist, prüft, ob Android vollständig gebootet ist, startet die App und bestätigt nach einer festen Wartezeit eine mögliche Profilabfrage.

#!/usr/bin/env bash
set -euo pipefail

FIRETV_IP="IP_DES_FIRESTICKS"
ADB_PORT="5555"
COMPONENT="PAKETNAME/ACTIVITY"
LAUNCHER="com.amazon.tv.launcher"

CHECK_INTERVAL=2          # Sekunden
OPEN_CONFIRM=3            # Port offen am Stück => "wirklich offen"
ADB_READY_TIMEOUT=60      # max warten bis adb devices "device"
BOOT_TIMEOUT=120          # max warten bis sys.boot_completed=1
COOLDOWN_SECONDS=120      # nach Start erstmal Ruhe

log() { echo "$(date -Is) $*"; }

is_open() {
  nc -z -w1 "$FIRETV_IP" "$ADB_PORT" >/dev/null 2>&1
}

adb_is_device() {
  adb devices | grep -q "${FIRETV_IP}:${ADB_PORT}[[:space:]]*device"
}

is_awake() {
  # Prüft, ob das Gerät wirklich wach ist (nicht Standby/Dreaming)
  adb shell dumpsys power 2>/dev/null | grep -q "mWakefulness=Awake"
}

boot_completed() {
  adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r' | grep -q '^1$'
}

get_current_focus() {
  adb shell dumpsys window | grep -E 'mCurrentFocus|mFocusedApp' | grep -oE '[a-zA-Z0-9._]+/[a-zA-Z0-9._]+' | cut -d'/' -f1 | head -n 1
}

was_open=0
open_streak=0
last_start=0

while true; do
  if is_open; then
    open_streak=$((open_streak+1))
  else
    open_streak=0
  fi

  open_now=0
  if [ "$open_streak" -ge "$OPEN_CONFIRM" ]; then
    open_now=1
  fi

  # Flanke: geschlossen -> offen (Netzwerkseitig)
  if [ "$was_open" -eq 0 ] && [ "$open_now" -eq 1 ]; then
    now=$(date +%s)
    if [ $((now - last_start)) -lt "$COOLDOWN_SECONDS" ]; then
      log "ADB port open, but cooldown active. Skipping."
    else
      log "ADB port is open. Connecting and checking state..."

      # 1) Warten bis adb wirklich "device" ist
      start_ts=$(date +%s)
      while true; do
        adb connect "${FIRETV_IP}:${ADB_PORT}" >/dev/null 2>&1 || true
        if adb_is_device; then break; fi
        if [ $(( $(date +%s) - start_ts )) -ge "$ADB_READY_TIMEOUT" ]; then
          log "ADB not ready. Giving up."
          break
        fi
        sleep 2
      done

      if adb_is_device; then
        # ZUSATZ-CHECK: Ist das Gerät wirklich wach?
        if ! is_awake; then
          log "Device is in Standby (not Awake). Aborting."
          # Wir setzen was_open auf 1, damit die Flanke erst bei echtem Aus/An wieder triggert
          # Alternativ auf 0 lassen, wenn du willst, dass er es alle 2 Sek probiert
          was_open=1 
          adb disconnect "${FIRETV_IP}:${ADB_PORT}" >/dev/null 2>&1
          sleep "$CHECK_INTERVAL"
          continue
        fi

        # 2) Warten bis Android wirklich fertig gebootet ist
        log "Device is Awake. Waiting for boot_completed..."
        boot_ts=$(date +%s)
        while true; do
          if boot_completed; then break; fi
          if [ $(( $(date +%s) - boot_ts )) -ge "$BOOT_TIMEOUT" ]; then
            log "Boot timeout. Starting Anyway."
            break
          fi
          sleep 2
        done

        # 3) Fokus-Check
        CURRENT_FOCUS=$(get_current_focus)
        log "Current Focus: [$CURRENT_FOCUS]"

        if [ "$CURRENT_FOCUS" = "$LAUNCHER" ] || [ -z "$CURRENT_FOCUS" ]; then
          log "Launcher detected. Starting O2 TV..."
          adb shell am start -n "$COMPONENT" >/dev/null 2>&1 || true
          sleep 25
          adb shell input keyevent 23 >/dev/null 2>&1 || true
          last_start=$(date +%s)
        else
          log "Blocked: Another app ($CURRENT_FOCUS) is active."
        fi
      fi
    fi
  fi

  was_open="$open_now"
  sleep "$CHECK_INTERVAL"
done

systemd-Integration

Script nach /usr/local/bin kopieren und ausführbar machen:

sudo chmod +x /usr/local/bin/firetv-autostart.sh

Service-Datei anlegen:

/etc/systemd/system/firetv-autostart.service

Inhalt:

[Unit]
Description=Fire TV Stick Autostart per ADB
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/firetv-autostart.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Service aktivieren:

sudo systemctl daemon-reload
sudo systemctl enable firetv-autostart.service
sudo systemctl start firetv-autostart.service

Einordnung ins Smart Home

Der externe Rechner läuft in meinem Fall ohnehin dauerhaft – unter anderem für Home Assistant.
Der Fire-TV-Autostart ist damit kein isolierter Sonderfall, sondern Teil eines größeren Smart-Home-Setups.

Weitere ähnliche Projekte finden sich in der
Smart-Home-Kategorie.


Fazit

Der Amazon Fire TV Stick ist nicht dafür gedacht, TV-Apps wie ein klassischer Receiver automatisch zu starten.
Mit einem dauerhaft laufenden Linux-System, ADB und einer festen IP-Adresse lässt sich dieses Verhalten dennoch zuverlässig nachbilden.

Die Lösung ist pragmatisch, nicht offiziell und technisch etwas schmutzig – funktioniert bei mir aber zuverlässig.