BuildConfig 와 ProductFlavors 정리 # BuildConfigField vs ResValue
오늘은 BuildConfig와 ProductFlavor에 대해 정리하겠습니다.
BuildConfig는,
빌드별로 다른 상수값을 사용하기 위한 클래스로,
BuildConfigField와 ResValue함수를 제공해 주고요.
productFlavors는,
기본 기능은 같지만,
약간 다른 타입의 앱번들(cbt, real 버전등)을 생성해,
릴리즈 할 때 유용합니다.
둘 다, 빌드설정과 관련하여 종종 사용하는 기능들인데요.
먼저 BuildConfig부터 알아보겠습니다.
1. BuildConfig
1-1. BuildConfigField와 resValue
BuildConfig클래스의,
BuildConfigField와 resValue는,
빌드별로 다른 값을 가지도록 할 때 사용합니다.
안드로이드의 빌드 시스템인 Gradle은,
빌드를 할 때, 현재 빌드 정보를 알기 위해서, BuildConfig클래스를 생성하는데,
BuildConfigField와 resValue는,
값이 추가되는 위치나 방법이 다르므로,
아래를 참고하여 용도에 맞게 활용하면 됩니다.
BuildConfigField | resValue | |
값 추가 시점 |
빌드 시점에, BuildConfig.java에 상수로 추가됨 |
빌드 시점에, 리소스로 컴파일되어, R 클래스에 정의됨 |
코드에서 접근방법 |
코드에서 'BuildConfig.필드명'으로, 직접 접근 |
레이아웃, 문자열, 컬러 등의 다른 리소스처럼, getString(R.string.필드명) 의 형태로 접근 |
용도 | - API 키, - 빌드 별로 달라지는 상수 값에 사용 |
UI에서 사용되는 문자열, 색상 값 등을, 빌드 시점에 정의하고 싶을 때 활용 |
1-2. BuildConfigField
app레벨의 build.gradle의 'buildTypes { }'에서,
BuildConfig클래스의 buildConfigField()메소드를 이용하면,
인자에 원하는 값을 넣을 수 있습니다.
아래 코드에서는,
debug빌드에서 IS_FOR_TEST 값을 true로 나오게 하고,
release빌드에서는 false로 설정하였습니다.
아래에서 보이는 것처럼,
buildConfigField메소드는,
인자로 type과 name 그리고 value값을 적어주면 됩니다.
첫 번째 인자로 들어가는 type에는 String, boolean, int, long, float 그리고 double을 사용할 수 있습니다.
이 코드를 작성할 때,
컴파일러가 철자오류를 찾아주는 것이 아니므로,
String으로 모든 타입과 값을 써야 하므로 주의를 기울여,
타입과 값을 적어주어야 합니다.
1-3. BuildConfigField로 저장한 값 코드에서 불러오기
코드에서 값을 불러오는 방법은 아주 간단합니다.
BuildConfig클래스의 필드로 등록되므로,
아래와 같이 'BuildConfig.IS_FOR_TEST' 형태로 쉽게 접근할 수 있습니다.
참고로 값은 빌드 시에 등록되므로,
코드에서 사용하기 전에 Build를 해 주어야,
컴파일 에러가 나지 않습니다.
로그를 찍어보면, 위에서 설정한 true값이 나오는 것을 볼 수 있습니다.
1-4. resValue
UI에서 빌드별로 다르게 사용되는 값을, 빌드 시점에 정의하고 싶을 때 활용하는 메소드가,
resValue인데요.
사용방법은 buildCofigFiled와 비슷합니다.
아래와 같이 코드 내에서 해당 type name을 사용하려고 하면, 컴파일러가 접근 가능한 string임을 보여줍니다.
log에서 위에서 설정한 값이 나오는 것을 수 있습니다.
2. ProductFlavor
2-1. Product Flavors 언제 사용할까?
안드로이드 앱을 출시할 때,
광고가 달린 버전과,
광고가 없는 유료 버전을 구분해서 개발하고 출시할 수 있는데요.
이럴 때, productFlavors를 사용하면 좋습니다.
productFlavors는 기본적인 앱 코드는 같으나,
약간 다른 형태로 앱을 출시해야 할 때 유용하기 때문입니다.
productFlavors {
free {
applicationIdSuffix ".free"
versionNameSuffix "-free"
buildConfigField "boolean", "IS_PAID", "false"
}
paid {
applicationIdSuffix ".paid"
versionNameSuffix "-paid"
buildConfigField "boolean", "IS_PAID", "true"
}
}
아래와 같이, 지역별 앱 버전을 관리할 때도 사용할 수 있겠지요.
productFlavors {
korea {
applicationIdSuffix ".kr"
buildConfigField "String", "COUNTRY_CODE", "\"KR\""
resValue "string", "app_name", "앱 이름"
}
japan {
applicationIdSuffix ".jp"
buildConfigField "String", "COUNTRY_CODE", "\"JP\""
resValue "string", "app_name", "アプリ名"
}
global {
buildConfigField "String", "COUNTRY_CODE", "\"GL\""
resValue "string", "app_name", "App Name"
}
}
또한 dev, cbt, market버전등으로,
아래와 같이 앱 버전을 나누어서 사용할 때도 좋습니다.
2-2. 설정할 수 있는 값들
ProductFlavor에서는 아래와 같은 값들을 설정할 수 있습니다.
- minSdkVersion
- applicationId
- versionCode
- versionName
이외에도 build.gradle의 android tag에서 설정할 수 있는 모든 값들을 설정할 수 있습니다.
2-3. BuildType과 ProductFlavor
ProductFlavor에 따라서 각각 다른 앱으로 빌드해 APK 번들을 만들어 출시할 수 있습니다.
그 앱들은 BuildType에 따라서 아래와 같이 나누어지게 됩니다.
위에서와 같이 3가지 Flavor를 설정하였다면,
buildType이 debug와 Release로 되어 있을 경우,
아래와 같이 총 6가지의 APK 번들을 생성할 수 있게 됩니다.
- devDebug
- cbtDebug
- marketDebug
- devRelease
- cbtRelease
- marketRelease
3. 정리
BuildType과 ProductFlavor를 이용해서,
debug와 release에서 다른 값을 가지게 하거나,
무료 및 유료앱같이 기본코드베이스는 같지만 약간 변경된 값을 가지는 다른 앱들을 만들 수 있게 되었습니다.