빌드 변형과 Product Flavors
빌드 변형과 Product Flavors
안드로이드 빌드 시스템은 빌드 변형(build variant)과 Product Flavor를 활용하여 하나의 코드베이스에서 여러 버전의 애플리케이션을 생성할 수 있도록 설계되어 있습니다. 빌드 타입(build type)은 애플리케이션의 컴파일 및 패키징 방식을 제어하며, Product Flavor는 서로 다른 기능, 리소스, 식별자를 가진 애플리케이션 버전을 정의합니다. Gradle 플러그인은 이러한 차원(dimension)들을 조합하여 빌드 변형의 매트릭스를 생성하고, 각 변형마다 별도의 APK 또는 번들을 만들어 냅니다. 실무에서 하나의 앱을 무료/유료 버전으로 나누거나, 지역별로 다른 설정을 적용해야 할 때 이 구조를 활용하게 되므로 면접에서도 자주 출제되는 주제입니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
- 빌드 타입과 Product Flavor가 결합되어 빌드 변형을 구성하는 원리
- Product Flavor에 고유한
applicationId와 리소스를 설정하는 방법 - Flavor Dimension이 다축(multi-axis) 변형 매트릭스를 생성하는 과정
- 소스 셋(source set) 디렉토리를 활용하여 Flavor별 코드와 리소스를 제공하는 방법
- Gradle의 변형 인식 의존성 해석(variant-aware dependency resolution) 동작 원리
빌드 타입 (Build Types)
모든 안드로이드 프로젝트에는 기본적으로 debug와 release 두 가지 빌드 타입이 포함됩니다. 빌드 타입은 애플리케이션의 정체성이나 기능이 아니라, 빌드 프로세스 자체에 적용되는 컴파일 및 패키징 설정을 정의합니다.
android {
buildTypes {
debug {
isDebuggable = true
applicationIdSuffix = ".debug"
}
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile(
"proguard-android-optimize.txt"
),
"proguard-rules.pro"
)
}
}
}
debug 빌드 타입은 디버깅 도구를 활성화하고, applicationId에 접미사를 추가하여 디버그 버전과 릴리스 버전이 하나의 기기에 동시에 설치될 수 있도록 구성됩니다. 또한 빠른 빌드를 위해 코드 축소(code shrinking)를 건너뜁니다. 반면 release 빌드 타입은 R8 난독화(minification)와 리소스 축소(resource shrinking)를 활성화하여 APK 크기를 줄이며, 배포를 위해 릴리스 키로 서명하는 것이 특징입니다.
이 두 가지 외에도 staging과 같은 커스텀 빌드 타입을 추가할 수 있습니다. 프로덕션 수준의 최적화를 적용하면서도 디버그 로깅을 유지해야 하는 중간 환경이 필요한 경우에 유용합니다. 실무에서는 QA 팀이 별도의 staging 빌드를 통해 프로덕션과 유사한 환경에서 테스트를 진행하는 경우가 많으므로, 이러한 구성 방법을 알아 두시면 좋습니다.
Product Flavors와 Flavor Dimensions
Product Flavor는 기능, 브랜딩 또는 설정이 서로 다른 애플리케이션 변형을 정의합니다. 각 Flavor는 하나의 Flavor Dimension에 속하며, 빌드 시스템은 모든 Dimension에 걸친 Flavor 조합과 빌드 타입을 곱하여 변형을 생성합니다.