운영 기록
안드로이드 앱 24개와 웹 서비스 6개를 만들고 운영하면서 직접 잰 숫자와 부딪힌 문제를 정리합니다. 남의 글을 옮기지 않고, 실제 콘솔 수치·실기기 결과·구글 지원팀 답변처럼 제가 확인한 것만 씁니다.
로또 용지 QR 인식 성공이 0건이었던 이유: 기록하지 않은 경로는 실패처럼 보인다
로또 앱 주간 보고에서 QR 화면을 연 사람은 19명인데 인식 성공은 0건이었습니다. 스캐너가 고장 난 게 아니라, 진짜 용지 QR 이 지나가는 경로에 기록이 하나도 없었습니다. 측정 구멍을 찾은 과정, 같은 기능 앱 4개와 비교한 결과, 스캔 엔진을 번들로 바꾼 이유, 고친 뒤 1주일 숫자를 정리합니다.
2026-10-22 · Android · GA4 · ML Kit지도 왼쪽 아래 로고를 누르면 앱이 꺼졌다: 네이버 지도 SDK 와 AppCompat 테마
로또 판매점 지도 앱의 Crashlytics 에 「You need to use a Theme.AppCompat theme」 크래시가 4건 올라왔습니다. 사용자가 아니라 Play 사전 출시 보고서의 테스트 로봇이 지도 왼쪽 아래 NAVER 로고를 누른 것이었습니다. 원인, 앱 전체 테마를 바꾸지 않고 지도만 감싼 수정, 다크 모드에서 생긴 두 번째 문제를 정리합니다.
2026-10-19 · Android · 네이버 지도 SDK · Jetpack Compose광고 SDK 초기화가 끝나기 전에 광고를 요청하면 꺼진다: 막는 장치를 만들고도 세 번 다시 나온 이유
운영 중인 앱에서 「MobileAds.initialize must be called」 크래시를 처음 고친 뒤에도 같은 크래시가 다른 모양으로 세 번 더 나왔습니다. 초기화 완료를 기다리는 장치는 있었지만, 시작 시점에 켜지는 값, 동의만 보고 켜지는 값, 그 장치를 거치지 않는 새 광고 자리가 빈틈이었습니다. 각 경우의 원인과 23개 앱 전수 점검 결과를 정리합니다.
2026-10-15 · Android · AdMob · Google Mobile Ads SDK이미지 줄여 읽기 한 줄이 만든 크래시: inSampleSize 는 0 에서 시작한다
메모리를 아끼려고 QR 스캐너 앱 문서함의 썸네일을 줄여 읽게 바꿨더니, 다음 버전에서 문서 목록을 열 때마다 앱이 꺼졌습니다. 원인은 BitmapFactory.Options 의 inSampleSize 기본값이 0 이라는 것이었습니다. 바꾼 코드, 크래시 기록, 고친 코드, 같은 실수를 다른 곳에서 찾은 방법을 정리합니다.
2026-10-13 · Android · BitmapFactory · CrashlyticsCrashlytics 에 안 잡힌 크래시: 넣은 버전부터만 보인다
앱 21개에 Firebase Crashlytics 를 넣고 사흘 뒤, 사용자가 겪은 크래시를 Play Console 에서 먼저 발견했습니다. Crashlytics 는 SDK 를 넣은 빌드부터만 보고하고, 사용자 폰에 남아 있는 옛 버전의 크래시는 Play vitals 에만 쌓입니다. 21앱 전수 결과와 지금 쓰는 확인 순서를 정리합니다.
2026-10-08 · Android · Crashlytics · Play Console동기화가 판매점 8,802곳을 지운 날: 공공데이터 필드 이름 하나와 100건짜리 목록
로또 판매점 지도 앱에서 동기화 뒤 판매점 이름이 전부 「알수없음」으로 바뀌고, 앱에 넣어 둔 판매점 8,802곳이 사라졌습니다. 공공데이터 응답의 필드 이름 변경, 첫 100건만 받은 목록으로 삭제하던 동기화, 지오코더의 없는 키까지 원인 세 가지와 고친 방법을 정리합니다.
2026-10-07 · Android · Room · 공공데이터TV 페어링 코드 창에서 사용자가 떠난 이유: 6자리 코드와 한글 자판
TV 리모컨 앱의 페어링 오류를 고친 뒤 오히려 「코드 입력 창에서 취소」가 9% 에서 19% 로 늘었습니다. GA4 실패 사유를 열어 보고, 코드 입력칸 하나가 한글 자판으로 열리던 것을 찾은 과정과 고친 방법을 정리합니다.
2026-10-06 · Android · EditText · 키보드dispatchDetachedFromWindow NullPointerException: 스택에 내 코드가 없는 안드로이드 크래시 추적기
스택 트레이스에 프레임워크 코드만 찍히는 NullPointerException 을 MdViewer 에서 만났습니다. onDetachedFromWindow 안에서 형제 뷰를 뗀 한 줄이 원인이었고, 부모 ViewGroup 이 자식 배열을 도는 방식 때문에 생긴 문제였습니다. 재현, 원인, 고친 방법을 정리합니다.
2026-10-01 · Android · 크래시 · View안드로이드에서 .md 파일 여는 법: AI 가 준 마크다운이 기호 범벅으로 보일 때
ChatGPT·Claude·Codex 가 만들어 준 .md 파일, 옵시디언 노트, 깃허브 README 를 폰에서 열면 #·*·| 가 그대로 보입니다. 마크다운을 폰에서 제대로 읽는 방법과, 표·체크리스트·수식이 깨지는 이유, 직접 뷰어를 만들며 확인한 점을 씁니다.
2026-09-29 · Android · 마크다운 · 생산성R8 을 켜고 빌드는 통과했는데 앱이 깨졌다: 15개 앱에서 실제로 걸린 런타임 함정 5가지
Play 의 2027년 코드 최적화 요건에 맞춰 앱 15개에 R8 을 켰습니다. 빌드는 전부 통과했지만 7개 중 2개가 실행 중에 깨졌습니다. Gson 역직렬화, getIdentifier 리소스 조회, Room _Impl, 디버그 빌드의 무효화 등 크래시 로그에 안 잡히는 유형을 정리합니다.
2026-09-16 · Android · R8 · Google Play판매자 계정 하나 켰다가 앱 21개 출시가 전부 막혔다: 한국 개인 개발자와 Play Console 「추가 정보 필요」
후원용 인앱 상품을 테스트하려고 판매자 계정을 만든 직후, Play Console 이 사업자 등록 번호·통신판매업 신고번호를 요구하며 전 앱의 출시를 막았습니다. 상품을 지워도, 지급 계좌를 지워도 풀리지 않았고 지원팀의 최종 답은 "되돌릴 수 없다" 였습니다. 개인 개발자가 이 함정을 피하는 방법을 씁니다.
2026-09-16 · Google Play · Play Console · 정책데이터 보안 양식, 선언 0 인 앱이 적발되기 시작했다: 앱 21개 전수 감사와 CSV·API 로 고치는 법
사용자가 손으로 입력한 남의 전화번호도 구글 기준 "전화번호 수집" 이었습니다. 거부를 한 번 받고 앱 21개의 데이터 보안 선언을 소스와 대조하니 11개가 어긋나 있었고, 그중 3개는 선언이 아예 0 이었습니다. 광고만 쓰는 앱도 선언 0 이면 안 되는 이유와, 5단계 마법사 대신 CSV 와 API 로 고치는 방법을 씁니다.
2026-09-16 · Google Play · 데이터 보안 · 정책Play 검색 1위 앱의 제목은 검색어 문자열 그대로다: 가운뎃점 하나가 검색 매칭을 통째로 죽인 이야기
한국 Play 검색 결과 157개 검색어를 실측해 보니, 1위 앱은 예외 없이 제목에 그 검색어를 띄어쓰기까지 그대로 넣고 있었습니다. 우리 앱은 예쁘게 쓰려고 넣은 가운뎃점(·) 때문에 QR 검색어에 한 번도 안 걸리고 있었습니다. 13개 앱 제목을 바꾼 근거를 씁니다.
2026-09-16 · ASO · Google Play · 스토어 최적화301 은 되돌릴 수 없다: 서브도메인 이전 43분의 실수가 5일 뒤 404 로 돌아온 이야기, 그리고 Cloudflare 엣지 캐시
웹 서비스 두 개를 서브도메인으로 옮기던 날, 잘못된 301 이 43분간 나갔습니다. 서버는 바로 고쳤지만 브라우저는 5일 뒤에도 그 301 을 따라가 404 에 떨어졌습니다. permanent 리다이렉트를 내보내기 전에 해야 할 일, 이미 나간 301 을 구제하는 유일한 방법, 그리고 배포했는데 화면이 안 바뀌는 Cloudflare 엣지 캐시 사고를 씁니다.
2026-09-16 · 웹 · 배포 · HTTP한 페이지에 한 언어: IP 국가 판정과 한/영 병기를 버리고 브라우저 언어 + hreflang 으로 바꾼 이유
웹 서비스 6개의 초기 언어를 정하는 방식이 제각각이었습니다. IP 국가로 정하던 곳은 구글봇에게만 영어가 나가 검색 결과 언어를 통제할 수 없었고, 한/영을 한 페이지에 병기하던 랜딩은 구글이 기대하는 "페이지 하나에 언어 하나" 와 어긋났습니다. 전 웹을 한 규칙으로 통일한 과정을 씁니다.
2026-09-16 · 웹 · SEO · 다국어같은 앱, 같은 사용자인데 네이티브 광고가 배너보다 1,000회당 38배: 형식별 단가 실측과 삭제 직전에 멈춘 이유
TV 리모컨 앱 두 개의 7일 AdMob 데이터로 배너와 네이티브 고급형의 1,000회 노출당 수익을 비교했습니다. 과다 노출이 단가를 어떻게 죽이는지, 네이티브의 낮은 채움률은 어떻게 볼지, 그리고 배너 광고 단위를 지우려다 멈춘 이유를 씁니다.
2026-09-16 · AdMob · 광고 수익 · 네이티브 광고앱 안에서 언어를 바꿨는데 가끔 안 바뀌는 이유: setApplicationLocales 는 떠 있는 액티비티만 다시 만든다
"한국어에서 English 로 바꿔도 그대로다, 껐다 켜야 바뀐다" 는 제보의 원인은 AppCompat 이 그 순간 화면에 떠 있는 액티비티만 재생성하기 때문이었습니다. 뒤에 멈춰 있던 화면은 옛 언어로 돌아옵니다. 앱 8개에 적용한 해결책과, 같이 걸린 함정 5가지를 씁니다.
2026-09-16 · Android · 다국어 · AppCompat홈 위젯 13개를 삼성 위젯 옆에 놓고 다시 고친 기준 7가지
앱 5개의 홈 위젯 13개를 실기기 홈 화면에 삼성 날씨·페이 위젯과 나란히 놓고 보니 "코드가 있다" 와 "상용 앱처럼 보인다" 는 전혀 달랐습니다. 시스템 다크 모드 추종, 빈 상태 디자인, previewLayout 과 label, dp 모서리, 비트맵 위젯의 테마 지연까지 고친 기준을 씁니다.
2026-09-16 · Android · 홈 위젯 · UI앱 17개에 강제 인앱 업데이트(IMMEDIATE)를 넣은 이유: 광고 SDK 교체 때 옛 버전 수익이 0 이었다
2026년 7월 광고 SDK 를 갈아탔을 때, 업데이트를 안 받은 사용자에게서는 수익이 0 이었습니다. 정책 수정도 광고 수정도 옛 버전에는 닿지 않습니다. Play In-App Update 를 IMMEDIATE 로 전 앱에 넣은 방법, 검증이 Play 설치본에서만 되는 이유, 그리고 함께 처리한 것들을 씁니다.
2026-09-16 · Android · Google Play · 인앱 업데이트스토어 키워드는 내가 고르지 않는다: 경쟁 앱 제목 채굴 → 자동완성 검증 → 순위 실측 3단계
제가 씨앗 단어를 고르면 결국 "내 기준의 ASO" 가 됩니다. 같은 검색 결과에 뜨는 경쟁 앱 제목에서 단어를 긁고, Play 자동완성에 넣어 실제 검색어만 남기고, 그 검색어에서 우리 앱이 몇 위인지 재는 순서로 바꿨습니다. 한 글자 접두로 훑다가 핵심 검색어를 전부 놓친 실수도 같이 씁니다.
2026-09-16 · ASO · Google Play · 스토어 최적화AdMob 계정에 GDPR 동의 메시지가 하나도 없었다: 앱 21개에 UMP 를 하루에 넣은 기록
새 앱 릴리즈 로그에 "no form(s) configured" 가 찍혀서 확인해 보니, AdMob 계정에 유럽 규정 동의 메시지가 0개였고 UMP 코드가 들어간 앱은 17개 중 3개뿐이었습니다. 메시지를 만들고 14개 앱에 코드를 넣어 재출시하기까지의 순서와 함정을 씁니다.
2026-09-16 · AdMob · GDPR · UMP광고 수익은 다운로드가 아니라 체류 시간이 정한다: 앱 15개 AdMob 실측
월 활성 사용자가 더 많은 앱 11개보다 TV 리모컨 앱 4개가 광고 노출을 27배 만들었습니다. 사용자당 하루 노출 7.68회와 0.18회의 차이가 어디서 오는지, 그래서 마케팅 순서를 어떻게 바꿨는지 씁니다.
2026-09-16 · AdMob · 광고 수익 · 앱 운영