Android アプリで productFlavors に resConfigs を設定する時の注意

# 概要
productFlavors に resConfigs を設定すると、  **defaultConfig に設定されている項目を上書きするのではなく、追加される。**

# resConfigs とは？
Android アプリの build.gradle ファイルにアプリで使用する言語リソースを記述する項目です。
https://developer.android.com/studio/build/shrink-code.html?hl=ja#unused-alt-resources

recConfig を適切に設定することで、apk ファイルサイズを削減することができます。
https://qiita.com/tatsuhama/items/814471b79c5d572f77e9

## 例
```gradle
android {
    defaultConfig {
        ...
        resConfigs "en", "ja" // 英語と日本語のみ対応
    }
}
```

# productFlavors とは？
デモ版/本番版、有償版/無償版 など、アプリのビルド方法を定義することができます
https://developer.android.com/studio/build/build-variants.html#product-flavors

## 例）
```gradle
productFlavors {
    japan {
        // 国内向けビルド
        applicationIdSuffix ".japan"
    }
    global {
        // 海外向けビルド
        applicationIdSuffix ".global"
    }
}
```

# productFlavors に resConfigs を設定する
こんな風に設定できます。

```gradle
productFlavors {
    japan {
        // 国内向けビルド
        applicationIdSuffix ".japan"
    }
    global {
        // 海外向けビルド
        applicationIdSuffix ".global"
        resConfigs "en" // 英語リソースだけ含めたい
    }
}
```

# ハマった点
## やりたいこと
* 国内向けアプリ：英語と日本語以外のみ対応（他の言語リソースは削除したい）
* 海外向けアプリ：英語のみ対応（日本語リソースも削除したい）

## 記述
```gradle
android {
    defaultConfig {
        ...
        resConfigs "en", "ja" // 英語と日本語以外のリソースは削除
    }

    productFlavors {
        japan {
            // 国内向けビルド
            applicationIdSuffix ".japan"
        }
        global {
            // 海外向けビルド
            applicationIdSuffix ".global"
            resConfigs "en" // 英語リソースだけ含めたい
        }
    }
}

```

## 問題
**global の Flavor に日本語リソースも含まれている。。。**
apk Analyzer で開いた結果
<img width="419" alt="スクリーンショット 2017-12-27 13.28.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/4e879332-cdf6-dc9b-6e81-80698d2b65e2.png">

## 原因
`resConfigs` に設定した項目は**上書きではなく追加される**

## 原因詳細
`recConfigs` 上で  `command` キー（※Mac の場合）を押下しながらクリック
![IMG_0183.JPG](https://qiita-image-store.s3.amazonaws.com/0/9695/b2fb05e4-bae7-cde3-c154-155fd1c66fa0.jpeg)

`BaseFlavor.class` が開くので、コードを見てみる
<img width="316" alt="スクリーンショット 2017-12-27 13.29.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/b4a3c16b-b766-42db-1ecf-7dc57f26f5fb.png">
確かに、 `add` になってますね。

デフォルトで、 `["en" , "ja"]` が設定されているので、  `"en"` を add して `["en" , "ja"]` なんですね。。。
※ set じゃない。

ちなみに、 `applicationIdSuffix` は add ではなく set です。
<img width="535" alt="スクリーンショット 2017-12-29 16.24.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/9c03bb1a-5283-3e50-9d84-4ed1dddf588b.png">

## 対応
特定のフレーバーで `defaultConfig` に設定されている内容から言語を**削減したい場合、 `defaultConfig` の `resConfigs` を記述しない。**


（ただ、productFlavors の数が多いと、全てに記述しないといけないのは面倒…）

### 記述

```gradle
android {
    defaultConfig {
        ...
        // ↓ ** globalフレーバーで日本語も含まれるので記述しない **
        // resConfigs "en", "ja" // 英語と日本語以外のリソースは削除
        // ↑ ** globalフレーバーで日本語も含まれるので記述しない **
    }

    productFlavors {
        japan {
            // 国内向けビルド
            applicationIdSuffix ".japan"
            resConfigs "en", "ja" // 英語と日本語以外のリソースは削除
        }
        global {
            // 海外向けビルド
            applicationIdSuffix ".global"
            resConfigs "en" // 英語リソースだけ含めたい
        }
    }
}

```

# まとめ
productFlavors に resConfigs を設定すると、  **defaultConfig に設定されている項目を上書きするのではなく、追加される。**