Too long, Don't read
- アプリに必要なgoogle-services.jsonは開発用と本番用の二種類だけでいい
- productFlavors、flavorDimensionsがそれぞれ2種類以上ある
- フレーバーの組み合わせすべてのフォルダにgoogle-services.jsonを置かなきゃいけない
- だるい
- そんなときの解消法
サンプルのbuild.gradle
build.gradle
android {
// 略
flavorDimensions "mode", "api"
productFlavors {
dev {
dimension "mode"
applicationIdSuffix '.dev'
}
prd {
dimension "mode"
}
minApi23 {
dimension "api"
minSdkVersion '23'
}
minApi21 {
dimension "api"
minSdkVersion '21'
}
}
buildTypes {
debug {
// 略
}
release {
// 略
}
}
}
// 略
apply plugin: "com.google.gms.google-services"
app/src/フレーバー名/
の直下にgoogle-services.json
を配置すれば拾ってくれるようになりましたが、
実際に使いたいgoogle-services.json
は開発用(dev)と本番用(prd)の二種類だけだったとします
しかし、この全部のフレーバーの組み合わせ
[dev/prd]×[minApi23/minApi21]×[debug/release] = 2 × 2 × 2 = 8
だけあるので、各フォルダにgoogle-services.jsonを配置しなきゃいけない
やってられんですね。
解決法
- app/src以下にdevとprdのフォルダを切る
- それぞれのフォルダ直下に
google-services.json
を配置 - gradleのbeforeTaskでdevかprdに応じてgoogle-services.jsonをコピーする
gradle.taskGraph.beforeTask { Task task ->
if (task.name ==~ /process.*GoogleServices/) {
android.applicationVariants.all { variant ->
if (task.name ==~ /(?i)processDev.*GoogleServices/) {
copy {
from "src/dev"
into "."
include "google-services.json"
}
} else {
copy {
from "src/prd"
into "."
include "google-services.json"
}
}
}
}
}
GoogleServicesを読み込むプロセス名は
process${productFlavorName}GoogleServices
となるので、
productFlavorNameの頭がdevかprdかでgoogle-service.jsonのコピー元を判別してコピーしてます
そんだけっちゃそんだけなんですが、やってらんねー!な人がこれ以上増えないように書いときます。