producflavorsでググると割と古い情報(0.xx時代とか)ばかりなので、最新版でまとめておきます。
1 前提条件
AndroidStudio1.3を使用
2 最終目標
ProductFlavorsとBuildTypeを使い、BuildVariantsを使いこなす。
proguardは適用。
外部参照jarもflavor毎に切り替える。
#3 BuildType
デフォルトで用意されているdebugとreleaseを使う。
(1) release用設定
・releaseはproguard適用のため、ProjectStructure-BuildTypes-releaseで「minifyEnabled」をtrueにする。
・ビルドと同時に署名済みapkを生成したい場合は、ProjectStructure-Signingで必要な指定を行い、その設定名をProjectStructure-BuildTypes-releaseの「Signing Config」に指定しておく。
※パスワードなどがbuild.gradleにべた書きになるので注意。
(2) debug用設定
debugは別パッケージでインストールしたいので、ProjectStructure-BuildTypes-debugで「Application Id Suffix」に".debug"など任意のsuffixを指定する。
※AndroidAnnotations(3.2.2)を使うと、この指定だけでなぜかgradleがエラーになるので使用を諦めました。回避方法ご存じでしたらどなたか教えて下さい!!
#4 Flavors
(1) develop用設定
・ProjectStructure-Flavorsで「+」を押して追加し、Nameに「develop」(任意の名前)をセットする。
分かり易くするため、versionNameに「n.m.dev」と設定する(n,mは任意の数字)
(2) staging用設定
・ProjectStructure-Flavorsで「+」を押して追加し、Nameに「staging」(任意の名前)をセットする。
分かり易くするため、versionNameに「n.m.staging」と設定する(n,mは任意の数字)
#5 フォルダ構成
(1) javaソースとリソース関連を配置
app/src下に、以下のようにフォルダを配置する
app
+ main
+ java
+ res
+ assets
+ debug
+ java
+ res
+ assets
+ release
+ java
+ res
+ assets
+ develop
+ java
+ res
+ assets
+ staging
+ java
+ res
+ assets
resやassets下のファイルは、マージされ、main以外にもあれば上書きされます。
javaソースコードだけは、mainと各Flavorに同じクラスがあってはいけません。
また、BuildType別に置いたクラスは、各Flavorに同じクラスがあってはいけません。
例>debug/releaseに、ログ出力有/無しのLog.javaを置いた場合、developやstagingにLog.javaがあってはいけません。
(2) 外部参照jarを配置
app/libs下に、以下のようにフォルダを配置する。
staging時のみ、あるjarファイルを使いたい場合、以下のように置く。
app
+ libs
+ staging
+ stagingLib.jar
他にも、例えば、debugは検証用ライブラリ、releaseは商用ライブラリ、といった指定のあるSDKなども、この方法で切り替えられます。
6 Dependenciesの設定
appのbuild.gradleに以下の設定を記述する。
これは、stagingFlavorのときのみ、libs/staging下のjarファイルを参照する場合の記述。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
stagingCompile fileTree(dir: 'libs/staging', include: ['*.jar'])
}
7 確認
(1) すべてを一度ビルドする。
projectDir $ ./gradlew assemble
app/build/outputs/apk下に、以下のようにapkがいろいろ出来ているはず。
app-develop-debug.apk
app-develop-release.apk
app-staging-debug.apk
app-staging-release.apk
※xxx-unaligned.apkは無視
(2) libsの確認
proguardがかかると、使っていないコードは当然削除されるので、ライブラリを使用するコードを記述した上で、リリースビルドする。
app/build/outputs/mapping/develop/release/mapping.txt
app/build/outputs/mapping/staging/release/mapping.txt
上記でstagingLib.jarのパッケージ名などを検索してみる。
developでは見つからず、stagingでは見つかるはず。