# adb 기반 게임 QA 서버

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

- 수치: 300 사이클
- 상태: wip
- 사람이 보는 화면: https://aitryed.com/ko/built/android-qa/
- 반대 언어: https://aitryed.com/en/built/android-qa/index.md
- 이 사이트 안내(AI용): https://aitryed.com/ko/llms.txt

---

**휴대폰을 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분마다 다시 붙는다).

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

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

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

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

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

## 네 갈래로 적었다

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

## 같은 케이스를 PC 빌드에도

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

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

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