2015/12/09

Android:GradleでBuildConfigに定数追加する際のハック

Build variant毎に定数の値を変えたい場合, 下記のようにすることで実現できる.

productFlavors {
  development {
    buildConfigField "boolean", "PRODUCTION_MODE", "false"
  }
  production {
    buildConfigField "boolean", "PRODUCTION_MODE", "true"
  }
}

しかし, この例ではプロダクションモードを判定する下記のようなif文を書いた場合にAndroidStudioがwaningをあげてくる.

// これだとBuild variantによってPRODUCTION_MODEが常に
// true/false固定となり, AndroidStudioがシンプル化をすすめてくる. 
if (BuildConfig.PRODUCTION_MODE) { ... }

Build variantを変えるとtrue/falseが変わるため, コードをシンプル化(true/falseに置き換え)することはできない.
warningを放置すると誤ってシンプル化される恐れもある. 暫定的にwarningを回避する方法は下記.

// 下記コメントを記載することでwarning抑止できる
// noinspection ConstantConditions,PointlessBooleanExpression
if (BuildConfig.PRODUCTION_MODE) { ... }

もしくは, AndroidStudioをだます下記の方法でこれに対処することができる.

productFlavors {
  development {
    buildConfigField "boolean", "PRODUCTION_MODE", "Boolean.parseBoolean(\"false\")"
  }
  production {
    buildConfigField "boolean", "PRODUCTION_MODE", "Boolean.parseBoolean(\"true\")"
  }
}

Boolean.parseBoolean(String)を使うことでwarningが出なくなる.
(逆に言うとシンプル化できるところでwarningが出ていない)
後者はハックであるため今後も保証されたものではないことに注意.

確認したAndroidStudioのバージョンは1.5.1.

参考: Why does the BuildConfig class use Boolean.parseBoolean() instead of literal values?

以上.