빌드 — Gradle·빌드 변형·R8/난독화·App Bundle
안드로이드 빌드는 코틀린 소스를 APK/AAB로 빚는 파이프라인이다 — Gradle이 조율하고, 디버그/릴리스 변형을 만들고, R8이 코드를 줄이고 난독화·최적화하며, App Bundle로 패키징한다. 빌드를 이해하면 앱 크기·실행 성능·보안·CI를 다룰 수 있다. (출처: Android — Configure your build / Shrink your code (R8).)
Gradle과 빌드 변형
Gradle이 의존성·컴파일·패키징을 관리한다(Kotlin DSL build.gradle.kts 권장). **빌드 변형(build variant)**은 빌드 타입 × 제품 플레이버의 조합이다.
android {
buildTypes {
debug { applicationIdSuffix = ".debug"; isDebuggable = true }
release {
isMinifyEnabled = true // R8 켜기
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
flavorDimensions += "env"
productFlavors {
create("dev") { dimension = "env"; buildConfigField("String","API","\"https://dev...\"") }
create("prod") { dimension = "env"; buildConfigField("String","API","\"https://api...\"") }
}
}
// → devDebug, devRelease, prodDebug, prodRelease 변형 생성
- 빌드 타입(build type) — debug(디버깅·빠른 빌드) vs release(최적화·서명).
- 제품 플레이버(product flavor) — 환경·무료/유료 등 변종(dev/prod, free/paid).
BuildConfig— 빌드 시점 상수(API URL 등)를 코드에 주입.
R8 — 줄이고·난독화하고·최적화
릴리스 빌드의 R8(옛 ProGuard 대체)이 세 가지를 한다:
- 축소(shrinking) — 도달 불가능한 코드·리소스 제거(앱 크기↓).
- 난독화(obfuscation) — 클래스·메서드 이름을 짧고 의미 없게(크기↓·역공학↑난이도).
- 최적화(optimization) — 인라인·죽은 분기 제거 등.
함정 — 리플렉션·직렬화·JNI로 이름으로 참조되는 코드는 R8이 안 쓰는 줄 알고 지우거나 이름을 바꿔 런타임 크래시가 난다. 그래서 keep 규칙(proguard-rules.pro의 -keep)으로 지키거나 이름을 보존한다. 난독화 후 크래시 로그는 *매핑 파일(mapping.txt)*로 *원래 이름으로 복원(retrace)*한다.
-keep class com.app.model.** { *; } # 직렬화 모델 보존
-keepclassmembers class * { @com.google.gson.annotations.SerializedName <fields>; }
리소스 축소·R8 with 리소스
isShrinkResources = true로 안 쓰는 리소스(이미지·레이아웃)도 제거한다(코드 축소와 함께).
App Bundle(AAB) — 기기 맞춤 배포
구글 플레이는 APK 대신 **Android App Bundle(.aab)**을 요구한다 — 전체를 올리면 플레이가 기기별(화면 밀도·ABI·언어)로 필요한 부분만 APK로 잘라 배포(Dynamic Delivery)해 다운로드 크기를 줄인다. 로컬 테스트는 bundletool로.
서명·KSP
- 서명(signing) — 릴리스 APK/AAB는 키로 서명해야 설치된다(Play App Signing에 업로드 키 위임 가능).
- KSP vs KAPT — 애너테이션 처리(Room·Hilt)는 *KSP(Kotlin Symbol Processing)*가 옛 KAPT보다 빠르다 — 신규는 KSP 권장.
정리 — 변형을 빚고, R8로 줄이고, AAB로 배포
빌드의 핵심 — Gradle이 빌드 타입×플레이버로 변형 생성(debug/release·dev/prod), 릴리스는 R8로 축소·난독화·최적화(keep 규칙으로 리플렉션 보호·mapping.txt로 retrace), 리소스도 축소, AAB로 기기 맞춤 배포·서명 필수, 애너테이션 처리는 KSP. 빌드를 알면 앱 크기·성능·보안·릴리스를 통제할 수 있다.
한 줄 요약 — Gradle 빌드 변형=빌드 타입(debug/release)×플레이버(dev/prod)+BuildConfig. 릴리스 R8: 축소(트리셰이킹)·난독화·최적화, 리플렉션/직렬화는 *
-keep*로 보호, 크래시는 mapping.txt retrace. 리소스 축소·AAB(기기 맞춤 배포)·서명·KSP(>KAPT).
(출처: Android — Configure build variants / Shrink, obfuscate, optimize (R8) / About Android App Bundles / KSP.)