Einleitung
Wenn man als einzelner Entwickler mehrere Android-Apps verwaltet, entstehen regelmäßig folgende Aufgaben:
- Play Store-Screenshots neu aufnehmen
- UI-Regressionstests durchführen
- Dark-Mode-Kompatibilität überprüfen
- Mehrsprachige Darstellungsfehler erkennen
Dies alles manuell zu erledigen bedeutet, für jede App dutzende von Screenshots zu machen.
Mit uiautomator2 MCP können Sie aus Claude Code oder Cursor Android-Geräte steuern und alle Bildschirme automatisch durchlaufen und fotografieren.
Grundlegende Richtung: UI Tree + Deep Link
Es gibt zwei Methoden, um Bildschirme automatisch zu durchlaufen.
| Methode | Stabilität | Implementierungsaufwand |
|---|---|---|
| Tippen auf Koordinaten | Niedrig (anfällig) | Niedrig |
| Analyse des UI Tree | Mittel | Mittel |
| Deep Link direkte Navigation | Hoch (stabil) | Mittel bis hoch |
Warum Bildverarbeitung allein nicht ausreicht:
- LazyColumn-Scroll-Position verschiebt sich
- Taps können während Animationen fehlschlagen
- Koordinaten ändern sich auf Foldables und Tablets
- WebView-Inhalte sind nicht erkennbar
Auch moderne Android-Automations-Agenten nutzen zunehmend „UI Tree auslesen → bei Bedarf Bildanalyse hinzufügen".
Merkmale von uiautomator2 MCPs
Im Gegensatz zu einfachen ADB-Wrappern ist die Möglichkeit, den UI Tree auszulesen, die größte Stärke von uiautomator2 MCPs.
<TextView text="Settings" resource-id="btn_settings" clickable="true"/>
<Button text="Save" resource-id="btn_save"/>
Dies ermöglicht der KI:
- „Settings drücken"
- „Save suchen"
- „Elemente von RecyclerView auflisten"
und ähnliche Operationen mit natürlicher Sprache anzuweisen.
Warum tanbro/uiautomator2-mcp-server eine gute Wahl ist
Aktuell eine der ausgereiftesten Optionen bei Android-Automations-MCPs.
| Funktion | Unterstützt |
|---|---|
| Screenshot | ○ |
| UI-Hierarchie abrufen | ○ |
| XPath-Suche | ○ |
| App starten | ○ |
| Deep Link starten | ○ |
| Zurück-Taste | ○ |
| Swipe | ○ |
| Tool Filtering (nur benötigte Tools anzeigen) | ○ |
Tool Filtering ist subtil wichtig: Wenn MCPs zu viele Tools haben, kann das LLM verwirrt werden. Ein Design, das nur benötigte Tools veröffentlicht, ist für den praktischen Einsatz geeigneter.
Implementierungsmuster für automatische Erfassung
Ideale Struktur
App-Seite: Screen Registry + Deep Link
↓
uiautomator2 MCP: start/capture/back
↓
Ausgabe: screens/SettingsScreen.png usw.
In Code ausgedrückt sieht das so aus:
for screen in registry:
open_deeplink(screen.url) # adb shell am start...
wait_idle() # Bis UI stabil ist
screenshot(screen.name) # Aufnehmen und speichern
Benennungskonvention für Screenshot-Dateien
screens/
├── SettingsScreen.png
├── SettingsScreen_dark.png
├── SettingsScreen_ja.png
├── ProfileScreen.png
└── PurchaseDialog.png
Eine Benennungskonvention, die Bildschirmname, Theme und Locale kombiniert, macht Vergleiche leichter.
Eine Screen Registry in der App zu erstellen ist das Wichtigste
Wenn man sich nur auf MCP verlässt, kann es bei Scrolling, Animationen und LazyColumn zu Fehlern kommen.
Es ist grundlegend wichtig, „dedizierte Navigationspfade zum Screenshotting" in der App zu schaffen.
Beispiel einer Screen Registry (Kotlin)
object DebugScreens {
val all = listOf(
ScreenEntry("settings", "myapp://debug/settings"),
ScreenEntry("profile", "myapp://debug/profile"),
ScreenEntry("billing", "myapp://debug/billing"),
)
}
data class ScreenEntry(val name: String, val deepLink: String)
Diese Registry kann für:
- Debug-Menü-Anzeige verwendet werden
- Deep Link-Definition verwendet werden
- Screenshot-Automatisierung verwendet werden
Durch die gemeinsame Nutzung an drei Stellen wird die Wartbarkeit verbessert.
Warum Deep Link-Verfahren stabil ist
adb shell am start \
-a android.intent.action.VIEW \
-d "myapp://debug/settings"
Durch direkte Transition über Deep Links:
- Unabhängig von Scroll-Position
- Keine Verschiebung der Tap-Koordinaten
- Funktioniert gleich auf Foldables und Tablets
- Minimale Animations-Wartezeit
MCP kann sich auf die Rollen beschränken: capture / wait / Statuskontrolle.
Verwendung von Compose testTag
Bei schwierigeren Bildschirmen können Sie auch testTag verwenden, um sie mit uiautomator2 zu finden.
// testTag zu Screenshot-Ziel hinzufügen
LazyColumn(
modifier = Modifier.testTag("debug_screen_list")
) {
items(DebugScreens.all) { screen ->
Text(
text = screen.name,
modifier = Modifier.testTag("debug_item_${screen.name}")
)
}
}
Viele uiautomator2-MCPs können resource-id / accessibility / testTag auslesen, und wenn Sie testTag standardisieren, steigt die Operationsstabilität erheblich.
Hinweise
Schwache Punkte von uiautomator2
Die UI-Tree-Erfassung kann in folgenden Situationen instabil sein.
| Situation | Problem |
|---|---|
| LazyColumn | Virtuelle Knoten sind unsichtbar |
| WebView | Kein Zugriff auf interne Struktur |
| Canvas-gezeichnete UI | Kein Barrierefreiheitsbaum vorhanden |
| Während Animation | Status ist instabil |
| Virtualisierte RecyclerView | Off-screen Elemente nicht erfassbar |
Abhilfe: Vor dem Betrieb sicherstellen, dass der Bildschirm stabil ist (mit wait_idle() oder activity_wait_appear).
Sicherheitshinweis
Einige uiautomator2 MCPs können adb shell und Dateizugriff nutzen.
- Nur lokal verwenden (nicht im öffentlichen Netzwerk verfügbar machen)
- Emulator verwenden
- Mit Work Profile isolieren
Weiterentwicklung: Was wird möglich
Mit einer ausgereiften Screen Registry + Deep Link + uiautomator2 MCP Struktur:
| Anwendungsfall | Möglich |
|---|---|
| Vollständige automatische Screenshots | ○ |
| Dark Mode Vergleich | ○ |
| Mehrsprachige Fehler erkennen | ○ |
| Tablet-Überprüfung | ○ |
| Play Store Material generieren | ○ |
| UI-Überprüfung durch Claude | ○ |
| UI-Regressions-Differenzerkennung | ○ |
Zusammenfassung
| Punkt | Inhalt |
|---|---|
| Nur MCP ist instabil | Kombination mit Deep Link Methode ist stabil |
| App-seitige Vorbereitung ist entscheidend | Screen Registry + Deep Link ist am wichtigsten |
| UI Tree Auslesen ist die Stärke | „Element spezifizieren" ist stabiler als Koordinaten-Tap |
| testTag standardisieren | Compose-Operationen deutlich genauer |
| MCP auf Erfassungsebene begrenzen | capture / wait / Statuskontrolle ist die Aufgabe |
„MCP versuchen zu nutzen um Bildschirme zu suchen" ist weniger wichtig als „Screen Registry + Deep Link in die App implementieren". MCP sollte als Operationsebene darüber verwendet werden.