メモ2ブログ

メモtoウェブログ。旧ブログはこちら。 http://sakebook.blogspot.jp/

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名で定義しています。 注意として androidDSLより前にPropertyを定義 する必要があります。 strというPropertyをタスクの引数で渡すには、次のようにします。

$ ./gradlew clean -Pstr=hoge assPR

これでBuildConfig.STR = "hoge"となります。

まとめ

使い道が限定されるかもしれませんが、こういう方法もあると頭に入れておくとソースの組み立て方の選択肢が増えて良いと思います。

サンプルソースをGitHubにあげました。

参考

Build Variantsで開発版Androidアプリを分ける / ninjinkun's diary

第14章 色々なチュートリアル / Gradle 日本語ドキュメント

android-sample-property / GitHub