BloByJames

Gradle Flavor 그리고 apk build 본문

프로그래밍/안드로이드

Gradle Flavor 그리고 apk build

blobyjames 2016. 10. 8. 04:15

아직 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 version, jp version, 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를 해줘야 하겠죠?

sync 작업이 끝나고 나면, 아래와 사진과 같이 View - Tool Windows - Build Variants를 선택해줍니다.



그러면 아래 사진과 같이 dev, jp, ko 버전 별로 Debug, Release apk를 생성 할 준비가 된 것을 확인할 수 있습니다.



(원하는 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를 모두 추가하겠습니다.



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



* 여기서 중요한 점은, main/java 에는 AppConstants.java file을 두지 않습니다.


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을 각각 추가해주시면 되겠습니다.


그림이 이해하기 쉬울테니 마지막 resource와 사진을 보여드리자면,


역시 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 역시 다르게 설정할 수 있다는 점~


사용된 예제는 flavor-example-android에서 확인하실 수 있습니다.


감사합니다.

Comments