
GA4의 '어제 설치 19건'은 사실 8건이었다: 테스트 기기와 Play 사전 출시·심사 기기 걸러 내기
테스트 기기와 Play 사전 출시·심사 기기는 리포트 제외 조건으로 걸렀고, 공식 문서상 setprop만으로는 GA4 보고서에서 빠지지 않습니다.
한판블록의 10월 17일 GA4 첫 실행 19건 가운데 11건은 사람이 아니었습니다. 2026년 10월 18일 오전 9시 20분에 에이전트가 쓴 아침 리포트는 이 19건을 "최근 7일 평균(약 11건)보다 많다"고 읽었고, 같은 날 오후 4시 반에 기기 모델로 나누고서야 Play 사전 출시·심사 기기와 우리가 자동 테스트를 돌리는 Galaxy S20·S21이 드러났습니다. 실제 설치는 8건, 실제 7일 평균은 약 8.4건이었고, 10월 11일 이후 한국 자연 설치는 필터 전 7건 가운데 2건만 실제였습니다. 그날 리포트 도구가 이 기기들을 기본으로 빼게 고쳤는데, 그 뒤로도 필터를 빠져나간 기기가 두 번 더 나왔습니다.
근거는 게임 저장소의 git 기록(dca02f2, 5fc744b, 53d6386 등), 리포트 스크립트와 테스트 스크립트, 10월 18일 첫날 이탈 점검 문서, 10월 15·18·23·25일 작업 세션 기록, Firebase와 GA4 공식 도움말입니다. 스크립트 수는 2026년 10월 26일 HEAD에서 다시 확인했습니다.
목차 (10)
- IN2025는 버전마다 두 대, S20은 참여 0초에 app_clear_data 13번
- 테스트 기기의 수집을 막는 장치에 빈틈이 있었습니다
- 리포트 도구는 기본으로 거르고, --include-test를 붙여야 전부 보여 줍니다
- 커밋은 "DebugView only"라고 적었고, 공식 문서는 개발자 트래픽 필터를 따로 권합니다
- 닷새 뒤에는 에뮬레이터, 일주일 뒤에는 arm64 기기가 필터를 통과했습니다
- GA4 데이터 필터만으로는 지난주 숫자를 고칠 수 없었습니다
- S20·S21·IN2025로 자연 유입한 실제 사용자도 빠집니다
- Data API 요청부터 개발자 트래픽 필터까지 여섯 단계
- 남은 일
- 자주 묻는 질문
IN2025는 버전마다 두 대, S20은 참여 0초에 app_clear_data 13번
계기는 첫날 이탈 점검이었습니다. 10월 17일에 한판블록 1.1.2, 1.1.3, 1.1.4 세 버전을 하루에 올렸고, 새 버전을 쓴 사람이 몇 명인지 보려고 버전, 국가, 유입 매체, 기기 모델을 한 표에 뽑았습니다.
| 기기 모델 | 국가 · 유입 | 새 버전 기간에 남긴 것 |
|---|---|---|
| IN2025 | (not set) · (none) | 버전마다 2명, 첫 실행 6건 |
| SM-G981N (S20) | 한국 · (none) | 버전마다 1명, 참여 0초, app_clear_data 13번 |
| SM-G991N (S21) | 한국 · (none) | 1명, 참여 0초, app_clear_data 5번 |
| SM-G986N | 한국 · 광고 | 튜토리얼 완료, 퍼즐 3개, 295초 |
| SM-S931N | 한국 · 광고 | 첫 퍼즐만 열고 나감 |
국가가 비어 있는 IN2025는 버전이 올라갈 때마다 두 대씩 들어왔습니다. Play가 올린 빌드를 사전 출시 보고서와 심사용 기기에서 돌린 흔적입니다. S20과 S21은 우리 기기이고, 앱 데이터를 지우는 app_clear_data가 반복되고 참여 시간은 0초였습니다. 사람이 쓴 기록은 아래 두 줄, 광고로 들어온 두 명뿐이었습니다(표에 넣지 않은 미국·모델 미상 2명은 심사 기기로 추정만 하고 따로 표시했습니다).
10월 11일부터 17일까지 일별로 다시 세면 이렇습니다(첫날 이탈 점검 문서).
| 날짜 | 10/11 | 10/12 | 10/13 | 10/14 | 10/15 | 10/16 | 10/17 |
|---|---|---|---|---|---|---|---|
| 실제 | 1 | 10 | 9 | 15 | 7 | 9 | 8 |
| 테스트·심사 | 6 | 1 | 0 | 1 | 0 | 0 | 11 |
Firebase가 처음 들어간 10월 11일과 세 버전을 올린 10월 17일에 테스트·심사 기기가 실제 설치보다 많았습니다.

테스트 기기의 수집을 막는 장치에 빈틈이 있었습니다
앱에는 처음부터 수집 차단이 있었습니다. 10월 11일 Firebase를 넣은 코드는 디버그 빌드와 테스트 광고 빌드에서 수집하지 않고, files/analytics_on 파일이 있을 때만 예외로 켭니다. 주석에는 "so device harnesses don't fill the reports"라고 적혀 있습니다. 그런데 S20·S21에서는 수집이 켜진 상태로 앱이 돌았고, 하네스는 실행마다 pm clear로 앱 데이터를 지웠습니다. 어떤 빌드나 경로(스토어에서 받은 업데이트, 실제 광고 ID 릴리스, analytics_on 파일)로 수집이 켜졌는지는 기록에서 하나로 정해지지 않습니다. S20에는 app_update 2건이 남아 있었고, 10월 18일 밤에 S21에서 꺼낸 릴리스 빌드는 테스트 광고 ID 빌드였습니다.
Play 사전 출시·심사 기기는 앱이 막을 방법이 없습니다. 버전을 올릴 때마다 들어오므로, 출시를 자주 할수록 이 기기의 설치도 늘어납니다. 10월 17일 하루에 세 번 올린 것이 IN2025 첫 실행 6건이 됐습니다.
10월 17일에 만든 리포트 도구는 국가와 유입 매체로만 나누었고 기기 차원이 없었습니다. 10월 15일 분석 문서의 데이터 오염 절에는 S21에서 설치 3회와 app_clear_data 10회, 에뮬레이터(sdk_gphone)에서 설치 2회가 잡혔다고 적혀 있고(이 sdk_gphone은 18일 필터에 들어가지 않았습니다), 할 일 5번이 "릴리스 빌드로 하는 기기 테스트는 analytics를 끄거나, 테스트 기기를 GA4 내부 트래픽으로 표시하는 방법을 검토한다"였습니다. "검토"로 적힌 그 항목은 사흘 동안 아무도 실행하지 않았고, 그사이 아침 리포트가 19건을 실제 설치로 읽었습니다.
리포트 도구는 기본으로 거르고, --include-test를 붙여야 전부 보여 줍니다
10월 18일 17시 6분 커밋(dca02f2)에서 리포트 도구의 모든 GA4 요청에 아래 조건을 덧붙였습니다. 국가가 비어 있으면 빼고, 우리 기기 모델은 광고(cpc) 유입이 아닐 때만 제외합니다. 광고를 보고 들어온 진짜 S20·S21 사용자는 남기려는 예외입니다.
TEST_MODELS = ["SM-G981N", "SM-G991N", "IN2025"]
NOT_TEST = {"notExpression": {"orGroup": {"expressions": [
{"filter": {"fieldName": "country", "inListFilter": {"values": ["(not set)", ""]}}},
{"andGroup": {"expressions": [
{"filter": {"fieldName": "mobileDeviceModel", "inListFilter": {"values": TEST_MODELS}}},
{"notExpression": {"filter": {"fieldName": "firstUserMedium", "stringFilter": {"value": "cpc"}}}}]}}]}}}
필터를 적용한 결과와 --include-test로 끈 결과를 10월 17일부터 나란히 돌려 비교했습니다. 국가 (not set) 비광고 6건이 사라졌고, 한국 비광고는 4건에서 1건이 됐으며, 한국 광고 유입 5건은 그대로였습니다.
커밋은 "DebugView only"라고 적었고, 공식 문서는 개발자 트래픽 필터를 따로 권합니다
같은 커밋은 하네스 7개(E2E, 보상 확인, 몽키)에 pm clear 직전 한 줄을 넣었습니다.
adb shell setprop debug.firebase.analytics.app <패키지명>
커밋 본문은 "so test runs go to DebugView only"라고 적었고, 스크립트 주석과 점검 문서, 운영자에게 한 보고도 "이제 테스트할 때 생기는 데이터가 GA4 보고서에 섞이지 않습니다"라고 했습니다. 이 사이트의 AI가 '테스트 완료'라던 게임이 튜토리얼 첫 탭에서 죽었다: VIBRATE 권한과 신규 설치 몽키 테스트 글에도 같은 문장이 들어갔다가 2026년 10월 26일에 정정됐습니다.
이 글을 쓰며 공식 문서와 맞춰 보니 그 문장은 맞지 않았습니다. Firebase DebugView 문서는 이 설정이 해제 명령(.none.)을 줄 때까지 유지된다고 하고, 이벤트는 BigQuery 일별 내보내기에 기본으로 포함된다고 적습니다. 테스트 트래픽을 보고서에서 빼려면 개발자 트래픽 데이터 필터를 걸라고 권합니다. GA4 도움말도 그 필터가 있어야 개발자가 DebugView를 쓰면서 "their activity doesn't appear in your reports"가 된다고 설명합니다. 저장소와 작업 기록에는 이 데이터 필터를 만든 흔적이 없고, GA4 속성 설정은 직접 조회하지 않았습니다. setprop을 쓴 실행의 이벤트가 이 속성의 보고서에 실제로 들어갔는지도 재 보지 않았으니, 이 판단의 근거는 공식 문서입니다.
10월 18일 보고에는 실제 S20·S21에서 이 설정이 먹는지 보지 못했다고 적혀 있습니다. 기기 설정을 바꾸는 명령이 에이전트 권한 검사에서 막혔고, 같은 날 밤 Android 7 에뮬레이터에서만 "동작했다"고 남겼습니다. 보고서에서 빠졌는지는 그때도 확인하지 않았습니다. 10월 26일 HEAD에서 pm clear를 부르는 스크립트를 세어 보니 12개였고, 그중 5개에는 setprop이 없었습니다. 4개는 10월 4일부터 있던 스크립트라 처음 7개를 고칠 때 빠졌고, 1개는 10월 22일에 새로 만든 스크립트입니다.
닷새 뒤에는 에뮬레이터, 일주일 뒤에는 arm64 기기가 필터를 통과했습니다
10월 23일 아침 점검에서 에이전트는 전날 보고한 "블록 1.1.5 사용자 1명"이 자기가 검증에 쓴 에뮬레이터였다고 정정했습니다. 에뮬레이터는 GA4에 mobileDeviceModel이 빈 값으로 찍히니, 모델 이름 목록에는 걸릴 수가 없었죠. 8시 14분 커밋(5fc744b)이 deviceModel 차원에서 x86 에뮬레이터 이름 4개를 제외했습니다. 그 실행이 애초에 왜 GA4로 갔는지는 기록에 없습니다. 커밋 본문에는 수집이 꺼져 있어야 할 디버그 빌드(1.1.5-debug)도 GA4 버전 목록에 있었다고 적혀 있습니다.
10월 25일 정오 중간 점검은 1.1.6의 첫 판(R001) 해결률을 12명 중 6명, 50%로 보고했습니다. 같은 날 16시 14분 커밋(53d6386)이 이 숫자를 고쳤습니다. 미국에서 잡힌 Play 사전 출시·심사 기기 4대(sdk_gphone64_arm64, sdk_gphone16k_arm64)가 섞여 있었고, 23일 필터는 x86 이름만 알았습니다. 필터를 sdk_gphone으로 시작하는 모델 전체로 넓히자 실사용자는 8명, 해결은 6명으로 75%가 됐습니다. 지난 광고 코호트의 77%(30명 중 23명)와 비슷한 수준입니다. 같은 점검에서 1.1.7과 1.1.8의 GA4 사용자 6명은 모두 Play 사전 출시·심사 기기였습니다.

