만든 도구진행 중

adb 기반 게임 QA 서버

게임 화면은 UI 트리가 없습니다. 그래서 눈으로 조작하고, 판정은 로그로 합니다. 로그가 못 정하는 화면은 AI 판독기가 봅니다.

300 사이클

휴대폰을 USB로 연결해 두고, 게임을 사람 없이 자동으로 검사하는 프로그램을 만들었습니다. 이미 나와 있는 자동화 도구를 못 써서 직접 만들었습니다.

왜 기성 도구를 못 썼나 — 게임 화면에는 붙잡을 게 없습니다

이게 이 프로젝트의 출발점입니다. 여기만 이해하시면 나머지가 다 따라옵니다.

일반 앱은 화면에 있는 것들이 각각 이름을 달고 올라가 있습니다. 「로그인 버튼」이라는 이름이 실제로 붙어 있습니다.

그래서 자동화 도구가 이렇게 말할 수 있습니다 — 「로그인 버튼을 눌러라.」 도구가 이름으로 찾아서 누릅니다. 화면 크기가 달라도, 위치가 바뀌어도 찾습니다.

게임은 다릅니다. 게임은 화면 전체를 그림 한 장처럼 통째로 그립니다. 버튼처럼 보이는 것도 그냥 그림입니다.

일반 앱 게임
화면 구성 이름 붙은 부품들 그림 한 장
「로그인 버튼」을 찾으면 찾아냄 아무것도 없음

그래서 기성 도구가 게임 화면을 보면 텅 비어 있는 것으로 보입니다. 누를 것을 못 찾습니다.

그래서 방식을 바꿨습니다 — 「눈으로 누르고, 기록으로 판정한다」

이 프로젝트 전체를 관통하는 한 줄입니다.

무엇을 어떻게
누르기 화면 사진을 보고 위치를 판단해서 누름
됐는지 판정 게임이 남긴 기록을 읽어서 판정
기록으로 못 정하는 것 AI가 화면 사진을 판정하고, 규칙이 그 근거를 다시 확인 (2026-09~)

둘을 갈라 놓은 게 핵심입니다. 그리고 판정을 사진에서 기록으로 옮긴 것이 이 프로젝트 최대의 개선이었습니다. 왜 그런지는 아래 글에 적어 뒀습니다.

그래도 기록에 끝내 안 남는 것이 있습니다 — 「화면에 무엇이 보이나」입니다. 그 검사는 2026-09 부터 사진 판독기가 사람 대신 판정합니다.

규모

파이썬으로 만들었고, 기능 22가지에 검사 코드가 353개 붙어 있습니다(처음엔 104개). 실제 휴대폰을 USB나 무선으로 물려 놓고 돌리고, 지금 검사 목록은 248개입니다.

밤새 무인으로 300번 돌린 적이 있습니다.

네 갈래로 나눠 적었습니다

무엇이 문제인가
조작과 판정 붙잡을 게 없는 화면을 어떻게 누르고, 무엇으로 결과를 정하나
무인 루프 사람이 안 보는 동안 돌려면 무엇이 필요한가
나온 것 밤새 돌린 결과, 그리고 자동화 탓이 아닌 것이 처음 나왔을 때
사진 판독기 기록으로 못 정하는 화면을 AI가 판정해도 믿을 수 있으려면

덧붙여 — 같은 검사를 PC 판에도 돌렸습니다

검사 목록은 원래 휴대폰용으로 쓰여 있었는데, 같은 게임의 PC 판도 확인해야 했습니다.

같은 게임이라도 조작 방법이 완전히 다릅니다. 그런데 확인해야 하는 내용은 같습니다. 그 사이를 어떻게 이었는지도 적어 뒀습니다.

여기부터는 자세한 기록입니다

안드로이드 게임 빌드를 자동으로 검증하는 커스텀 MCP 서버. Python, 도구 22종, 유닛테스트 104개(2026-09 기준 353개). 실기기를 USB로 물려 놓고 돌린다(2026-09 기준 무선 adb 가 기본, 끊기면 1분마다 다시 붙는다).

기성 안드로이드 자동화 도구를 쓸 수 없어서 직접 만들었다. 이유가 하나 있다.

게임 화면에는 붙잡을 게 없다

일반 앱은 접근성 트리가 있다. “로그인 버튼”이라고 이름을 부르면 도구가 찾아서 누른다.

게임은 화면 전체를 네이티브 서피스 하나에 그린다. 트리를 뽑으면 빈 껍데기가 나온다. 버튼도, 텍스트도, 좌표도 없다. 있는 건 픽셀뿐이다.

기성 도구가 전제하는 것이 전부 없으니, 조작과 판정을 각각 다시 만들어야 했다.

네 갈래로 적었다

무엇이 문제인가
조작과 판정 붙잡을 게 없는 화면을 어떻게 누르고, 무엇으로 결과를 정하나
무인 루프 사람이 안 보는 실행이 성립하려면 무엇이 필요한가
나온 것 밤새 돌린 결과와, 자동화 결함이 아닌 것이 처음 나왔을 때
사진 판독기 로그가 못 정하는 화면을 무엇이 판정하고, 그 판정은 무엇이 다시 거르나 (2026-09 추가)

같은 케이스를 PC 빌드에도

케이스 세트는 폰용으로 쓰여 있었는데, 같은 게임의 PC 빌드도 검증해야 했다.

126개를 다시 쓰는 대신 전송층만 갈았다. 하네스가 adb를 기대하는 자리에 파일 브리지를 끼웠다. 명령 표면은 그대로고 반대편만 다른 것.

통한 이유는 케이스가 애초에 안드로이드에 관심이 없었기 때문이다. 여기를 누르고, 기다리고, 이게 떴는지 확인한다 에만 관심이 있었다. 기기 의존은 맨 아래 한 층뿐이었고, 그 한 층을 갈아 끼우니 라이브러리가 통째로 살았다. 풀런 126케이스 937초.