LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-01

やりたいこと

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

no_option.png

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

コマンドは次の通り

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

with_option.png

参考サイト

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0