The Problem

Controlling Android devices programmatically is a royal pain. Sure, you can hack together some ADB scripts, but good luck handling dynamic screens, inconsistent layouts, or pixel-perfect taps. And trying to automate tasks like "open Chrome and Google something" using traditional tools? Forget it. You’ll be drowning in brittle XPath selectors and trial-and-error debugging.

What This Does

PhoneDriver bridges the gap between visual understanding and mobile automation. With the Qwen3-VL vision-language model, it analyzes screenshots like a human would and uses ADB commands to act on them. The heavy lifting happens in qwenvlagent.py, where the Qwen3-VL model processes incoming screenshots and plans actions. The actual execution—ADB commands—is handled by phoneagent.py.

The repo also comes with a Gradio-based web UI (ui.py) that lets you describe tasks in plain English. No coding required. Type “Enable WiFi” or “Open Instagram,” and the agent figures out the rest. Configuration lives in config.json, where you can tweak screen resolution, model behavior, and execution timing.

Want to swap between dense and MoE Qwen3-VL models? You’ll need to edit qwenvl_agent.py and change imports and initialization logic. Yeah, it’s manual, but it’s not rocket science.

Real-World Use

Let’s say you’re testing a mobile app. Instead of manually clicking through screens, you fire up the web UI (python ui.py) and tell the agent:

The agent takes a screenshot, analyzes the UI with Qwen3-VL, identifies relevant buttons, and sends ADB commands to interact with them. If something goes wrong (e.g., a button isn’t found), the live log in Gradio tells you why.

Alternatively, if you’re more comfortable with code, you can skip the UI and use the CLI:

The Bottom Line

PhoneDriver is solid if you need automation for Android devices that’s smarter than hardcoded scripts. The Qwen3-VL integration is impressive, but the setup feels a bit rough—you’re editing Python files to change models or tweak configs, which could’ve been more user-friendly. If you’re comfortable with Python and have a beefy GPU, this is worth it. For casual users or small projects, it’s probably overkill.