오늘은 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에서 다른 값을 가지게 하거나,
무료 및 유료앱같이 기본코드베이스는 같지만 약간 변경된 값을 가지는 다른 앱들을 만들 수 있게 되었습니다.
'Android 개발 > Android' 카테고리의 다른 글
Android Intent 결합시 사용하는 OR 비트 연산자 (2) | 2024.12.21 |
---|---|
Android API key 값 안전하게 Local.properties 에 보관하기 (2) | 2024.12.18 |
Vibrator 로 구현하는 안드로이드 진동 (0) | 2023.05.23 |
SharedPreference 로 간단한 데이터 저장하기 # Android (2) | 2023.04.27 |
getLaunchIntentForPackage 로 다른 앱을 실행 하는 방법 # query Android 11 (0) | 2023.04.20 |
함수안에 함수 넣기 # Closure Local functions Kotlin (0) | 2023.04.15 |
RemoteConfig 이용해서 다이나믹하게 앱 업데이트 하기 # Android (1) | 2023.03.23 |
Target Api 31 ( Android12 ) 에서 적용해야 하는 사항들 # Location Intent Filters exported mutability (0) | 2022.12.01 |
Contentprovider 와 ContentResolver 이용한 CRUD # Mime-type Uri (1) | 2022.11.18 |
Android 리소스 정리시 사용하는 Naming Convention (0) | 2022.11.12 |
댓글