1
2

More than 1 year has passed since last update.

Androidのgradleでのbuild variantsあれこれ

Last updated at Posted at 2023-02-15

前提

このようなVariantsの状況であるとします。

.gradle
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と組み合わせた際の優先度は以下になります

  1. src/oneDebug/ (flavor1 + buildType)
  2. src/alphaDebug/ (flavor2 + buildType)
  3. src/debug/ (buildType)
  4. src/one/ (flavor1)
  5. src/alpha/ (flavor2)
  6. (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から以下のように書けば対応できます。

.gradle
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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2