LoginSignup
10
8

More than 1 year has passed since last update.

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

Last updated at Posted at 2017-12-29

概要

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

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

productFlavors とは?

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

例)

productFlavors {
    japan {
        // 国内向けビルド
        applicationIdSuffix ".japan"
    }
    global {
        // 海外向けビルド
        applicationIdSuffix ".global"
    }
}

productFlavors に resConfigs を設定する

こんな風に設定できます。

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

ハマった点

やりたいこと

  • 国内向けアプリ:英語と日本語以外のみ対応(他の言語リソースは削除したい)
  • 海外向けアプリ:英語のみ対応(日本語リソースも削除したい)

記述

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

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

問題

global の Flavor に日本語リソースも含まれている。。。
apk Analyzer で開いた結果
スクリーンショット 2017-12-27 13.28.31.png

原因

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

原因詳細

recConfigs 上で command キー(※Mac の場合)を押下しながらクリック
IMG_0183.JPG

BaseFlavor.class が開くので、コードを見てみる
スクリーンショット 2017-12-27 13.29.09.png
確かに、 add になってますね。

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

ちなみに、 applicationIdSuffix は add ではなく set です。
スクリーンショット 2017-12-29 16.24.49.png

対応

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

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

記述

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

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

まとめ

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

10
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8