안드로이드 프레임워크·시스템 학습 노트 목차

빌드 — 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.)

권한·보안 — 런타임 권한·저장소·암호화·네트워크메모리·ANR·성능 — 누수·프리징·렉