" Park 기술 블로그 "
# 카테고리
# 도구
[Android 안드로이드] Build Variant
2021-11-14 16:06:22

 오늘은 Android에서 여러 빌드 변형을 갖을 수 있도록 설정하는 법에 대해서 정리하려 한다.

이러한 빌드 변형을 설정하는 이유는 프로젝트를 개발을 위한 설정 세팅, 배포용을 위한 설정 세팅 등을 아주 간편하게 변경하기 위해서 설정한다. 예를 들어 한 개의 프로젝트에서 무료 앱과 유료 앱으로 구분할 때, 프로젝트에 대한 개발자 옵션을 보여줄 수 있는 빌드 변형, 없는 변형 등을 구분할 수 있도록 해준다.

 

 이러한 빌드 변형을 설정하는 곳은 app 수준의 build.gradle에서 할 수 있다.

구성하는 규칙은 의 조합으로 이루어진다. 예를 들어 productFlavors이 dev, product가 있고 buildTypes에 alpha, debug, release가 있다고 한다면 생성되는 빌드 변형은 아래와 같다.

  • devAlpha
  • devDebug
  • devRelease
  • productAlpha
  • productDebug
  • productRelease

이렇게 6가지가 된다. 위의 조합을 확인해보면 아는 것처럼 flavor당 각각의 buildType이 생성되기 때문에 flavor 수 * buildTypes 수가 생성된다. 아래는 위와 같이 빌드 변형을 구성하는 방법이다.

 flavorDimension을 사용하면 각 flavor을 조합해서 다양한 경우의 빌드 변형을 생성해서 사용할 수 있다. 그리고 AndroidStudio 3.0 이상 버전부터는 flavorDimension을 사용해서 다양한 flavor을 구성하지 않는다고 해도 꼭 1개 이상의 flavorDimension을 구성하도록 강제하고 있다. 그래서 위의 소스처럼 'api'라는 dimension으로 구성한 것을 볼 수 있다. flavorDimension에 대한 내용은 추가 포스팅으로 소개할 예정이다.

 맨 처음에 소개한 flavor을 정의하는 법은 위의 productFlavors 안에 각 flavor을 선언하면 된다. 그리고 buildTypes 안에 buildType들을 선언하면 되고 이 안에서는 실제 프로젝트 소스 안에서 BuildConfig.DEBUG와 같이 디버그 빌드인지 분기하기 위해서는 debuggable의 속성을 설정해주어야 한다. minifyEnabled, proguardFiles의 속성은 난독화에 대한 부분이다. 위의 소스에서 작성된 속성 말고도 다양한 속성이 있으므로 프로젝트 환경에 맞추어 찾아 사용하면 좋을 것 같다.

 

 위와 같이 flavor과 buildType을 정의하면 아래와 같이 빌드 변형을 선택할 수 있다.

하지만 상황에 따라서 사용하지 않는 빌드 변형이 생길 수 있다. 이러한 경우에는 아래와 같이 ignore처리하는 방법이 있다. 예를 들어 devRelease의 빌드 변형을 사용하지 않도록 설정하고 싶을 땐 아래의 variantFilter를 사용하면 된다.

variant.getFlavors().get(0).name 이 부분에서 get(0)으로 사용하는 이유는 flavorDimensions에 있다. flavorDimension을 두 개 이상 사용하면 flavor이 여러개의 조합으로 생성되므로 그 중에서 첫번째 flavor을 가져오겠다는 것이다. 예를 들어 flavorDimensions가 'api', 'server' 이렇게 구성되어 있고 productFlavors 중 dev에 dimension 'api' 이렇게 구성되어 있고, product의 dimension 'server' 이렇게 구성되어 있다면 아래와 같이 빌드 변형이 생성된다.

추가적으로 productFlavors에 free를 추가하고 free의 dimension을 'server'로 생성한다면 빌드 변형은 아래와 같이 생성될 것이다.

그래서 flavorDimensions가 1개인 상황에서 get(1)처럼 사용하면 IndexOutOfBoundsException이 발생한다.

 

위의 소스를 잘 보면 dev flavor의 versionCode를 왜 특정 값(위에서는 1205)으로 하드코딩 해놓은 것인가? 라는 의구점이 든다. 해답은 Build Time을 줄이기 위해서다. Android에서는 versionName을 통해 apk 버전을 구분하는 것이 아니라 versionCode를 통해 구분한다. 그래서 아래와 같이 versionCode를 자동화 해놓았을 경우 빌드할 때마다 자동 갱신이 일어난다.

그래서 개발용 dev flavor에서는 항상 동일한 버전을 제시함으로써 의무적인 갱신을 제거할 수 있도록 설정한 하나의 방법이다.

 

그리고 아래와 같이 각 flavor에 대해 Field를 추가할 수도 있다.

 

마지막으로 signingConfigs를 통해 앱 서명에 대해서 설정 해주어야 한다.

그리고 flavor 안에 signingConfig signingConfigs.debug 혹은 signingConfig signingConfigs.release를 넣어주면 된다.

 

위와 같이 추가하면 빌드 변형을 설정하면 아래처럼 프로젝트 소스 안에서 분기처리할 수 있다.

 

그리고 아래와 같이 선택된 빌드 변형에 따라서 디렉토리를 만들 수 있다.

위의 사진에서는 devDebug로 빌드 변형이 적용되었다. 이는 dev flavor과 debug buildType의 조합으로 이루어진 빌드 변형인데, 오른쪽의 New Directory처럼 원하는 위치의 디렉토리를 생성할 수 있다. 위의 devDebug 빌드 변형의 경우에서는 dev 디렉토리는 dev flavor에 관한 모든 빌드 유형이 사용할 수 있는 디렉토리고 위의 사진에서는 안나왔지만 debug 디렉토리는 debug buildType에 관한 모든 빌드 유형이 사용할 수 있는 디렉토리다. 그리고 devDebug 디렉토리는 devDebug 빌드 변형만 접근해서 사용할 수 있는 디렉토리다.

 

이러한 빌드 변형을 잘 사용하면 다양한 프로젝트 개발이 가능하다.

0
# 댓글 + 새 댓글 작성
# 새 댓글 작성
댓글 암호는 댓글 삭제 시 필요합니다.
# 님에게 답변 작성
대댓글 암호는 댓글 삭제 시 필요합니다.
# 님의 댓글 삭제
댓글 작성 시 입력했던 암호를 입력해주세요.
아직 댓글이 없습니다