
SKT 판매 삼성 폰에서 market://을 열면 스토어 선택 창이 뜬다: Play 패키지부터 지정하기
SKT 판매 삼성 폰 두 대(S21·S20)에서는 market:// 링크를 스토어 앱 3개가 받았습니다. Play 패키지를 먼저 지정하면 선택 창이 사라집니다.
Galaxy S21에서 서랍의 스토어 링크를 열자 Play 상세 대신 원스토어, 갤럭시 스토어, Play 가운데 하나를 고르라는 창이 나왔습니다. 2026년 10월 9일, 한글 띄어쓰기 앱 서랍에 형제 게임 메뉴를 넣은 efc0acf를 S21 실기기에서 눌러 보던 중이었고, 단위 테스트 300개는 이미 모두 통과한 상태였습니다. 59분 뒤 8bbe179에서 Play 패키지를 먼저 지정하는 순서로 고쳤습니다.
근거: 한글 띄어쓰기 앱 저장소의 git 기록(f6ef50e, efc0acf, 8bbe179, b6cda27), CHANGELOG 1.6.026, 관측 기록(WATCH.md 10-23), 2026-10-30에 Galaxy S21·S20에 adb로 다시 질의한 결과입니다.
목차 (9)
market:// 링크 하나를 스토어 앱 3개가 받습니다
10월 30일에 SKT 판매 모델 두 대에서 market://details?id=…를 받는 앱을 물어봤습니다. Galaxy S21(Android 15)도 Galaxy S20(Android 13)도 답은 Play, 갤럭시 스토어, 원스토어 3개였고, 셋 모두 받을 앱을 지정하지 않은 Intent를 받겠다고(isDefault=true, CATEGORY_DEFAULT 선언) 나왔습니다. 이런 Intent에 후보가 2개 이상이고 기본 앱이 정해져 있지 않으면 Android는 고르는 창을 보여 줍니다.

서랍이 보내는 한판블록, 화살표 매듭풀기, 생생카드는 Play에만 있습니다. 게임 링크에는 utm_source=sugarspeller&utm_medium=crosspromo&utm_campaign=drawer referrer를 붙였는데, 이 값도 Play만 읽어 Play Console 획득 보고서에 넣습니다. 사용자가 다른 스토어를 고르면 앱이 없는 화면을 보고, 설치하더라도 교차 홍보에서 온 설치로 세어지지 않습니다.
실패를 'Play 없음'으로 읽은 코드
처음 코드는 market://을 열고, ActivityNotFoundException이 나면 https 주소로 넘어갔습니다. 그 분기에 붙은 주석은 "Play 스토어 앱이 없는 기기"였습니다. market://을 여는 앱은 Play뿐이라는 가정입니다. 이 코드는 9월 20일 f6ef50e의 생생카드 메뉴에 처음 들어갔고, 10월 9일 efc0acf가 게임과 생생카드가 함께 쓰는 런처로 그대로 옮겼습니다. 두 커밋 모두 Claude가 공동 작성했습니다.
SKT 판매 삼성 폰에서는 이 가정 때문에 대체 경로가 한 번도 돌지 않습니다. 후보가 3개라 예외가 나지 않고 선택 창이 뜨니, 코드는 스토어를 열었다고 판단하고 끝납니다. 생생카드 메뉴도 9월 20일 코드부터 같은 문제를 안고 있었다는 것을 이때 함께 알았습니다.
단위 테스트 300개와 리뷰 2회가 지나친 이유
efc0acf의 스토어 테스트는 시작된 Intent의 주소(data)만 비교했고, 어느 앱이 받을지(package)는 보지 않았습니다. Robolectric 환경에는 다른 스토어 앱이 없고, 기본 설정에서는 startActivity가 실패하지도 않습니다. 같은 작업에서 분석 에이전트 3개와 적대적 리뷰 2회가 테스트 구멍 3곳(<queries> 누락, Android 6.0 숨김, Classic 서랍 배선)을 찾아 막았지만, market:// 가정은 아무도 지적하지 않았습니다.
이 문제는 S21 실기기에서 메뉴를 직접 눌러 보다가 나왔습니다. 저장소 작업 지침은 런타임 확인을 릴리스 APK로 하라고 적어 두었고, 수정 뒤 확인도 릴리스 APK로 했습니다(절차는 릴리스 게이트 글에 정리했습니다).
Play 지정, 일반 market, https 순서로 시도
8bbe179는 후보 세 개를 목록으로 두고 차례로 엽니다. 예외가 나면 다음 후보로 넘어가고, 하나라도 열리면 거기서 끝납니다.
val attempts = listOf(
view("market://details?$query").setPackage(PLAY_STORE),
view("market://details?$query"), // Play가 없으면 다른 스토어라도
view("https://play.google.com/store/apps/details?$query"), // 스토어 앱이 없으면 브라우저
)
Play 패키지를 지정한 Intent는 Play가 없는 기기에서 예외를 내므로, 처음 코드에는 없던 실패 신호가 생깁니다. 테스트는 기존 테스트에 "시작된 Intent의 package가 Play인가" 단언을 더했고, Play 없이 다른 스토어만 있는 환경(checkActivities(true))에서 일반 market:// 주소가 package 없이 열리는지 보는 테스트를 새로 넣었습니다. 단위 테스트는 301/301이 됐습니다. 첫 후보의 setPackage를 지우면 package가 비어 이 단언이 실패합니다(같은 방식은 가드 지워 보기에 썼습니다).

