An adb-based game QA server
A game screen exposes no UI tree. So it's driven by sight, and judged by logs.
A custom MCP server that verifies Android game builds unattended. Python, 22 tools, 104 unit tests, driving a real handset over USB.
I built it because off-the-shelf Android automation couldn’t be used. There’s one reason for that.
A game screen has no handles
A normal app exposes an accessibility tree. Ask for “the login button” by name and the tooling finds it and taps it.
A game draws the entire screen into a single native surface. Dump the tree and you get an empty shell — no buttons, no text, no coordinates. Only pixels.
Everything an off-the-shelf tool assumes is absent, so driving and judging both had to be rebuilt.
Written up in three parts
| The problem | |
|---|---|
| Driving and judging | How to tap a screen with no handles, and what decides the result |
| The unattended loop | What a run nobody is watching actually requires |
| What came out | An overnight run, and the first thing that wasn’t an automation defect |
The same cases against a PC build
The case set was written for handsets, but the same game’s PC build needed verifying too.
Rather than rewrite 126 cases, I swapped the transport layer. Where the harness expected adb, I put a file bridge — same command surface, different thing on the other end.
It worked because the cases never cared about Android. They cared about tap here, wait, check this appeared. Device dependence lived in exactly one layer at the bottom, and replacing that layer kept the whole library. Full run: 126 cases, 937 seconds.