GradleビルドでPropertyを渡してBuildConfigに追加する
いくつかGradleスクリプトからビルド対象を変更する方法があります。
productFlavorsでソース切り分け
Flavor別に、ソースファイルごとに分けられる機能です。 OEMや、有料版などでソースを一部分載せ替えたりするときなどに有効です。
buildConfigFieldで値変更
前述のように大きく変更はしないが、一部変更したいときなどに有効な方法です。
- build.gradle
productFlavors { production { buildConfigField "boolean", "BOOL", "true" buildConfigField "String", "STR", "hoge" } log { buildConfigField "boolean", "BOOL", "false" buildConfigField "String", "STR", "huga" } }
コードから利用する際は次のようにします。
- SampleActivity.java
... Log.d(TAG, BuildConfig.STR); // hoge or huga Log.d(TAG, BuildConfig.BOOL); // true or false ...
タスクの引数として渡す
基本的には変更しないが、特定の状況でのみ一部変更したい場合などが稀にあります。 なんらかのデフォルト値をその状況専用に変えたいときや、特定の環境のAPKを作りたいときなど。
ソースコードをそのために変更させ、また戻すなどは手間でバグの元になります。
事前準備は必要ですが、build.gradle
を次のように変更することで、タスクの引数をbuildConfigField
として扱うことができます。
前述のような状況に、ソースコードをいじることなく対応できるようになります。
- build.gradle
def str = parent.hasProperty("str") ? parent.property("str") : "" ... android { ... productFlavors { production { buildConfigField "String", "STR", '"'+str+'"' ... } ... } buildTypes { release { ... } ... } ... }
予約語と被らなければなんでも良いのですが、今回はstr
というProperty名で定義しています。
注意として androidのDSLより前にPropertyを定義 する必要があります。
str
というPropertyをタスクの引数で渡すには、次のようにします。
$ ./gradlew clean -Pstr=hoge assPR
これでBuildConfig.STR = "hoge"
となります。
まとめ
使い道が限定されるかもしれませんが、こういう方法もあると頭に入れておくとソースの組み立て方の選択肢が増えて良いと思います。
参考
Build Variantsで開発版Androidアプリを分ける / ninjinkun's diary