[Android][Gradle]product flavorごとに署名する証明書を変えたい

AndroidStudioでGradleベースのビルドになってとても快適になりました。
自分はproductFlavorを使ってapplicationIdを切り替えたりしていたのですが、apkを作成するときの署名する証明書をflavorごとに切り替えたいと思っていろいろな方法を試してみたのでメモしておきます。

やはりandroidプラグインのバージョンごとの仕様変更に振り回されてしまう感がありますが、とりあえず、切り替えられる方法を書いておきます。

# android plugin 1.0.0以降

以下のようにすると、`./gradlew build`や`./gradlew assemble`などしたときにreleaseビルドで署名済みのapkがoutputされます。

```build.gradle

    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を少しいじります。

```build.gradle

    buildTypes {
        release {
            ..
        }
        debug {
            ..
            signingConfig android.buildTypes.release.signingConfig
            // もしくはreleaseを先に書いて以下を頭で指定しても可？
          　// initWith release
        }
    }
```

buildTypeがdebugのときにもreleaseのsigningConfigを指定してやるだけです。
flavorで指定したものに勝手にしてくれるので便利だと思います。

buildTypeとflavorのクロス条件で証明書を指定する方法はちょっとわかりませんでした。

# 昔の方法

1.0.0以降だとエラーはでないものの、意図したように動きませんが、
参考までに昔の方法も書いておきます。

```build.gradle
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](http://stackoverflow.com/questions/20222229/debug-signing-config-on-gradle-product-flavors)

ずっと昔に参考にしていた質問はこちらです。
これはあまり参考にならないので引用していません。
[Signing product flavors with gradle](http://stackoverflow.com/questions/17040494/signing-product-flavors-with-gradle)

# おまけ:dependenciesの場合

ちなみに、dependenciesはbuildTypeとproductFlavorでクロスで指定できるようで、単にbuildTypeだけの場合は以下のように指定できます。ライブラリの場合はconfigurationでインポートするライブラリのbuildTypeも指定できるようです。

```build.gradle
debugCompile project(path: ':lib1', configuration: 'debug')
releaseCompile project(path: ':lib1', configuration: 'release')
```

[How to get current buildType in Android Gradle configuration](http://stackoverflow.com/questions/25739163/how-to-get-current-buildtype-in-android-gradle-configuration/27444964#27444964)

それをflavorも混ぜてやる場合はconfigurationを追加定義してやると引用先のflavorとbuildTypeも指定できたりするようです。。

```build.gradle
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](http://stackoverflow.com/questions/28137853/gradle-dependency-based-on-both-build-type-and-flavor)

ただし、ライブラリ側でflavorなどへのアクセスを許可してある必要があるみたいなので注意した方がいいかもしれません。
[ProductFlavors を設定してるライブラリを使用するときは BuildVariant を指定する必要がある](http://qiita.com/ShogoMizumoto/items/fa31fb3cd8dfb000a3f2)