Android Add Resource Value With Build Type And Flavor

2025. 3. 1. 01:30·Dev experience/Android
728x90
반응형

이번 글에서는 build type과 flavor에 따라 resValue를 추가하는 작업을 해볼 것이다.

 

이게 왜 필요했을까

언제나 그렇듯 평범한 버그 수정, 신규 기능 추가를 반복하던 중

다른 서버 주소 줄테니 이것도 따로 빌드해줘

이런 요청을 받은 것이다.

 

물론 이런 요청이 단발적이라면 모를까

내가 듣기로는 이후로 몇 번은 더 받을 요청이라는 생각이 들었다.

 

그래서 아예 flavor를 하나 추가해 debug, release 빌드 타입을 포함한 총 4개의 빌드를 구성했다.

 

방법 설명

여기서 방법이 갈린다.

 

최신 프로젝트 생성 시엔 build.gradle.kts가 기본으로 설정되기에

Groovy, Kotlin 모두 적용법을 찾아보았다.

 

Groovy에서 적용하기

android {
	...
    buildTypes {
    	release {
        	...
        }
		debug {
        	...
        }
    }
    
    flavorDimensions += "version"
    productFlavors {
    	demo {
        	dimension "version"
        }
        prod {
        	dimension "version"
        }
    }
    
    applicationVariants.configureEach { variant ->
        variant.resValue "string", "SERVER_URL", getEnvName(variant)
    }
}

def getEnvName(variant) {
    def flavor = variant.flavorName
    def buildType = variant.buildType.name

    if (flavor == "demo") {
        return "demo.env"
    } else if (flavor == "prod" && buildType == "debug") {
        return "debug.env"
    } else if (flavor == "prod" && buildType == "release") {
        return "release.env"
    }

    return "default.env"
}

여기서 첫번째로 중요한 것은 flavorDimensions 구문이다.

 

개발자 사이트를 보면 Groovy의 경우 flavorDimensions == "version"같은

연산자(?)를 사용하는데 이렇게 빌드를 시도하면 빌드가 되지 않는다.

 

정확한 이유는 모르겠지만 Kotlin DSL 방식에 있는 += 연산자를 사용하면

정상적으로 빌드할 수 있다.

 

그리고 def를 android 외부로 위치시키는 것이다.

 

물론 def를 android 내부로 넣어두면 애초에 컴파일러가 에러를 보여주어

빌드할 수 없을 것이다.

 

Kotlin DSL에서 적용하기

android {
	...
    buildTypes {
    	release {
        	...
        }
		debug {
        	...
        }
    }
    
    flavorDimensions += "version"
    productFlavors {
    	create("demo") {
        	dimension "version"
        }
        create("prod") {
        	dimension "version"
        }
    }
    
    applicationVariants.all {
        val flavorName = flavorName
        val buildTypeName = buildType.name

        resValue("string", "SERVER_URL", getEnvName(flavorName, buildTypeName))
    }
}

fun getEnvName(flavorName: String, buildTypeName: String): String {
    return when {
        flavor == "demo" -> "demo.env"
        flavor == "prod" && buildType == "debug" -> "debug.env"
        flavor == "prod" && buildType == "release" -> "release.env"
        else -> "default.env"
    }
}

Kotlin DSL에서는 보다시피 applicationVariants에 사용하는 함수가 바뀌었다.

 

그리고 getEnvName 함수 정의도 코틀린스럽게 변경된 것을 볼 수 있다.

 

공통 주의사항

flavorDimensions는 꼭 정의해주어야 한다.

 

다만, 이름은 자유롭게 정해도 된다.

 

내 경우에는 dimension에 특별히 의미를 두지 않았다.

 

결과

이렇게 build type 및 flavor를 추가해주면

총 4가지 빌드를 Android Studio Build Variants 탭에서 확인할 수 있다.

(demoDebug, demoRelease, prodDebug, prodRelease)

 

참조

https://developer.android.com/build/build-variants

 

빌드 변형 구성  |  Android Studio  |  Android Developers

빌드 변형을 구성하여 단일 프로젝트에서 여러 버전의 앱을 만드는 방법을 알아보세요.

developer.android.com

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Dev experience > Android' 카테고리의 다른 글

Full Screen Intent 권한 관련 업데이트 거부  (0) 2025.07.15
Android Tester 환경 구축하기(from direct APK to Firebase App Distribution)  (0) 2025.03.10
Android EditText Text Repeating(글자 복제되는 현상)  (0) 2025.02.28
Store Signed APK 실행 시 Play Store로 이동  (0) 2025.02.11
Android Share Image File In 2way  (0) 2025.01.01
'Dev experience/Android' 카테고리의 다른 글
  • Full Screen Intent 권한 관련 업데이트 거부
  • Android Tester 환경 구축하기(from direct APK to Firebase App Distribution)
  • Android EditText Text Repeating(글자 복제되는 현상)
  • Store Signed APK 실행 시 Play Store로 이동
BonusTrack02.dev
BonusTrack02.dev
공부, 일상
  • BonusTrack02.dev
    BonusTrack02.dev
    BonusTrack02.dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (238) N
      • Dev experience (86) N
        • Android (85) N
        • Kotlin (1)
      • Study (62)
        • Kotlin (26)
        • Swift (17)
        • Java (19)
      • 프로그래머스 (68)
      • 주저리주저리 (22)
        • 카페 (5)
        • 음식점 (4)
        • 컨퍼런스 (1)
        • 팝업스토어 (4)
        • 전시회 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    LiveData
    SWIFT
    오블완
    Observer
    프로그래머스
    CodeLab
    daterangepicker
    PCCE
    코틀린
    viewModelScope
    스위프트
    Material
    Kotlin
    ios
    안드로이드
    배열
    티스토리챌린지
    programmers
    ViewModel
    코루틴
    databinding
    room
    MVVM
    aac
    coroutines
    jetpack
    android
    getNumericValue
    Java
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BonusTrack02.dev
Android Add Resource Value With Build Type And Flavor
상단으로

티스토리툴바