나만의 안드로이드 앱 만들기/중급자

나만의 안드로이드 앱 만들기(중급자 편) - BuildConfig의 deprecated 대응하기

Victorywskim 2023. 12. 22. 22:33
반응형

BuildConfig 는 안드로이드에서 설정 값을 유동적으로 사용하기 위한 기능입니다.

 

예를 들어 개발 버전인지 아닌지에 대한 값을 가져와서 특정 기능을 노출 유무를 결정하거나 서버 통신 시 사용할 기본 경로를 결정하는 등 많은 부분에서 사용됩니다.

 

하지만 AGP(Android gradle plugin) 8.0부터는 기본적으로 deprecated 되었으며, 9.0부터는 사라진다고 합니다.

 

https://cs.android.com/android-studio/platform/tools/base/+/0bc1c23297760643b03e8cfd8acc52c007a99cd6

 

cs.android.com

 

기존 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 모두 경로는 동일해야 합니다.

 

저의 경로는 다음과 같습니다. 

kotlin  > system > config

 

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 를 가져와서 사용 가능합니다.

 

감사합니다.

 

반응형