GA4 데이터 필터만으로는 지난주 숫자를 고칠 수 없었습니다
10월 15일 문서는 수집을 끄거나 GA4 내부 트래픽으로 표시하는 방법을, 18일 보고는 디버그 기기 표시나 내부 트래픽 필터를 먼저 떠올렸습니다. GA4 도움말에 따르면 데이터 필터는 과거 데이터에 영향을 주지 않습니다(Data filters do not affect historical data). 이미 쌓인 10월 11~17일 숫자를 고치려면 어차피 리포트 쪽에서 걸러야 했습니다. 반대로 리포트 필터는 우리가 아는 모델만 빼므로, 앞으로 들어올 새 테스트 기기는 놓칩니다. 지난 데이터와 Play 사전 출시·심사 기기는 리포트 필터로, 앞으로 우리 기기에서 나올 이벤트는 debug 모드와 개발자 트래픽 필터로 막는 것이 맞다고 봅니다.
앱 빌드에서 수집을 끄는 방법은 이미 쓰고 있었지만, S20·S21에서 수집이 켜진 채 앱이 돈 경로를 막지 못했습니다.
S20·S21·IN2025로 자연 유입한 실제 사용자도 빠집니다
이 필터는 S20·S21·IN2025로 자연 유입한 실제 사용자도 함께 제외합니다. 기기 몇 대가 평균을 흔드는 것은 실제 설치가 하루 한 자릿수일 때 이야기이고, 하루 수백 건 규모라면 테스트 기기 몇 대는 묻힙니다.
Data API 요청부터 개발자 트래픽 필터까지 여섯 단계
- GA4 Data API로
first_open을 date × country × firstUserMedium × mobileDeviceModel × deviceModel × appVersion으로 뽑습니다. - 국가 (not set),
deviceModel이sdk_gphone으로 시작하거나 "Android SDK built for"인 행, 내 기기 모델의 비광고 유입,app_clear_data가 반복되고 참여 0초인 기기를 표시합니다. 새 버전을 올린 날 버전마다 같은 수로 나타나는 모델도 의심합니다. - 리포트 도구에 제외를 기본값으로 넣고, 전부 보는 플래그를 따로 만듭니다. 적용한 결과와 적용하지 않은 결과를 한 번 나란히 비교합니다.
- 하네스 가운데
pm clear를 부르는데debug.firebase.analytics.app이 없는 파일을 찾습니다:grep -l "pm.*clear" tools/* | xargs grep -L debug.firebase.analytics.app. 새 스크립트가 생길 때마다 다시 돌립니다. - GA4 관리 화면에서 개발자 트래픽 데이터 필터를 테스트 상태로 만들어 하네스 이벤트가 표시되는지 본 뒤 활성화합니다. 활성 상태에서 걸러진 데이터는 되살릴 수 없으니 테스트 상태를 건너뛰지 마십시오.
- 새 버전을 올린 뒤에는 퍼널 숫자를 읽기 전에 그 버전 사용자 목록을 기기 모델로 먼저 봅니다.
설치 수를 누구에게 보고하든, 기기 모델로 한 번 나눠 보기 전에는 실제 설치라고 쓰지 마십시오. 같은 GA4 데이터로 사람별 이벤트 순서를 복원한 분석은 퍼즐 게임 첫날 이탈 분석: 기기별 이벤트 순서와 판별 계산으로 찾은 첫 장의 벽 4판에 있습니다. 그 글의 따라 하는 순서에 나오는 테스트 기기 모델 목록에는 위 2번의 sdk_gphone 접두어와 국가 (not set) 조건을 함께 넣으십시오.
남은 일
개발자 트래픽 필터를 테스트 상태로 걸어 S20에서 하네스를 한 번 돌리고, 그 이벤트가 필터 대상으로 표시되는지 보는 것이 다음 확인입니다. setprop이 빠진 스크립트 5개에도 같은 줄을 넣어야 합니다. 10월 22일 에뮬레이터 실행에서 수집이 일어난 이유는 그다음에 찾습니다.
자주 묻는 질문
GA4에서 Play 사전 출시 보고서 기기는 어떻게 알아보나요?
우리 데이터에서는 국가가 (not set)이고 유입 매체가 (none)이며, 새 버전을 올릴 때마다 같은 모델이 두 대씩 나타났습니다(IN2025). deviceModel이 sdk_gphone64_arm64, sdk_gphone16k_arm64처럼 sdk_gphone으로 시작하는 기기도 미국으로 잡혔습니다.
adb setprop debug.firebase.analytics.app을 켜면 GA4 보고서에서 빠지나요?
공식 문서 기준으로는 빠지지 않습니다. Firebase 문서는 보고서와 BigQuery 내보내기에서 테스트 트래픽을 빼려면 GA4 속성에 개발자 트래픽 데이터 필터를 걸라고 권합니다. 설정은 .none.으로 해제할 때까지 유지됩니다.
GA4 데이터 필터를 켜면 지난 데이터도 정리되나요?
아니요. 데이터 필터는 적용한 뒤에 들어오는 데이터에만 적용됩니다. 이미 쌓인 기간은 Data API 요청에 기기·국가 조건을 붙여 리포트 쪽에서 걸러야 합니다.
이 글은 SugarMount가 직접 측정한 값으로 쓰고, 초안 작성에 AI 코딩 에이전트를 썼습니다.
다른 AX 노트
- '한 달째 일시적인 오류'라는 리뷰: 상품을 기다리지 않던 구독 상세 화면, 16명 중 1명만 결제를 시작했다
- 20% 단계적 출시가 100%로 나갔다: Play Publisher API의 completed는 단계 출시로 되돌릴 수 없다
- Android assets를 미리 gzip한 실측: APK 이득은 0, .pack.gz는 .pack이 되어 FileNotFoundException
- SKT 판매 삼성 폰에서 market://을 열면 스토어 선택 창이 뜬다: Play 패키지부터 지정하기
- addOnCompleteListener(this)가 onStop에서 지운 리스너 때문에 스플래시에 멈춘 버그
- 화살표 퍼즐 1,100판을 만든 역구성 생성기와 G2 게이트