모바일 자동화 도구는 15년째 화면 뒤의 구조를 읽어왔습니다. 접근성 트리, 엘리먼트 ID, XPath 셀렉터. 그런데 이 데모는 구조를 아예 보지 않고 화면 그 자체를 봅니다.

구글의 필립 슈미트가 Gemini 3.7 Flash로 안드로이드 에뮬레이터를 조작한 기록을 공개했습니다. 코딩과 에이전트 작업을 겨냥해 최근 나온 구글의 첫 하이브리드 추론 모델이죠. 자사 모델을 자사 직원이 시연한 글이라는 점은 감안하고 읽는 편이 낫습니다.
출처: Controlling Android with Gemini 3.7 Flash and 150 lines of Python – philschmid.de
15년째 같은 자리에서 깨지는 것
Appium, Espresso, UIAutomator. 이름은 달라도 의존하는 곳은 같습니다. 접근성 트리와 엘리먼트 ID, XPath 셀렉터죠.
문제는 이 좌표계가 UI 코드에 묶여 있다는 점이죠. 제품팀이 A/B 테스트를 돌리거나, 결제 카드를 다시 디자인하거나, 마케팅 배너를 하나 얹으면 스크립트가 깨집니다. 화면상으로는 아무것도 달라지지 않았는데 말이죠.
웹뷰나 캔버스로 그린 게임은 사정이 더 나쁩니다. ADB 쪽에 노출되는 접근성 노드가 아예 없는 경우가 흔하니까.
스크린샷 하나로 도는 다섯 단계
이 접근은 사람이 폰을 쓰는 방식에 더 가깝습니다. 모델이 날것의 스크린샷을 보고 요소가 어디쯤 있는지 판단한 뒤, 0~999로 정규화한 좌표를 돌려주는 구조입니다. 클릭도, 텍스트 입력도, 키 입력도 같은 방식으로 나갑니다.
루프는 다섯 단계로 돌아갑니다.
- 캡처 — ADB로 화면을 찍어 Base64로 인코딩
- 판단 — Gemini가 이미지를 보고 다음 동작을 계획
- 좌표 방출 — 정규화 좌표와 의도를 담은 툴 호출을 반환 (예:
click(x=884, y=190)) - 실행 — 파이썬이 0~999 값을 실제 픽셀로 환산해 탭을 발생
- 이어가기 — 새 스크린샷을 결과로 되돌려 같은 세션을 이어감
왜 하필 Flash인가 하는 대목이 여기서 걸립니다. 탭 사이에 몇 초씩 기다리면 화면 상태가 어긋나기 시작하죠. 하이브리드 추론 모델의 짧은 턴 지연이 이 루프를 인터랙티브한 속도로 붙잡아 둡니다.
Wordle을 두 번 만에
주어진 과제는 하나였습니다. Wordle 한 판을 플레이하라는 것.
에이전트는 홈 화면에서 Chrome을 패키지 이름으로 열고, 새 탭을 띄운 뒤 주소를 입력했습니다. 페이지가 뜨자 “How to Play” 튜토리얼과 통계 창이 게임판을 가렸죠. 닫기 아이콘 두 개를 찾아 눌렀습니다.
첫 단어는 모음이 많은 표준 오프너 CRANE. 결과가 색으로 돌아왔습니다. C는 노랑, R·A·N은 회색, E는 초록이었죠.
여기서부터가 이 데모의 볼거리입니다. 모델은 R·A·N을 빼고, C를 중간 어딘가에 넣고, E로 끝나는 단어를 추렸습니다. 그렇게 고른 SPICE에서 다섯 칸이 전부 초록으로 바뀌었죠. 승리 팝업을 확인하고 스스로 멈췄습니다.
좌표를 정확히 찍었다는 것보다, 색으로만 주어진 피드백을 추론에 집어넣었다는 쪽이 눈에 띕니다.
구조를 읽지 않을 때 생기는 값
자동화가 기대는 지점이 UI 구조에서 화면 픽셀로 옮겨가면, 리디자인에 덜 부서집니다. 배너가 하나 늘어도 모델은 그냥 새 화면을 볼 뿐이죠.
대신 다른 비용이 붙습니다. 스텝마다 스크린샷을 왕복시켜야 하고, 좌표는 정규화 값이라 기기 해상도로 환산하는 층이 하나 더 필요한 겁니다. 셀렉터가 명시적으로 맞고 틀리는 것과 달리, 좌표는 조금씩 어긋날 수 있다는 점도 다릅니다.
조건도 짚어둘 만합니다. 이 기록은 실제 단말이 아니라 에뮬레이터에서, 게임 한 판이라는 과제로 얻은 결과죠. 로그인이나 결제처럼 실수의 대가가 큰 화면에서도 같은 안정성이 나오는지는 별개 문제입니다.
해보려면
환경: 안드로이드 에뮬레이터와 ADB 연결, google-genai 파이썬 SDK. 모델은 gemini-3.7-flash, thinking 수준은 medium, 좌표 환산은 1080×1920 기준
출발점: tools=[{"type": "computer_use", "environment": "mobile"}]로 인터랙션을 생성하고, 반환된 좌표를 adb shell input tap으로 실행한 뒤 새 스크린샷을 function_result로 회신
확인: 모델이 툴 호출 대신 텍스트를 반환하면 과제가 끝났다는 신호
걸리는 지점: 좌표가 0~999 정규화 값이라 기기 해상도로 바꿔주는 브리지가 필요합니다. 전체 구현과 기기 설정 스크립트, CLI 러너는 퀵스타트 저장소에 있습니다
참고자료:
- gemini-android-computer-use-quickstart – GitHub
- Introducing Gemini 3.7 Flash – Google

답글 남기기