기기별 APK를 Play가 생성하도록 업로드하는 형식. 2021년 8월부터 새 앱은 필수다.
APK 하나로 배포하면
- 모든 화면 밀도의 이미지 + 모든 ABI 의 네이티브 라이브러리 + 모든 언어
- 내 기기에 필요 없는 것이 대부분이다
AAB 를 올리면 Play 가 분할 APK 를 만들어 필요한 것만 내려보낸다
· 밀도 xxhdpi 만
· ABI arm64-v8a 만
· 언어 ko 만
→ 다운로드 크기가 흔히 30~50% 줄어든다
Play 앱 서명
- 업로드 키 — 내가 보관. AAB 에 서명해 Play 에 올린다 앱 서명 키 Play 가 보관. 실제 배포 APK 에 서명한다
업로드 키를 잃어버려도 재설정할 수 있다 앱 서명 키를 잃으면 그 앱은 영원히 업데이트할 수 없다 — 그래서 Play 가 맡는다
실무 함정
- Google 로그인 · 지도 · App Links 는 SHA-1/SHA-256 지문을 등록해야 한다
- 이때 넣어야 하는 것은 'Play 앱 서명 키' 지문이다 (업로드 키가 아니다)
- Play Console → 설정 → 앱 서명 에서 확인한다
- "내 기기에서는 되는데 배포하면 로그인이 안 된다" 의 압도적 1위 원인
로컬에서 확인하기
# bundletool 로 실제 내려갈 APK 집합을 만들어 본다
java -jar bundletool.jar build-apks --bundle=app.aab --output=app.apks \
--connected-device
java -jar bundletool.jar install-apks --apks=app.apks
Dynamic Feature — 필요할 때 내려받는다
val request = SplitInstallRequest.newBuilder().addModule("premium").build()
splitInstallManager.startInstall(request)
설치 시점에 없던 모듈을 나중에 내려받는다
- 초기 설치 크기를 줄인다
- 일부 사용자만 쓰는 무거운 기능(AR · 편집기) 에 적합
대가
- 설치 실패·오프라인 경로를 전부 다뤄야 한다
- 클래스 로딩과 리소스 접근이 까다로워진다
- 정말 큰 기능에만 쓴다
면접 함정
- ❌ "AAB를 기기에 바로 설치할 수 있다" → 설치 가능한 형식이 아니다.
bundletool로 APK를 만들어야 한다. - ❌ "AAB를 쓰면 앱 용량이 줄어든다" → 다운로드/설치 크기가 줄어든다. 코드량 자체는 그대로다.
무엇이 어떻게 쪼개지나
- base.apk — 공통 코드와 리소스
- split_config.ko.apk — 한국어 문자열
- split_config.xxhdpi.apk — xxhdpi 이미지
- split_config.arm64_v8a.apk arm64 네이티브 라이브러리
기기가 필요한 조합만 설치된다 사용자가 시스템 언어를 바꾸면 Play 가 해당 언어 split 을 추가로 내려받는다
// 언어 split 을 앱에서 요청해야 하는 경우도 있다
SplitInstallManagerFactory.create(ctx).deferredLanguageInstall(listOf(Locale("ja")))
// 테스트 중 split 이 없어 리소스가 안 나오는 문제를 잡으려면
SplitCompat.installActivity(this)
크기를 실제로 확인한다
Play Console → 앱 번들 탐색기 → 기기별 다운로드 크기
- "실제 기기가 받는 크기" 를 기기 구성별로 보여 준다
Android Studio 의 Analyze APK 는 base.apk 만 본다 — 전체 그림이 아니다
150MB 한도
압축 다운로드 크기 200MB (2021 이후 상향) 를 넘으면 업로드가 거부된다 넘는 경우
- Play Asset Delivery (게임 에셋)
- Dynamic Feature 로 분리
- 리소스·모델 파일을 서버에서 내려받는다