Gradle Flavor and multiple APK

fobidlim
6 min readJun 9, 2018

--

아직 Android를 개발하면서 Eclipse를 놓지 못하고 있는 분이 계신가요?

아직도 Test server와 운영 server의 주석을 번갈아 가면서 build하고 계신가요?

Android Studio로 넘어오면서 Gradle을 사용하게 되고,

필요에 따라 다양한 version의 apk를 build를 할 수 있게 되어 아주 편하게 개발중이랍니다.

version을 나눌 수 있는 기준은 여러가지가 있을 수 있습니다.

  • 개발과 배포
  • 무료와 유료
  • 다양한 market 별
  • 국가 별
  • 등등

Gradle의 Flavor를 이용한다면, 다양한 version별로 apk를 build 할 수 있습니다.

우선, app의 build.gradle을 준비합니다.

android block 안에 나누고자 하는 version을 추가합니다.

저는 dev, jp, ko 세 가지 version을 추가하겠습니다.

productFlavors {
dev {
applicationId "me.fobid.flavorexample.dev"
testApplicationId "me.fobid.flavorexample.dev.test"
}
jp {
applicationId "me.fobid.flavorexample.jp"
testApplicationId "me.fobid.flavorexample.jp.test"
}
ko {
applicationId "me.fobid.flavorexample"
testApplicationId "me.fobid.flavorexample.test"
}
}

gradle file을 수정했으니, sync를 해줘야 하겠죠?

View > Tool Windows > Build Variants

sync 작업이 끝나고 나면, Build Variants 를 선택해줍니다.

원하는 version으로 선택을 하고, run을 하면 해당 version으로 emulator 혹은 device에서 실행이 됩니다.

이제 version 별로 source를 다르게 적용해보겠습니다.

app의 build.gradle에 방금 추가 했던 productFlavors block 아래에 이렇게 추가해줍니다.

sourceSets {
dev {
java.srcDirs = ['src/main/java', 'src/dev/java']
res.srcDirs = ['src/main/res', 'src/dev/res']
}
jp {
java.srcDirs = ['src/main/java', 'src/jp/java']
res.srcDirs = ['src/main/res', 'src/jp/res']
}
ko {
java.srcDirs = ['src/main/java', 'src/ko/java']
res.srcDirs = ['src/main/res', 'src/ko/res']
}
}

만약 java file을 다르게 설정할 필요가 없다면 각 flavor에서 java.src.Dirs = […] 구문은 삭제하셔도 됩니다.

(물론, resource 역시 필요 없으면 res.srcDirs를 추가하지 않아도 됩니다.)

설정이 끝났으면 설정에 맞게 directory를 project에 추가합니다.

여러 상황을 설명하기 위해 java와 res를 모두 추가하겠습니다.
여기서 중요한 점은, main/java 에는 AppConstants.java file을 두지 않습니다

각 directory에 세 개의 동일한 Class를 추가했습니다.

Build Variants에서 선택한 flavor의 build.gradle에 설정 된 java directory를 찾아가기 때문에, main에서 같은 package안에 같은 이름의 class가 있다면 duplicated, 즉 file이 중복됐다는 오류가 발생합니다.

여기까지가 flavor 별로 java file을 다르게 설정하는 방법입니다.

마지막은 resource!

resource를 다르게 설정할 수 있기 때문에, application 이름 역시 서로 다르게 나타낼 수 있습니다.

같은 project인데 왜 여러개의 application이 설치되냐구요?

같은 project 내부에 있지만 package가 서로 다르니, 사실 같은 application이라고 볼 수 없습니다.

package가 왜 다르냐구요?

(사진이 많아서 scroll 압박이 있긴 하지만…)

맨 처음, build.gradle 설정했던 productFlavors에 해답이 있습니다.

각 flavor 별로 다르게 설정했던 applicationId가 바로 설치 package 이름이 되겠습니다.

java file과 똑같은 원리로 달라질 필요가 있는 resource file을 각각 추가해주시면 되겠습니다.

역시 main/res에는 중복되는 resource file은 두지 않습니다.

마지막 유용한 응용 TIP.

productFlavors {
dev {
applicationId "me.fobid.flavorexample.dev"
testApplicationId "me.fobid.flavorexample.dev.test"

versionCode 1
versionName "1.0.0"
}
jp {
applicationId "me.fobid.flavorexample.jp"
testApplicationId "me.fobid.flavorexample.jp.text"

versionCode 2
versionName "2.0.0"
}
ko {
applicationId "me.fobid.flavorexample"
testApplicationId "me.fobid.flavorexample.text"

versionCode 3
versionName "3.0.0"
}
}

위와 같이 flavor 별로 versionCode와 versionName 역시 다르게 설정할 수 있다는 점!

--

--

No responses yet