들어가며
METREX(KneeFresh)는 AI 카메라로 무릎 재활 운동 자세를 분석하고, 포즈 상태에 따라 음성 피드백을 실시간으로 제공하는 앱이다. "무릎을 구부리세요", "내려가세요" 같은 가이드가 운동 내내 재생된다.
앱은 처음부터 AAB(Android App Bundle)로 배포하고 있었다. 그래서 "APK 크기 문제"는 이미 해결된 줄 알았다.
그런데 영어 음성이 한벌 더 추가되면서 예상하지 못한 문제가 드러났다.
"AAB니까 괜찮지 않나?"
여기서 흔히 하는 오해가 있다.
AAB는 Google Play가 기기별 최적화된 APK를 생성하는 형식이다.
해상도, ABI, 언어에 맞춰 불필요한 리소스를 제거한다. 하지만 이 최적화는 res/ 디렉토리의 리소스에만 적용된다.
assets/ 폴더에 넣은 raw 파일은 어떤 기기에 배포하든 그대로 base APK split에 포함된다.
한국어를 쓰는 기기든 영어를 쓰는 기기든, 영어 MP3 74MB + 한국어 MP3 78MB 전부 받아야 한다.
AAB의 base split에 포함된 것들
├── 코드 (DEX)
├── 리소스 (res/) → 언어/해상도별로 분리 가능
└── assets/audio/ → 분리 불가, 통째로 포함 ← 여기가 문제
해결책: Android Asset Pack
Android는 https://developer.android.com/guide/playcore/asset-delivery 메커니즘을 제공한다.
자산을 base APK split 바깥의 별도 "Asset Pack"으로 분리해 배포할 수 있다.
배포 타입은 세 가지다:
- install-time : 앱 설치시 함께 배포
- fast-follow : 설치 직후 백그라운드 다운로드
- on-demand : 명시적 요청 시 다운로드

모듈 하나가 모든 걸 해결한다
배포 구조 변화:
Before (AAB)
└── base.apk split
├── DEX
├── res/
└── assets/audio/ ← 152MB, 모든 언어, 모든 기기에 포함
After (AAB + Asset Pack)
├── base.apk split
│ ├── DEX
│ └── res/
└── audio_asset_pack (install-time)
├── audio/ko/ ← 한국어 기기에 배포
└── audio/en/ ← 그 외 기기에 배포
마치며
AAB로 배포한다고 해서 assets/ 폴더의 대용량 파일 문제가 자동으로 해결되는 건 아니다.
리소스(res/)와 달리 assets는 base split에 언어 구분없이 통째로 들어간다.
Android Asset Pack은 정확히 이 지점을 위해 설계된 메커니즘이다.
대용량 자산을 base APK 바깥으로 꺼내, 언어·기기 조건에 맞게 최적화해 배포할 수 있다.
지금은 install-time이라 사용자 체감 변화가 크지 않을 수 있다.
하지만 만약 특정 운동 코스의 음성 파일을 선택적으로 제공하는 구조로 확장한다면, on-demand로 타입을 바꾸는 것만으로 대응이 가능하다.
모듈이 분리되어 있기 때문에.
'Computer > Android&iOS' 카테고리의 다른 글
| git-push > AI 리뷰 2탄 (0) | 2026.05.06 |
|---|---|
| git-push > AI 코드리뷰 도입기 (0) | 2026.05.06 |
| Android) strings.xml 을 Dev(Debug), Staging, Release 로 따로 설정하는 방법 (0) | 2026.04.01 |
| [Android] ADB MCP + Claude Code 로 qa 자동화 하기 (0) | 2026.02.27 |
| 안드로이드 웹뷰 로그인이 자꾸 풀린다면? (0) | 2026.01.14 |