🔌ADB verstehen

Die Android Debug Bridge ist die Leitung zwischen Rechner und Fernseher. Sie besteht aus drei Teilen – und spricht ein erstaunlich kleines Protokoll mit nur sechs Nachrichtentypen.

⌨️
Client
das Programm adb im Terminal

Nimmt deinen Befehl entgegen, reicht ihn an den Server weiter und beendet sich wieder.

🖥️
Server
Hintergrundprozess am Rechner, TCP 5037

Hält die Verbindungen zu allen Geräten offen, besitzt den RSA-Schlüssel und verteilt die Befehle der Clients.

📺
Daemon adbd
Dienst auf dem Fernseher, TCP 5555

Läuft nur bei eingeschaltetem Debugging. Führt Befehle als Benutzer shell (uid 2000) aus – ohne Root-Rechte.

🔬Debugger: adb connect → AUTH → OPEN → WRTE

Der Ablauf zeigt die erste Verbindung zu einem Fernseher (mit Freigabedialog) und danach den Befehladb shell getprop ro.build.version.release. Klick dich mit „Weiter“ durch oder direkt auf einen Pfeil.

Schritt 1 / 16
adb (Client)Terminaladb-Server127.0.0.1:5037adbdFernseher :5555host:connect1TCP → Port 55552CNXN3AUTH (1)4AUTH (2)5AUTH (1)6AUTH (3)7USB-Debugging zulassen?8CNXN9OKAY10host:transport + shell:11OPEN12OKAY13WRTE14OKAY15CLSE16
Smart Socket (lokal)

Client bittet den Server

Das Programm adb ist nur der Client. Es öffnet 127.0.0.1:5037 (startet den Server, falls keiner läuft) und schickt den Dienstnamen mit vierstelliger Hex-Länge davor.

$ adb connect 192.0.2.50:5555
Auf dem lokalen Socket
001chost:connect:192.0.2.50:5555

📎 Quellen: AOSP – adb/docs/dev/protocol.md (früher protocol.txt) · AOSP – adb.h · AOSP – adb.cpp (Stand Android 9) · Android Developers – Android Debug Bridge (adb)

✉️Die Nachrichtentypen

KürzelKonstanteBedeutung
CNXN0x4e584e43CONNECT(version, maxdata, "system-identity-string")
Beide Seiten stellen sich vor: Protokollversion, größte Nutzlast, Kennung „host::…“ bzw. „device::…“.
AUTH0x48545541AUTH(type, 0, "data")
Anmeldung: TOKEN (1) = Zufallswert vom Gerät, SIGNATURE (2) = Signatur des Rechners, RSAPUBLICKEY (3) = öffentlicher Schlüssel.
OPEN0x4e45504fOPEN(local-id, 0, "destination")
Öffnet einen Datenstrom zu einem Dienst, z. B. „shell:…“. Die local-id darf nicht 0 sein.
OKAY0x59414b4fREADY(local-id, remote-id, "")
Bestätigung: Strom steht bzw. das letzte WRITE ist angekommen – erst danach darf das nächste WRITE folgen.
WRTE0x45545257WRITE(local-id, remote-id, "data")
Nutzdaten für den Strom der Gegenseite; höchstens maxdata Byte.
CLSE0x45534c43CLOSE(local-id, remote-id, "")
Strom beendet. Auf ein CLOSE wird nicht geantwortet.
SYNC0x434e5953SYNC(online, sequence, "")
Nur intern im adb-Server; darf nie über die Leitung gehen.

Die Konstante ist nichts Geheimnisvolles: die vier ASCII-Buchstaben, als 32-Bit-Zahl in Little Endian gelesen. „CNXN“ = 43 4e 58 4e → 0x4e584e43. Das letzte Kopffeld magic ist dieselbe Zahl mit umgedrehten Bits. Neuere Fassungen des Protokolls kennen zusätzlich STLS (0x534c5453): Damit kündigt eine Seite an, dass die Verbindung per TLS verschlüsselt wird – so arbeitet das Debugging über WLAN mit Kopplungscode.

📎 Quelle: AOSP – adb/docs/dev/protocol.md (früher protocol.txt)

🧪Die wichtigsten adb-Befehle

Verbinden, prüfen, trennen
adb connect 192.0.2.50:5555     # Standardport 5555 darf entfallen
adb devices -l                  # device | unauthorized | offline
adb -s 192.0.2.50:5555 shell    # interaktive Shell auf dem Fernseher
adb -s 192.0.2.50:5555 shell id # uid=2000(shell) …
adb disconnect 192.0.2.50:5555
adb kill-server                 # Server beenden (startet beim nächsten Befehl neu)
ZustandBedeutungAbhilfe
deviceverbunden und freigegeben–
unauthorizedSchlüssel am Fernseher nicht bestätigtDialog am Gerät bestätigen
offlineVerbindung bekannt, Gerät antwortet nichtGerät wecken, adb disconnect, neu verbinden
Connection refusedPort 5555 ist zuDebugging einschalten; Adresse prüfen
Mehrere Geräte? Immer -s angeben
Sobald ein zweites Gerät verbunden ist, verweigert adb Befehle ohne Ziel („more than one device/emulator“). Alle Skripte dieser App rufen deshalb adb -s "$TV_HOST" auf.

📎 Quelle: Android Developers – Android Debug Bridge (adb)