Builtin progress

An adb-based game QA server

A game screen exposes no UI tree. So it's driven by sight, and judged by logs.

300 cycles

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.