Androidのライブラリモジュールにビルドプロパティを渡す

# やりたいこと
Androidというか、Java/KotlinでGradle使ってビルドしている場合の話かと思います。

ライブラリモジュールがあって、以下のように`BuildConfig`を使ってデバッグフラグなどを制御している。

```lib/build.gradle
android {
    //...

    defaultConfig {
        buildConfigField("boolean", "DEBUG_FLAG_FOO", "false")
        buildConfigField("boolean", "DEBUG_FLAG_BAR", "false")
        buildConfigField("int", "DEBUG_RESPONSE", "1")
    }
```

で、これを、ビルドコマンドでコンソールからビルドする時に指定してビルドしたい。
という場合にどうすれば良いのか調べたので、そのメモです。

# 前提

ライブラリプロジェクトはアプリプロジェクトにincludeされている形です。publicなリポジトリに公開されているライブラリでもなく、jar等で提供されているものでもありません。

```app/build.gradle
dependencies {
    implementation fileTree(dir: 'libs', include: '*.jar')
    implementation project(':my_library') // これ
}
```

# 解決方法

## 結論
`-P`オプションを使います。
コマンド使用時は、以下のようになります。

```console
$ ./gradlew aseembleDebug -PDEBUG_FLAG_FOO=true -PDEBUG_RESPONSE=0
```

ただ、一手間必要です。

## 手順

### gradle.propertiesに宣言を移す

フラグの宣言をルートプロジェクトにある`gradle.properties`に移します。

```gradle.properties
DEBUG_FLAG_FOO=false
DEBUG_FLAG_BAR=false
DEBUG_RESPONSE=1
```

### ライブラリのbuild.gradleを変更する

プロパティを参照するように変更します。

```lib/build.gradle
        defaultConfig {
            buildConfigField("boolean", "DEBUG_FLAG_FOO", "$rootProject.DEBUG_FLAG_FOO")
            buildConfigField("boolean", "DEBUG_FLAG_BAR", "$rootProject.DEBUG_FLAG_BAR")
            buildConfigField("int", "DEBUG_RESPONSE", "$rootProject.DEBUG_RESPONSE")
        }
```

以上！

## サンプル

ライブラリにこんなクラスがあって。

```FooBar.kt
class FooBar {
    companion object{
        const val fooFlag = BuildConfig.DEBUG_FLAG_FOO
        const val barFlag = BuildConfig.DEBUG_FLAG_BAR
        const val debugResponse = BuildConfig.DEBUG_RESPONSE

        const val TAG = "FooBar"
    }

    fun logFoo(){
        Log.d(TAG, "DEBUG_FLAG_FOO=$fooFlag")
    }

    fun logBar(){
        Log.d(TAG, "DEBUG_FLAG_BAR=$barFlag")
    }
    fun logResponse(){
        Log.d(TAG, "DEBUG_RESPONSE=$debugResponse")
    }

    fun getFooBar() = "\"fooFlag\" is $fooFlag\n" +
            "\"barFlag\" is $barFlag\n" +
            "\"debugResponse\" is $debugResponse"
}
```

アプリのモジュールはこんな風にして。

```MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.mylibrary.FooBar
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val lib = FooBar()
        lib.logFoo()
        lib.logBar()
        lib.logResponse()
        textView.text = lib.getFooBar()
    }
}
```

※まだkotlin-android-extensions使ってます。

### パラメータ無しでビルドしたとき

コマンドは次の通り

```console
$ ./gradlew assembleDebug
```

![no_option.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/8f12e758-e53d-b7bc-ffeb-5347a06da19b.png)

### パラメータ付きでビルドしたとき

コマンドは次の通り

```console
$ ./gradlew assembleDebug -PDEBUG_FLAG_FOO=true -PDEBUG_RESPONSE=0
```

![with_option.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/96798061-06bf-0ba6-4cb6-1b7e4753673f.png)

# 参考サイト
https://stackoverflow.com/questions/65115746/how-to-pass-argument-in-android-test-class-using-command-line