같은 날 S21의 릴리스 APK에서 설치된 화살표 매듭풀기는 게임 앱이 바로 열렸고, 설치되지 않은 한판블록은 선택 창 없이 Play 상세로, 생생카드도 Play로 갔습니다. GA4 로그에도 game_open{game=arrows,installed=1}, {game=blocks,installed=0}, sugarcard_open{installed=0}이 찍혔습니다. 이 수정은 1.6.026 배포 브랜치에 함께 들어갔고, 그 버전이 같은 날 오전 Play에 게시돼 게임 메뉴는 처음 나갈 때부터 Play를 지정했습니다.
선택 창을 두는 안과 https를 먼저 여는 안
선택 창을 그대로 두는 안은 앱이 Play에만 있다는 이유 하나로 버렸습니다. Play만 지정하고 뒤를 비우는 안은 Play가 없는 기기에서 아무것도 열지 못해서, 일반 market과 https를 뒤에 남겼습니다.
10월 30일 S21에서 Play 상세 https 주소는 Play와 Chrome 두 앱이 받았고, play.google.com은 Play에 시스템 설정으로 검증된 링크라 https를 먼저 열어도 Play가 열렸을 가능성이 높습니다(실제로 눌러 보지는 않았습니다). 그래도 브라우저는 거의 언제나 https를 받으니 예외가 나지 않고, 어느 앱이 열릴지가 기기 설정에 달립니다. 실패하면 다음 후보로 가는 구조와 맞지 않아 https는 마지막에 두었습니다.
다른 스토어에도 올린 앱이면 Play를 고정하지 않습니다
국내 사용자에게 Play에만 있는 앱을 보낼 때는 market:// Intent에 Play 패키지를 지정하십시오. 원스토어나 갤럭시 스토어에도 올린 앱이라면 이 고정이 그 스토어 사용자를 Play로 끌고 가므로 쓰지 않습니다. Play가 없는 기기에서는 두 번째 후보가 다른 스토어를 열고, 그 스토어에는 앱이 없습니다. 이 경로는 Robolectric 테스트로만 확인했고, 그런 실기기는 없습니다. 확인한 폰도 SKT 판매 삼성 두 대뿐이라 KT·LG U+ 모델, 자급제 모델, 다른 제조사 폰은 재 보지 않았습니다.
adb 질의 두 번과 package 단언 하나
- 폰을 연결하고
adb shell cmd package query-activities --brief -a android.intent.action.VIEW -d "market://details?id=com.example.app"를 실행합니다. 첫 줄의 "N activities found"가 2 이상이면 선택 창이 뜰 수 있는 폰이고, 후보마다 isDefault 값도 함께 나옵니다. - 같은 명령 끝에 Play 스토어 앱의 패키지
-p com.android.vending를 붙여 다시 실행합니다. 1개가 나와야 합니다. - 스토어 링크 코드를 Play 지정, 일반 market, https 순서로 바꾸고, 각 단계에서
ActivityNotFoundException만 받아 다음 후보로 넘어가게 합니다. - 단위 테스트에 시작된 Intent의
package단언을 넣고, setPackage를 지웠을 때 실패하는지 한 번 봅니다. - 릴리스 APK를 국내 판매 실기기에 올려 링크를 직접 누릅니다.
남은 일: UTM 설치 수와 서랍 E2E 16건
10월 9일부터 22일까지 게임 줄은 33번 눌렸습니다(한판블록 5, 화살표 매듭풀기 16, 게임 값이 없는 1.6.026 기록 12, GA4). 그 탭이 설치로 이어졌는지는 Play Console 획득 보고서에만 있어 아직 판정하지 않았습니다. S21에서 서랍을 여는 E2E 테스트 16건은 변경 전 기준선(360bed3) 빌드에서도 똑같이 실패해서, 게임 줄 E2E는 기기에서 돌리지 못하고 손으로 눌러 확인했습니다. 그 실패 원인부터 찾을 차례입니다.
자주 묻는 질문
갤럭시에서 Play 스토어 링크를 누르면 왜 스토어를 고르라고 하나요?
폰에 market:// 주소를 받는 스토어 앱이 여러 개 있기 때문입니다. 2026-10-30 기준 SKT 판매 Galaxy S21·S20에서는 Play, 갤럭시 스토어, 원스토어 3개가 받았고, 링크가 받을 앱을 정하지 않으면 Android가 고르는 창을 보여 줍니다.
앱에서 Play 스토어 상세를 바로 열려면 어떻게 하나요?
market://details Intent에 setPackage로 Play 스토어 앱을 지정합니다. Play가 없는 기기에서는 이 Intent가 ActivityNotFoundException을 내므로, 일반 market://과 https 주소를 차례로 대체 후보로 놓습니다.
이 글은 SugarMount가 직접 측정한 값으로 쓰고, 초안 작성에 AI 코딩 에이전트를 썼습니다.
다른 AX 노트
- Android assets를 미리 gzip한 실측: APK 이득은 0, .pack.gz는 .pack이 되어 FileNotFoundException
- addOnCompleteListener(this)가 onStop에서 지운 리스너 때문에 스플래시에 멈춘 버그
- "6.7" < "6.11"이 거짓이라 콘텐츠 갱신이 멈췄다: 6.2~6.9 기기만 막힌 Remote Config 버전 비교
- R8이 지우지 못한 테스트 광고 ID 5개: listOf().any 한 줄과 dex 건수 검사
- 화살표 퍼즐 1,100판을 만든 역구성 생성기와 G2 게이트
- 대개편 직후 DAU는 올랐고, 자연 유입 코호트 D1은 15.2%에서 11.2%로 내려갔다