Introduction
Si vous gérez plusieurs applications Android en tant que développeur solo, vous rencontrez régulièrement des tâches comme celles-ci :
- Recapturer des captures d'écran pour le Play Store
- Vérifications de régression UI
- Vérification du mode sombre
- Vérifications de mise en page cassée en multi-langue
Fait manuellement, cela nécessite des dizaines de captures d'écran par application.
Avec uiautomator2 MCP, vous pouvez automatiser l'ensemble du processus — contrôler un appareil Android depuis Claude Code ou Cursor pour parcourir et capturer chaque écran automatiquement.
Stratégie principale : Arbre UI + DeepLink
Il y a deux approches principales pour le parcours automatisé des écrans :
| Approche | Stabilité | Coût d'implémentation |
|---|---|---|
| Parcourir par clics de coordonnées | Faible (se casse facilement) | Faible |
| Parcourir par analyse de l'arbre UI | Moyen | Moyen |
| Naviguer directement via DeepLink | Élevée (stable) | Moyen–Élevé |
Pourquoi la reconnaissance d'image seule n'est pas fiable :
- La position de défilement de LazyColumn dérive
- Les clics manquent pendant les animations
- Les coordonnées changent sur les foldables et tablettes
- Les internes de WebView ne sont pas accessibles
Les agents d'automatisation Android modernes suivent le même pattern : "lire l'arbre UI d'abord, revenir à l'analyse d'image uniquement quand nécessaire."
Ce qui distingue uiautomator2 MCP
Contrairement à un simple wrapper ADB, uiautomator2 MCP peut lire l'arbre UI — et c'est son plus grand avantage.
<TextView text="Paramètres" resource-id="btn_settings" clickable="true"/>
<Button text="Enregistrer" resource-id="btn_save"/>
Cela permet à l'IA de recevoir des instructions en langage naturel comme :
- "Appuyer sur Paramètres"
- "Trouver Enregistrer"
- "Lister les enfants de RecyclerView"
Pourquoi tanbro/uiautomator2-mcp-server est un bon choix
C'est l'une des options MCP d'automatisation Android les plus complètes disponibles aujourd'hui.
| Fonctionnalité | Support |
|---|---|
| screenshot | ✓ |
| Récupération hiérarchie UI | ✓ |
| Recherche XPath | ✓ |
| Lancement d'application | ✓ |
| Lancement DeepLink | ✓ |
| Touche Retour | ✓ |
| Swipe | ✓ |
| Filtrage d'outils (exposer uniquement les outils nécessaires) | ✓ |
Le filtrage d'outils est discrètement important — trop d'outils MCP confondent les LLM, donc pouvoir n'exposer que ce qui est nécessaire est une fonctionnalité de conception pratique.
Pattern d'implémentation de capture
Architecture idéale
Côté application : Screen Registry + DeepLink
↓
uiautomator2 MCP : démarrer / capturer / retour
↓
Sortie : screens/SettingsScreen.png, etc.
En code :
for screen in registry:
open_deeplink(screen.url) # adb shell am start...
wait_idle() # attendre que l'UI se stabilise
screenshot(screen.name) # capturer et enregistrer
Convention de nommage pour les fichiers capturés
screens/
├── SettingsScreen.png
├── SettingsScreen_dark.png
├── SettingsScreen_ja.png
├── ProfileScreen.png
└── PurchaseDialog.png
Inclure le nom de l'écran, le thème et la locale dans le nom de fichier facilite la comparaison.
La chose la plus importante : Construire un Screen Registry dans votre application
Se fier uniquement à MCP se casse sur les positions de défilement, les animations et la virtualisation LazyColumn.
L'investissement critique est de construire un "chemin de capture dédié" à l'intérieur de l'application elle-même.
Exemple de 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)
Utilisez ce Registry pour trois objectifs :
- Afficher le menu Debug
- Définir les DeepLinks
- Piloter l'automatisation des captures d'écran
Le partager entre les trois garde la maintenance simple.
Pourquoi la navigation DeepLink est stable
adb shell am start \
-a android.intent.action.VIEW \
-d "myapp://debug/settings"
Naviguer directement via DeepLink signifie :
- Pas de dépendance à la position de défilement
- Pas de dérive de coordonnées due aux clics manqués
- Fonctionne de la même façon sur les foldables et tablettes
- Temps d'attente d'animation minimal
Cela permet à MCP de se concentrer purement sur la capture / l'attente / la vérification d'état.
Tirer parti de Compose testTag
Pour les écrans où DeepLink est difficile, vous pouvez taguer les éléments avec testTag et laisser uiautomator2 les trouver :
// Taguer la cible de capture
LazyColumn(
modifier = Modifier.testTag("debug_screen_list")
) {
items(DebugScreens.all) { screen ->
Text(
text = screen.name,
modifier = Modifier.testTag("debug_item_${screen.name}")
)
}
}
La plupart des MCP uiautomator2 peuvent lire resource-id, accessibilité et testTag. Standardiser les valeurs testTag améliore dramatiquement la stabilité des opérations.
Mises en garde
Où uiautomator2 a des difficultés
La récupération de l'arbre UI peut être peu fiable dans ces situations :
| Situation | Problème |
|---|---|
| LazyColumn | La virtualisation cache les nœuds hors écran |
| WebView | L'arbre interne est inaccessible |
| UI rendue sur canvas | Pas d'arbre d'accessibilité |
| Pendant les animations | L'état est instable |
| Virtualisation RecyclerView | Les éléments hors écran ne peuvent pas être récupérés |
Mitigation : confirmer que l'écran s'est stabilisé avant d'agir (wait_idle() ou activity_wait_appear).
Ce qui devient possible
Avec Screen Registry + DeepLink + uiautomator2 MCP en place :
| Cas d'utilisation | Faisable ? |
|---|---|
| Capture automatique de tous les écrans | ✓ |
| Comparaison mode sombre | ✓ |
| Régression de mise en page multi-langue | ✓ |
| Vérification tablette | ✓ |
| Génération d'assets Play Store | ✓ |
| Revue UI pilotée par Claude | ✓ |
| Détection de diff de régression UI | ✓ |
Résumé
| Point clé | Détail |
|---|---|
| L'exploration MCP seule est instable | Combiner avec la navigation DeepLink pour la stabilité |
| La préparation côté application est critique | Screen Registry + DeepLink est l'investissement le plus important |
| La lecture de l'arbre UI est le vrai avantage | Cibler les éléments bat le clic de coordonnées |
| Standardiser testTag | Améliore dramatiquement la précision des opérations Compose |
| Garder MCP dans la couche de capture | Son rôle est uniquement la capture / l'attente / la vérification d'état |
"Essayer fort d'explorer les écrans via MCP" est bien moins efficace que "construire un Screen Registry + DeepLink dans votre application." MCP fonctionne mieux comme couche d'opération sur ce fondement.