AndroidStudioでGradleベースのビルドになってとても快適になりました。
自分はproductFlavorを使ってapplicationIdを切り替えたりしていたのですが、apkを作成するときの署名する証明書をflavorごとに切り替えたいと思っていろいろな方法を試してみたのでメモしておきます。
やはりandroidプラグインのバージョンごとの仕様変更に振り回されてしまう感がありますが、とりあえず、切り替えられる方法を書いておきます。
android plugin 1.0.0以降
以下のようにすると、./gradlew build
や./gradlew assemble
などしたときにreleaseビルドで署名済みのapkがoutputされます。
signingConfigs {
flavor1 {
..
}
flavor2 {
..
}
}
productFlavors {
flavor1 {
applicationId 'com.example.flavor1'
signingConfig signingConfigs.flavor1
}
flavor2 {
applicationId 'com.example.flavor2'
signingConfig signingConfigs.flavor2
}
}
debugビルドも同じ証明書を使いたい場合。
上記方法だとbuildTypeがdebugなビルド等は開発環境に依存してしまいます。
通常はそれで特に問題ないかと思いますが、どうしても本番アプリにdebugしたいときなど、debugビルドかつrelease証明書を使いたいこともあると思います。
(自分はしょっちゅうあります。きっと、あまりよくありませんね。。)
そういう場合は少しbuildTypeを少しいじります。
buildTypes {
release {
..
}
debug {
..
signingConfig android.buildTypes.release.signingConfig
// もしくはreleaseを先に書いて以下を頭で指定しても可?
// initWith release
}
}
buildTypeがdebugのときにもreleaseのsigningConfigを指定してやるだけです。
flavorで指定したものに勝手にしてくれるので便利だと思います。
buildTypeとflavorのクロス条件で証明書を指定する方法はちょっとわかりませんでした。
昔の方法
1.0.0以降だとエラーはでないものの、意図したように動きませんが、
参考までに昔の方法も書いておきます。
buildTypes {
release {
productFlavors.flavor1.signingConfig signingConfigs.flavor1
productFlavors.flavor2.signingConfig signingConfigs.flavor2
}
}
こっちの方が若干スマートな気がするんですが、buildTypeとproductFlavorが相互に干渉し合うと複雑でわかりづらい、という配慮かもしれませんね。
現在(2015/7/14)最新が1.2.3?とかなのでほとんどこのままかと思うのですが、今後変更されるかもしれませんね。
groovyのスクリプトを書いてしまえばいいのですが、それでもタイミングとか難しそうでうまく書けなかったので、公式の関数で探してみました。
公式でサポートしてあればまとめた方が綺麗かなーと思います。
参考
ほぼこちらの質問の内容です。
Debug Signing Config on Gradle Product Flavors
ずっと昔に参考にしていた質問はこちらです。
これはあまり参考にならないので引用していません。
Signing product flavors with gradle
おまけ:dependenciesの場合
ちなみに、dependenciesはbuildTypeとproductFlavorでクロスで指定できるようで、単にbuildTypeだけの場合は以下のように指定できます。ライブラリの場合はconfigurationでインポートするライブラリのbuildTypeも指定できるようです。
debugCompile project(path: ':lib1', configuration: 'debug')
releaseCompile project(path: ':lib1', configuration: 'release')
How to get current buildType in Android Gradle configuration
それをflavorも混ぜてやる場合はconfigurationを追加定義してやると引用先のflavorとbuildTypeも指定できたりするようです。。
configurations {
pubDebugCompile
devDebugCompile
pubReleaseCompile
devReleaseCompile
}
dependencies {
pubReleaseCompile project(path: ':common', configuration: "pubRelease")
devReleaseCompile project(path: ':common', configuration: "devRelease")
pubDebugCompile project(path: ':common', configuration: "pubDebug")
devDebugCompile project(path: ':common', configuration: "devDebug")
}
Gradle dependency based on both build type and flavor
ただし、ライブラリ側でflavorなどへのアクセスを許可してある必要があるみたいなので注意した方がいいかもしれません。
ProductFlavors を設定してるライブラリを使用するときは BuildVariant を指定する必要がある