Android Flavor는 Android 프로젝트를 빌드할 때 사용되는 Gradle 빌드 시스템의 개념으로 Flavor는 앱의 특정 버전이나 변형, 환경 또는 용도에 따라 설정되는 빌드 구성요소 입니다.
일반적으로 Flavor는 빌드 프로세스에서 앱에 대한 다양한 설정을 지정하는 데 사용됩니다. 예를 들어, 앱의 기능이나 UI의 색상, 문자열, 이미지, 아이콘 등을 설정할 수 있습니다. Flavor는 또한 다른 환경에서 앱을 실행할 수 있도록 구성을 변경하거나 로컬 빌드에서만 사용되는 디버그 모드를 지정할 수도 있습니다.
Flavor를 사용하면 하나의 소스 코드 베이스에서 다양한 앱 버전을 만들 수 있으며, 이는 개발자들이 앱을 더욱 쉽게 관리하고 다양한 배포 요구 사항에 대응할 수 있도록 도와줍니다.
Project내 App수준의 Gradle을 다음과 같이 구성합니다.
android {
...
flavorDimensions "api"
productFlavors {
prod {
dimension "api"
versionCode 1
versionName "1.0"
applicationIdSuffix ".prod"
versionNameSuffix "-prod"
}
dev {
dimension "api"
versionCode 1
versionName "1.0"
applicationIdSuffix ".dev"
versionNameSuffix "-dev"
}
}
}
운영서버와 개발서버 타입을 나누어 Flavor를 구성하고자 한다면 다음과 같이 구성할 수 있습니다.
flavorDimensions는 특별한 기능으로서 필드가 아닌 구분자로서의 용도로 이해하면 됩니다.
applicationIdSuffix는 실제 앱을 빌드할때 패키지명에 추가됩니다.
만약 기존 앱 패키지명이 com.aa.bb 였다면 prod를 타겟하여 빌드하면 com.aa.bb.prod로 빌드가 되며 반대로 dev를 타겟하여 빌드하면 con.aa.bb.dev라는 패키지명으로 빌드됩니다.
versionNameSuffix는 applicationIdSuffix과 마찬가지로 VersionName에 추가됩니다.
App수준의 Gradle를 구성하고 Gradle Sync를 한다음 안드로이드 스튜디오 좌측 하단의 'Build Variants' 탭을 열어보면 다음과 같이 실제로 Flavor가 나눠진것을 확인할 수 있습니다.

기본적으로 flavor를 나누었으니 실제 코드가 어떻게 나누는지 해봅시다.
실제 프로젝트의 경로로 이동하여 project/app/src 경로로 이동하여 방금 만들었던 flavor 이름으로 폴더를 생성합니다. 저는 'prod'와 'dev' flavor를 생성했으니 동일하게 2개의 폴더를 생성했습니다.

그 다음과 같이 내부 경로로 폴더를 구성하고 이제 Flavor별로 달리 할 클래스를 생성합니다. 저 같은 경우는 'Flavor'라는 빈 클래스를 생성했습니다.
prod/java/com/Flavor.kt
dev/java/com/Flavor.kt
안드로이드 스튜디오에서 확인해보면 com (dev)라는 패키지 밑으로 'Flavor'클래스가 생성된것을 확인할 수 있습니다.
현재 Build Variants가 dev로 타겟이 되어 있어 dev 패키지만 표시가 되고 반대로 prod을 타겟하면 반대로 prod 패키지만 보이게 됩니다.


이제 코드에서 Flavor 클래스를 임포트할때 각 Flavor별로 다른 Flavor 클래스를 가져올 수 있습니다.