[Android]Build Variant(ビルドバリアント)のあれこれ

今までビルドバリアントについて知らなかったので色々調べたまとめ。
個人的備忘録として記事にします。
この記事はGroovyではなくKotlinでの設定方法を書く。

# ビルドバリアントって？
> ビルド可能なさまざまなバージョンのアプリを表しています。たとえば、コンテンツが限定された無料版と、より多くのコンテンツを含む有料版の両方を作成できます。API レベルまたは他のデバイスのバリエーションに基づいて、異なるデバイスをターゲットとするアプリの異なるバージョンをビルドすることもできます。

とあるように、これを設定しておくと1つのアプリで複数のバージョンを作ることができる。

AndroidStudioでは以下の場所で現在のビルドバリアントを確認できる

* 現在のビルドバリアントの確認。この画像だとdebugが選択されている
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/de31e3fd-f910-658e-4e48-49569f795c4e.png">

* ビルドバリアントの設定が見つからない場合、左の・・・から出現する一覧で選択すると、上の画像通りになる

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/5929344b-ba89-1451-93e2-849b31c750e2.png">

* デフォルトでは2種類のビルドバリアントがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/99d1aa0d-f7e7-4ec6-1e01-d0b6c5271ec1.png)

ビルドバリアントは

> プロダクト フレーバーとビルドタイプの、異なる組み合わせの結果です。プロダクト フレーバーはユーザー向けの属性であり、ビルドタイプはデベロッパー向けの属性であると考えることができます。実際はビルド バリアントは直接設定するわけではなく、プロダクト フレーバーのセットとビルドタイプのセットを設定し、それによってビルド バリアントを決定します。

とあるようにこの記事ではビルドタイプとプロダクトフレーバーの設定とかについて書く。

# ビルドタイプの設定
`build.gradle.kts`の`android`ブロックにbuildtypeを設定できる。

```diff_gradle
android {
    defaultConfig {
        ...
    }
    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
+       create("demo") {
+           isMinifyEnabled = false
+     }
    }
}
```
デフォルトでreleaseは設定されており、ここには書かれていないがdebugも設定されている。
`create()`で新しく作成することができる。buildTypesでのプロパティはまだ
詳しくないため[リファレンス](https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/BuildType)を見て欲しい。
この状態でビルドバリアントを見ると画像のように増えていることが確認できる。
![BuildVariant5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/8606da5e-2879-4f2e-01cc-73b92209b796.png)

# プロダクトフレーバーの設定
buildtypeと同じように`build.gradle.kts`の`android`ブロックにproductFlavorを設定できる。
```gradle
android {
    ...
    defaultConfig {...}
    buildTypes {
        release {...}
        create("demo") {...}
    }
    flavorDimensions += "hugahuga"
    productFlavors {
        create("sushi") {
            dimension = "hugahuga"
            applicationIdSuffix = ".sushi"
            versionNameSuffix = "-sushi"
        }
        create("yakiniku") {
            dimension = "hugahuga"
            applicationIdSuffix = ".yakiniku"
            versionNameSuffix = "-yakiniku"
        }
    }
}
```
設定後ビルドバリアントを見ると増えていることが確認できる。
![BuildVariant4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/3448b6cf-1128-c059-beab-b00e71b7d5d8.png)

ビルドバリアントはproductFlavorとbuildtypeのすべての組み合わせを表し、それに応じて`<product-flavor><build-type>`という名前が付く。
`applicationIdSuffix`を設定すると、アプリIDの後ろに設定した文字列を付与できる。
`versionNameSuffix`を設定すると、バージョン名の後ろに設定した文字列を付与できる。

ここでそれぞれsushidebugとyakinikudebugを選択してビルドすると、実機もしくはエミュレータ上でアプリIDとバージョン名に付与されていることが確認できる。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/e6de1683-ddad-8c99-b555-01128fdf2a19.png">
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/b7983074-d327-9b7e-262a-d371ce13e856.png">

