BuildVariants
https://developer.android.com/studio/build/build-variants?hl=ko
단일 프로젝트에서 다양한 버전의 앱을 생성, 관리 하는 방법
빌드 타입을 나눈 후 빌드나 디버그 시 원하는 빌드 타입을 선택해서 빌드를 하면 됨
BuildType
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
buildConfigField "boolean", "isDebug", "false"
}
debug {
minifyEnabled false
buildConfigField "boolean", "isDebug", "true"
}
}
릴리즈 빌드와 디버그 빌드 때 다른 설정을 해줄 수 있음
BuildFlavor
flavorDimensions += "server_type"
productFlavors {
release_server {
dimension "server_type"
manifestPlaceholders = [appName: "운영서버"]
applicationIdSuffix ".release_server"
resValue "string", "appName", "운영서버"
buildConfigField "boolean", "isReleaseServer", "true"
}
dev_server {
dimension "server_type"
manifestPlaceholders = [appName: "데브서버"]
applicationIdSuffix ".dev_server"
buildConfigField "boolean", "isReleaseServer", "false"
resValue "string", "appName", "데브서버"
}
}
flavorDimensions을 추가해서 원하는 설정을 나누어 줌
dimension "flavorDimensions"으로 어떤 플레이버인지 설정해줌
빌드 시 원하는 타입 선택
Build Variants 툴을 열어서 액티브된 타입을 바꾸면 된다
BuildConfig
buildConfig를 이용해서 분기 처리를 해두면 매번 특정 조건에 맞춰서 코드를 수정하지 않아도 됨
BuildConfigField 사용법과 예시
buildConfigField "타입", "변수명", "기본값"
flavorDimensions += "server_type"
productFlavors {
release_server {
dimension "server_type"
buildConfigField "boolean", "isReleaseServer", "true"
}
dev_server {
dimension "server_type"
buildConfigField "boolean", "isReleaseServer", "false"
}
}
릴리즈 서버와 데브 서버를 구분할 용도로 boolean 타입의 변수를 만들었다.
val serverURL: String
get() {
return if (BuildConfig.isReleaseServer) {
ReleaseServer
} else {
DevServer
}
}
Gradle 빌드를 하면 BuildConfig 클래스가 생성됨
BuildConfig 클래스를 임포트해서 isReleaseServer 를 이용하여 분기처리를 진행함
빌드 타입 별로 다른 패키지명 부여하기
applicationIdSuffix "변형할 패키지 이름"
flavorDimensions += "server_type"
productFlavors {
release_server {
dimension "server_type"
applicationIdSuffix ".release_server"
}
dev_server {
dimension "server_type"
applicationIdSuffix ".dev_server"
}
}
플레이버별로 다른 applicationIdSuffix를 작성
기본 패키지명+”applicationIdSuffix”로 새 패키지명이 부여됨
패키지명 분리로 인해 google-service.json 오류가 난다면 다음 글을 참고
https://teqoo.tistory.com/283
빌드 타입 별로 다른 이름 부여하기
resValue "변수타입", "변수명", "값"
flavorDimensions += "server_type"
productFlavors {
release_server {
dimension "server_type"
manifestPlaceholders = [appName: "운영서버"]
resValue "string", "appName", "운영서버"
}
dev_server {
dimension "server_type"
manifestPlaceholders = [appName: "데브서버"]
resValue "string", "appName", "데브서버"
}
}
AndroidManifest.xml
<application
android:name=".ApplicationManager"
android:label="${appName}">
appName를 만들고 매니페스트에서 해당 변수를 이름으로 사용하도록 구현된 로직
빌드 타입 별로 다른 버전 이름을 부여하기
디버그 옵션 false인 상태에서는 버전명 으로 빌드 되고
디버그 옵션이 true 인 상태에서 빌드 시에는 버전명-DEV로 빌드 하도록 구현된 로직
파이어베이스 크래쉬틱스에서 버전명으로 실 사용자 크래쉬와 테스트용 크래쉬를 나누기 위해 로직을 구현
defaultConfig {
applicationVariants.all { variant ->
def flavor = variant.mergedFlavor
def versionName = flavor.getVersionName()
if (variant.buildType.name == 'debug') {
versionName += '-DEV'
}
variant.outputs.each { output ->
output.versionNameOverride = versionName
}
}
}
applicationVariants 리스트를 이용해서 빌드 타입과 빌드 버전을 알아낸 후빌트 타입이 dev 인 경우 버전이름에 -dev를 추가하는 로직