ProductFlavor覚書

# はじめに
Android開発でProductFlavorはよく使いますが、
はじめに一回きりか予め別の人が設定しているかで自分が理解する機会をえれていなかったので、
覚書を残します。

環境
AndroidStudio 3.5.1

# 業務でよく使うパターン、覚えておきたいこと
## 例題(要件)
- 開発環境、ステージング環境が2つ(stg1 / stg2)、本番環境がある
- それぞれ別のアプリでインストール・起動・テストをしたい
- 一部の処理を各環境ごとに変更したい

### 初期状態のbuild.gradle(app)

```gradle
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "sample.my.mvvm_bmi"
        minSdkVersion 28
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
// 省略
}
```

## 要件ごとの実装例

## 開発環境、ステージング環境が2つ(stg1 / stg2)、本番環境がある

AndroidStudioであれば、[File] -> [Procjet Structure] (shortcut ⌘;)から
GUIでFlavorを設定できます。
AddDimensionでFlavorDimensionsを設定して、その後ProductFlavorを設定します。

<img width="952" alt="スクリーンショット 2019-12-31 13.26.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/0a37541b-5dd4-1b0f-7ea7-6cbd8e0ffd96.png">

### 設定後

```gradle
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "sample.my.mvvm_bmi"
        minSdkVersion 28
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    flavorDimensions 'environment'
    productFlavors {
        dev {
            dimension = 'environment'
        }
        stg1 {
            dimension = 'environment'
        }
        stg2 {
            dimension = 'environment'
        }
        prd {
            dimension = 'environment'
        }
    }
}

dependencies {
// 省略
}
```

## それぞれ別のアプリでインストール・起動・テストをしたい

ProductFlavorの登録画面で Application Id Suffix と
Version Name Suffix を設定すればOKです。

<img width="952" alt="スクリーンショット 2019-12-31 16.49.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/370266aa-0d30-ad2e-b1ce-58dec893aeef.png">

## 一部の処理を各環境ごとに変更したい

https://developer.android.com/studio/build/build-variants?hl=ja#sourcesets
を参考に、各Flavorごとのjavaフォルダ、resフォルダを作成します。
AndroidStudioでproductFlavorと同名のフォルダを紐づけてくれるので、
かなり直感的です。

<img width="985" alt="スクリーンショット 2019-12-31 17.22.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/8e6f0215-58f3-43ba-cc02-6657f6002c67.png">

<img width="808" alt="スクリーンショット 2019-12-31 17.22.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/09bbd943-b385-9681-4345-a17864c33037.png">


## おまけ
https://developer.android.com/studio/build/build-variants?hl=ja#filter-variants
にある通り、特定のビルドバリアントを設定しないようにもできます。
キャプチャはproductionはdebugビルドなしの設定をしています。

<img width="1225" alt="スクリーンショット 2019-12-31 17.09.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/e82b84e0-f1d1-40de-a76b-c05ec153fa92.png">

# まとめ
逆引きっぽくなってしまいましたが、自分が今まで見てきたパターンをまとめてみました。
[Androidの公式サイト](https://developer.android.com/studio/build/build-variants?hl=ja)にも綺麗に書かれています。
また、[こちらのページ](https://qiita.com/alt_yamamoto/items/7c9546a003984d53637f)も綺麗にまとめられていて、非常に参考になりました。