前提
このようなVariantsの状況であるとします。
android{
buildTypes{
debug{...}
release{...}
}
flavorDimensions "number", "alphabet"
productFlavors{
one{
dimension "number"
}
two{
dimension "number"
}
alpfa{
dimension "alphabet"
}
beta{
dimension "alphabet"
}
}
}
これでsyncすると以下のようなパターンが出力されますね
oneAlphaDebug
oneAlphaRelease
oneBetaDebug
oneBetaRelease
twoAlphaDebug
twoAlphaRelease
twoBetaDebug
twoBetaRelease
優先度
モジュール
この状態でモジュール直下にvariants用のディレクトリを作成すると、該当variantsが指定された際に優先的に読み込ませることができます。
ex)
project/app/src/main/java/Util.kt
↓
project/app/src/debug/java/Util.kt -> 「〇〇Debug」variantsの時に優先される
project/app/src/release/java/Util.kt -> 「〇〇Release」variantsの時に優先される
flavorと組み合わせた際の優先度は以下になります
- src/oneDebug/ (flavor1 + buildType)
- src/alphaDebug/ (flavor2 + buildType)
- src/debug/ (buildType)
- src/one/ (flavor1)
- src/alpha/ (flavor2)
- (src/main/ (main))
/mainの優先度はresファイルを置いた時のみです
/mainとのクラス重複はビルドエラーになるので、正しく分けましょう
dependencies
flavor or buildType +"implementation" で指定できます
implementation "aaa" -> 全てのvariantsで読み込まれる
debugImplementation "aaa" -> 「〇〇Debug」varantsでのみ読み込まれる
oneImplementation "aaa" -> 「one〇〇」varantsでのみ読み込まれる
alphaImplementation "aaa" -> 「〇〇alpha〇〇」varantsでのみ読み込まれる
oneDebugImplementation "aaa" -> ×
注意すべきなのは
flavorとbuildTypeはそれぞれ一つしか指定できないことです。
(もしかしたら出来るかも...指定方法あれば教えてほしいです)
filter
「twoAlphaはデバッグ専用のvariantsなので、「twoAlphaRelease」variantsはいらない。表示したくない。」という場合
gradle7.0から以下のように書けば対応できます。
android{
buildTypes{...}
buildFlavors{...}
androidComponents {
beforeVariants(selector().all()) { variantBuilder ->
def isRelease = variantBuilder.buildType == "release"
def isTwo = variantBuilder.productFlavors[0].second == "two"
def isAlpha = variantBuilder.productFlavors[1].second == "alpha"
if (isRelease && isTwo && isAlpha) {
variantBuilder.enabled = false
}
}
}
}
参考
https://developer.android.com/studio/build/build-variants?hl=ja#filter-variants
https://stackoverflow.com/q/67330818