画像(今回は実機)を見ると最下部のバージョン名とアプリIDに設定した文字列が付与されているのを確認できる。

# アプリ名とアイコンの変更
このままだと同一端末内に同じ見た目、名前のアプリが存在してしまい、一目では分からない。
そのため選択したビルドバリアントによってアイコンと名前を設定することができる。

## ディレクトリの追加
まずはsushiとyakiniku用のディレクトリを作成する。

1. 左上のAndroidタブをクリックして一覧の中からProjectを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/c7796ce0-606e-bb66-247a-da328c76a186.png)

2. `MyProject/app/src/`(今回の場合だと`BuidVariantTest/app/src/`)を右クリックして、[New] > [Directory]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/841ec3e4-6b9c-e470-080c-62f803b307f7.png)

3\. 表示された一覧から追加したいディレクトリを選択(今回の場合は`sushi/res`、`yakiniku/res`)
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/e0a53a4c-d43d-571b-3099-94f8ded607f2.png">
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/4c222d81-0119-3106-fe81-e48d2c9fc0e5.png">

:::note warn
注意
ディレクトリを追加する際、ビルドバリアントで追加したいものを選択していないと一覧に表示されない
(sushi/resを追加したいならsushidebug、yakinikuならyakinikudebugとか)
:::

ディレクトリの追加ができたらそれぞれyakiniku用、sushi用のアイコンを作成する。
1. image Assetsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/d7ace26f-9315-6478-e06d-68ca1ab83ec0.png)

2. アイコンの作成
![imageasset2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/42cd57b3-46cd-be8d-ce0a-3eff878ab79c.png)

## AndroidManifestの編集
AndroidManifestのアイコン、アプリ名を設定する場所(icon、label、roundIcon)を任意の変数名にする。
```xml
<application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="${app_icon}"
        android:label="${app_name}"
        android:roundIcon="${app_icon_round}"
        android:supportsRtl="true"
        android:theme="@style/Theme.BuildVariantTest"
        tools:targetApi="31"
        >
```
## プロダクトフレーバーの編集
選んだビルドバリアントによってアイコンとアプリ名を変更するため、プロダクトフレーバーにプロパティを追加する。

```diff_gradle
android {
    ...
    defaultConfig {...}
    buildTypes {
        release {...}
        create("demo") {...}
    }
    flavorDimensions += "hugahuga"
    productFlavors {
        create("sushi") {
            dimension = "hugahuga"
            applicationIdSuffix = ".sushi"
            versionNameSuffix = "-sushi"
+           manifestPlaceholders["app_name"] = "sushi"
+           manifestPlaceholders["app_icon"] = "@mipmap/ic_launcher"
+           manifestPlaceholders["app_icon_round"] = "@mipmap/ic_launcher_round"
        }
        create("yakiniku") {
            dimension = "hugahuga"
            applicationIdSuffix = ".yakiniku"
            versionNameSuffix = "-yakiniku"
+           manifestPlaceholders["app_name"] = "yakiniku"
+           manifestPlaceholders["app_icon"] = "@mipmap/ic_launcher"
+           manifestPlaceholders["app_icon_round"] = "@mipmap/ic_launcher_round"
        }
    }
}
```
編集後それぞれのビルドバリアントでビルドすると画像のようにアイコンと名前の変わったアプリが出来上がる。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671458/2c197d2a-7855-6049-416a-b75402253d26.png">

# まとめ
これでビルドバリアントを使ってバージョンの違うアプリを扱える。
AndroidDeveloperやチュートリアルを見ればこの記事を読まなくてもできると思うが、サイトを往復するのが手間だったので、自分用にまとめた。

# 参考
[ビルド バリアントを設定する](https://developer.android.com/build/build-variants?hl=ja#kts)
[ビルド バリアントを使用してさまざまなバージョンのアプリを作成する
](https://developer.android.com/codelabs/build-variants?hl=ja#0)