AndroidStudoでBuildVariantsを追加すると実行の構成がエラーになる事象の解消方法

# AndroidStudoでBuildVariantsとは
BuildVariants(ビルドバリアント)とは、単一のプロジェクトからさまざまなバージョンのアプリを作成する方法です。
公式ホームページ
[ビルド バリアントを設定する](https://developer.android.com/studio/build/build-variants?hl=ja)
デフォルトでは「表示」→「ツールウィンドウ」→「BuildVariants」を開くと以下のように
![Screenshot_20230115_124447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/d5f42f77-a223-39cf-100c-11c1395576a8.png)
* debug
* release

の2つのVariatntsが定義されています。
VariatntsはbuildTypeとproductFlavorsの組み合わせで構成されます。
buildTypeはビルドの方法、debug、release、staging・・・等を定義します。
productFlavorsはどちらかと言うとそのアプリのビルドに何を含めるか、demo、full・・・等を定義します。
Variatntsはこの掛け合わせ、(demo、full) × (debug、release、staging) になります。
productFlavorsは定義されていなければ、defaultConfig の設定値が適用されます。
# BuildVariantsでやりたかったこと
現在、専用のバーコードカメラを持ったAndroid端末でバーコードを読み取るアプリの開発をしています。標準ではない端末メーカ専用のカメラなのでバーコードを読み込むAPIも専用のライブラリが提供されていて、それを呼び出しています。
なので、エミュレータではその専用の専用のバーコードカメラがないので動かすことができません。
バーコードを読み取って、その値で動き出すアプリなので、バーコードが読めないと実質何もできません。常に実機があるわけではないので、なんとかエミュレータでも動かせる方法がないか模索していました。
当初はSharedPreferenceにモードを持って、独自にファイルを読み込んでバーコードの中身を返すクラスを作って、ロジックで
```kotlin
    if (isMock()) {
        val barcode = BarcodeMock.readBarcode()
    } else {
        val barcode = ・・・ // モノホンのライブラリを呼ぶ
    }
```
のようにしていましたが、
* 処理が煩雑になる。
* 本番(実機)で必要のない処理が入っているのがイマイチよろしくない。

これらを解決するために、モノホンのバーコードライブラリと同じAPIインタフェースでモック用のライブラリを作り、ビルド時にモノホンとモックのライブラリを切り替えることができないかを考えてみました。
# BuildVariantsにVariantsを追加する
今回は、productFlavorsは必要ないので、buildTypeだけを使います
デフォルトのbuildTypesに1個追加して、
* debug (デバック、モノホンのバーコードライブラリ)
* debugMock (デバック、モックのバーコードライブラリ)
* release (リリース、モノホンのバーコードライブラリ)

で、Variantsを切り替えることで実現しようとしました。

```gradle:build.gradle
buildTypes {
    debug { // バーコードライブラリ モノホン
    }
    debugMock{ // バーコードライブラリMock
    }
    release { // バーコードライブラリ モノホン
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
dependencies {
    ・・・
    debugImplementation files('libs/monohon.jar') // バーコードライブラリ モノホン
    debugMockImplementation files('libs/Mock.jar') // バーコードライブラリMock
    releaseImplementation files('libs/monohon.jar') // バーコードライブラリ モノホン
    ・・・
}
```
これで、期待したとおりBuildVariantsに「debugMock」が増えたんですが・・・
![Screenshot_20230115_130252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/de311e60-67d6-2965-cff1-132a050a75ba.png)
VariantsにdebugMock、releaseを選ぶと、実行の構成が赤い☓印が付いて実行できなくなります。
![Screenshot_20230115_130529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/7ff99df7-0f36-2022-8b3d-07a7dade9c4c.png)
Variantsがデフォルトのdebugとreleaseだけの時はこのように赤い☓印は付きません。実行の構成を開いてみると・・・
![Screenshot_20230115_130730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/57c2ca3a-6299-d08a-f1d1-e521722b7b8d.png)
下に赤い！マークで、
> エラー: The apk for your currently selected variant cannot be signed. Please specify a signing configuration for this variant (release).

と書かれています。これを見ると署名がされていないと言うように見えますが・・・ここで署名なんて必要なんだっけ？と思いつつ隣の修正ボタンを押して署名情報を入れてみましたが、それでも☓印は消えません。

そもそもこの赤いバツ印が付いた状態で署名なくても、署名なしビルドであればビルドはできます。
「ビルド」→「Build Bundle(s)/APK(s)」→「build APK(s)」
debug、debugMock、relaseどれもビルドできます。

[【Android】Active Build Variantを切り替えたときにエラーが発生した時のまとめ](https://qiita.com/takagimeow/items/4432fd5d9d5773837d24)

を試してみましたが、これでも実行の構成の赤い☓印は消えませんでした。
ここに、ズバリ解決方法が載ってました。

[Error: The apk for your currently selected variant (Unknown output) is not signed. Please specify a signing configuration for this variant (debug)](https://stackoverflow.com/questions/66579530/error-the-apk-for-your-currently-selected-variant-unknown-output-is-not-signe)

「ファイル」→「プロジェクトの構成」
左のカテゴリから「Modules」を選択、Modulesは「app」を選択、右上の「DefaultConfig」を選択
SigningConfigに「signingConfigs.debug」を選択
![Screenshot_20230115_131701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/41f947c5-0051-7106-bb68-42a65df36a68.png)
これによって、build.gradleは以下のようになります。

```gradle:build.gradle
・・・
defaultConfig {

    ・・・

    signingConfig signingConfigs.debug
}
```
これで赤い☓印は消えました
![Screenshot_20230115_132232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/c85ac0bd-5752-9654-11ad-3f41f06de225.png)
![Screenshot_20230115_132254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/c895ef37-b9fe-143f-f171-a74eb8ed8e1e.png)

signingConfig signingConfigs.debugはdefaultConfigじゃなくて、buildTypesの各Variantsの方にいれてもいいみたいです。
```gradle:build.gradle
    buildTypes {
        debug {
        }
        debugMock{
            signingConfig signingConfigs.debug
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debug
        }
    }
    ・・・
}
```
でもイケます。