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를 해줘야 하겠죠?
sync 작업이 끝나고 나면, Build Variants 를 선택해줍니다.
이제 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에 추가합니다.
각 directory에 세 개의 동일한 Class를 추가했습니다.
Build Variants에서 선택한 flavor의 build.gradle에 설정 된 java directory를 찾아가기 때문에, main에서 같은 package안에 같은 이름의 class가 있다면 duplicated, 즉 file이 중복됐다는 오류가 발생합니다.
여기까지가 flavor 별로 java file을 다르게 설정하는 방법입니다.
마지막은 resource!
같은 project인데 왜 여러개의 application이 설치되냐구요?
같은 project 내부에 있지만 package가 서로 다르니, 사실 같은 application이라고 볼 수 없습니다.
package가 왜 다르냐구요?
(사진이 많아서 scroll 압박이 있긴 하지만…)
맨 처음, build.gradle 설정했던 productFlavors에 해답이 있습니다.
각 flavor 별로 다르게 설정했던 applicationId가 바로 설치 package 이름이 되겠습니다.
java file과 똑같은 원리로 달라질 필요가 있는 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 역시 다르게 설정할 수 있다는 점!
example project: