せっかなくので、やってみた。

日々のあんなこと、こんなこと、せっかくなのでやってみた

andoridでライブラリモジュールにProduct Flavorを設定するとエラーになってしまう件

andoridのアプリで、共通で使用するライブラリにProduct Flavorを設定すると以下のエラーになってしまう。

ERROR: Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve project :XXXX
ERROR: Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve project :XXXX
ERROR: Unable to resolve dependency for ':app@debugUnitTest/compileClasspath': Could not resolve project :XXXX

アプリモジュールのProduct Flavorの設定は結構情報があるのですが、ライブラリについてはあまり情報がなかったのでメモ。

stackoverflow.com

こちらによると、ライブラリ側で設定したProduct Flavorと同じ内容をapp側のbuild.gradleにも記述する必要があるみたいです。
例えば、ライブラリで本番環境と開発環境でAPIのURLを切り替えたい場合は以下の様な記述で動作しました。

ライブラリモジュールのbuild.gradle

android {
    :

    // APIのURL設定
    flavorDimensions "api"
    productFlavors {
        production {
            dimension "api"
            // 本番環境
            buildConfigField "String", "API_URL_BASE", "\"https://production.hoge.moga\""
        }
        develop {
            // 開発環境
            dimension "api"
            buildConfigField "String", "API_URL_BASE", "\"https://develop.hoge.moga\""
        }
    }
}

appモジュールのbuild.gradle

android {
    :

    flavorDimensions "api"
    productFlavors {
        production {
            dimension "api"
            //matchingFallbacks = ["production"]
        }
        develop {
            dimension "api"
            //matchingFallbacks = ["develop"]
        }
    }
}

dependencies {
    :
    implementation project(':hogemogalib')
}

flavorDimensionsはproductFlavorsの各設定を横断的にグループ化する時に使用するらしく、必須項目です。
ここでは1つしか使用していないので、あまり気にせずとりあえずapiという名前を付けています。

アプリ側のmatchingFallbacksをコメントにしていますが、ライブラリ側にしかないproductFlavorsの設定項目を 使用したときにアプリ側で代替で使用する設定名を記述します。
ここではアプリ、ライブラリとも同じ設定項目を記述しているので、特に使用しなくても問題ないっぽいです。

上記の設定でbuildTypesに指定しているrelease/debugとProductFlavorのproduction/developを組み合わせた 4パターンのビルドができるようになります。

f:id:moneci:20200114162346p:plain

コードからは BuildConfig.API_URL_BASE で現在選択しているProductFlavorに対応する値が取得できます。
尚、Product Flavorに定義する設定名(ここではproduction、develop)は、はbuildTypesに定義しているのと同じ名前は 使用できないらしいです。debug等を指定すると、以下のエラーになりました。
ERROR: ProductFlavor names cannot collide with BuildType names

しかしGoogleのガイド見ても私にはさっぱりわかりませんでした。こういったの理解して開発できる人本当にすごいと思います。

developer.android.com