やりたいこと
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
オプションを使います。
コマンド使用時は、以下のようになります。
$ ./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使ってます。
パラメータ無しでビルドしたとき
コマンドは次の通り
$ ./gradlew assembleDebug
パラメータ付きでビルドしたとき
コマンドは次の通り
$ ./gradlew assembleDebug -PDEBUG_FLAG_FOO=true -PDEBUG_RESPONSE=0