［Android］ビルドタイプとフレーバーをバージョン情報に含める

## はじめに

Androidアプリ開発の中ではビルドタイプ(Build Type)やフレーバー(Flavor)を
定義して利用用途ごとにAPKファイルを生成することがあります。
そういった時にバージョン情報にビルドタイプ(Build Type)やフレーバー(Flavor)の
情報を埋め込む方法を調べたのでまとめたいと思います。

## 0. 作成するものの確認

こんな感じでビルドタイプとフレーバーの情報を含めたバージョン情報を作成して

```
{バージョン名称}-{フレーバー(ディメンション1)}-{フレーバー(ディメンション2)-{ビルドタイプ}}
```

作成したバージョン情報をアプリケーションで表示してみようかと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/20859f6e-7a38-af7d-d00b-898e1f74f579.png" height="500"/>

## 1. ビルドタイプを定義する

まずバージョン情報に含めるビルドタイプを宣言します。
今回はビルドタイプとしてRelese、Debug、Stagingの3つを用意します。

```groovy:build.gradle(app)
android {
　　　　︙
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            debuggable true
        }

        staging {
            initWith debug
        }
    }
}
```


問題なく定義できていれば「View」->「Tool Windows」->「Build Variants」->「Active Build Variant」に
次のような感じでRelease、Debug、Stagingが追加されビルドできるようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/5bfd9ae2-66e3-1f62-6920-ddd652c5273d.png)


## 2. プロダクトフレーバーを定義する

バージョン情報に含めるディメンションとしてversionとadvertisementの2つを定義します。
そしてversionにdemoとfull、advertisementにadoffとadonのフレーバーを定義しておきます。

```groovy:build.gradle(app)
android {
        ︙
    buildTypes {
        ︙
    }

    flavorDimensions "version", "advertisement"
    productFlavors {
        demo {
            dimension "version"
        }

        full {
            dimension "version"
        }

        adon {
            dimension "advertisement"
        }

        adoff {
            dimension "advertisement"
        }
    }
}
```

問題なく定義できていれば「View」->「Tool Windows」->「Build Variants」->「Active Build Variant」に
次のような感じで全通りのフレーバーとビルドタイプの組み合わせが表示されビルドできるようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/072fd8fb-86c6-b3f7-56b6-3d52f227627b.png)

## 3. バージョン名称を編集する

これで下準備は整ったので実際にバージョン情報を追加していきます。
初めに基本となるバージョン名称を編集します、今回はシンプルに1.0.0とします。

```groovy:build.gradle(app)
    defaultConfig {
        applicationId "kaleidot725.myapplication"
        minSdkVersion 23
        targetSdkVersion 29
        versionCode 1
        versionName "1.0.0" // ここに記載されるバージョン名称を編集する
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
```

## 4. ビルドタイプをバージョン情報に追加する

次にビルドタイプをバージョン情報に追加していきたいと思います。
各ビルドタイプに**versionNameSuffix**を定義して名前付けしていきます。

```groovy:build.gradle(app)
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            applicationIdSuffix "-release" // このビルドタイプの名称を記述する
        }

        debug {
            debuggable true
            applicationIdSuffix "-debug" // このビルドタイプの名称を記述する
        }

        staging {
            initWith debug
            applicationIdSuffix "-staging" // このビルドタイプの名称を記述する
        }
    }
```

## 5. フレーバーをバージョン情報に追加する

次にフレーバーにバージョン情報に追加していきたいと思います。
これも同じく各フレーバーに**versionNameSuffix**を定義して名前付けしていきます。
これにてバージョン情報を追加していく作業は終わりになります。

```groovy:build.gradle(app)
    flavorDimensions "version", "advertisement"
    productFlavors {
        demo {
            dimension "version"
            versionNameSuffix "-demo" // このビルドタイプの名称を記述する
        }

        full {
            dimension "version"
            versionNameSuffix "-full" // このビルドタイプの名称を記述する
        }

        adon {
            dimension "advertisement"
            versionNameSuffix "-adon" // このビルドタイプの名称を記述する
        }

        adoff {
            dimension "advertisement"
            versionNameSuffix "-adoff" // このビルドタイプの名称を記述する
        }
    }
```

## 6. バージョン情報をアプリに表示する

確認のためバージョン情報をMainActivityに表示したいと思います。
バージョン情報を表示できればよいので、次のようなTextViewだけを持つレイアウトを作成します。

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/version_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="32dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```

そしてbuild.gradle(app)で作成したバージョン情報を
取得してTextViewにセットするようにします。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val packageInfo = packageManager.getPackageInfo(packageName, 0);
        val version = packageInfo.versionName

        val versionView = findViewById<TextView>(R.id.version_text)
        versionView.text = version
    }
}
```

そして最後にアプリケーションを起動して終わりです。
次のように作成したバージョン情報が表示されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/20859f6e-7a38-af7d-d00b-898e1f74f579.png" height="500"/>

試しにBuild Variantを変更して起動してみてください。
次のようにBuild Variantの設定に応じてバージョン情報が変わります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/859a6ad3-c7f4-4fc5-678f-a83692cec1d0.png" height="500"/>

## おわりに

gradle.build(app)にversionNameSuffixを追加していくだけで、
ビルドタイプとフレーバーをバージョン情報に埋め込むことができます。
この記事で作成したアプリケーションは次に置いてありますので参考にしてください。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/9ac9e6cb-a49e-5896-4729-28a27037e8e9.png)| [Kaleidot725 => android-mylab => VersionGenerator](https://github.com/kaleidot725/android-mylab/tree/master/VersionGenerator) |
| ------- | ------- |


## 参考

- [ビルドバリアントの設定 | Android | Google Developers](https://developer.android.com/studio/build/build-variants?hl=ja)