나만의 안드로이드 앱 만들기(중급자 편) - BuildConfig의 deprecated 대응하기
BuildConfig 는 안드로이드에서 설정 값을 유동적으로 사용하기 위한 기능입니다.
예를 들어 개발 버전인지 아닌지에 대한 값을 가져와서 특정 기능을 노출 유무를 결정하거나 서버 통신 시 사용할 기본 경로를 결정하는 등 많은 부분에서 사용됩니다.
하지만 AGP(Android gradle plugin) 8.0부터는 기본적으로 deprecated 되었으며, 9.0부터는 사라진다고 합니다.
기존 buildConfigField 사용 방법은 다음과 같습니다.
android {
...
buildTypes {
debug {
buildConfigField "Boolean", "DEBUG_MODE", "true"
}
release {
buildConfigField "Boolean", "DEBUG_MODE", "false"
}
}
...
하지만 이 방법은 앞으로는 사용하기 어렵기에 다음과 같이 수정하여 사용하는 것을 추천드립니다.
build.gradle.kts
import java.util.Calendar
import java.util.Date
plugins {
...
}
fun getDateTime() : String {
val now = Date()
val calendar = Calendar.getInstance()
calendar.time = now
val month = calendar.get(Calendar.MONTH)+1
val day = calendar.get(Calendar.DAY_OF_MONTH)
val hour = calendar.get(Calendar.HOUR_OF_DAY)
val minute = calendar.get(Calendar.MINUTE)
return "[${month}-${day} ${hour}:${minute}]"
}
dependencies {
...
}
android {
...
buildFeatures {
compose = true
// 기존 BuildConfig 는 사용 되지 않음
buildConfig = false
}
buildTypes {
getByName("debug") {
isMinifyEnabled = false
versionNameSuffix = "Debug"
}
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
// 추후 필요한 경우 사용 예정
// signingConfig = signingConfigs.getByName("key")
}
}
// https://developer.android.com/studio/build?hl=ko
// https://github.com/mustafayigitt/KotlinDSL-BuildSrcExample/blob/master/app/build.gradle.kts
flavorDimensions.add("appType")
productFlavors {
create("dev") {
dimension = "appType"
applicationIdSuffix = ".dev"
versionNameSuffix = "-dev-${getDateTime()}"
manifestPlaceholders["applicationLabel"] = "@string/app_name_dev"
}
create("prod") {
dimension = "appType"
manifestPlaceholders["applicationLabel"] = "@string/app_name_prod"
}
}
}
주목해야 하는 부분은 다음과 같습니다.
- buildFeatures
- 8.0 안에서는 buildConfig = true 를 통해 기존 방식이 사용 가능하긴 하지만 앞으로 사용하지 않을 예정이기 때문에 false 로 작성합니다.
- buildTypes
- 앱이 배포할때는 release 로 배포하는 것이 일반적입니다. 따라서 debug 에는 versionNameSuffix 를 통해 버전 명에 차별을 두어 관리를 편하게 하기 위한 목적입니다.
- productFlavors
- dev 는 개발, prod 는 운영 앱을 빌드할때 사용하게 됩니다.
- applicationIdSuffix 는 스마트폰 한대에 개발, 운영 앱 둘다 설치하기 위해 어플리케이션 아이디를 다르게 설정하기 위함입니다.
SnBuildConfig 만들기
프로젝트 모듈 안에 들어오시면 src 디렉터리가 있는데 그 안에 기본적으로 androidTest, main, test 3개의 디렉터리가 존재합니다.
여기에 productFlavors 에 추가했던 dev 와 prod 라는 이름의 디렉터리를 2개 더 생성합니다.
그 내부에는 kotlin 디렉터리를 만들고 그 다음부터는 자유롭게 만드시면 됩니다.
단 dev 와 prod 모두 경로는 동일해야 합니다.
저의 경로는 다음과 같습니다.
config 디렉터리 안에 SdBuildConfig 라는 파일을 생성하였고 다음과 같이 작성하였습니다.
SdBuildConfig.kt
object SdBuildConfig {
val buildType = SdBuildTypeEnum.DEV
const val snServerUrl = "https://.com/"
}
SdBuildTypeEnum.kt
@Keep
enum class SdBuildTypeEnum {
DEV,
PROD
}
지금은 빌드된 앱이 어떤 종류인지만 구분하고 있지만, 추후 네트워크 통신을 비롯해서 여러 구분 값들을 이 파일 안에서 작성 후 사용할 예정입니다.
사용 방법
안드로이드 스튜디오의 Build variants 를 변경하면 그에 맞는 SdBuildConfig 를 가져와서 사용 가능합니다.
감사합니다.