Closed1

gradle.properties を BuildConfig に渡すやつ試作

ykrodsykrods

前準備

android {
    buildFeatures {
        buildConfig = true  // これが必要
    } 
}

コード

build.gradle.kts に追加

interface BindPropertyScope {
    fun stringConfigField(name: String, default: String = "")
    fun booleanConfigField(name: String, default: Boolean = false)
    fun stringResource(name: String, default: String = "")
}

fun VariantDimension.bindProperty(configure: BindPropertyScope.() -> Unit) {
    object: BindPropertyScope {
        override fun stringConfigField(name: String, default: String) {
            val value = (project.properties[name] as? String) ?: default
            buildConfigField("String", name, "\"$value\"")
        }
        override fun booleanConfigField(name: String, default: Boolean) {
            val value = (project.properties[name] as? String)?.toBoolean() ?: default
            buildConfigField("Boolean", name, value.toString())
        }
        override fun stringResource(name: String, default: String) {
            val value = (project.properties[name] as? String) ?: default
            resValue("string", name, value)
        }
    }.configure()
}

使い方

android {
    // ..
    defaultConfig {
        // ...
        bindProperty {
            stringConfigField("FOO_TOKEN")
            booleanConfigField("FOO_ENABLED", default = true)
            stringResource("BAR_URL")
        }
    }
}

解説

  • VariantDimension は defaultConfig, ApplicationBuildType, ApplicationBuildFlavor で実装されるインターフェイスで、 buildConfigField, resValue などが定義されている
  • VariantDimension.bindProperty:
    • 拡張関数 にすることで呼び出す場所を制限するのと、this が VariantDimension になるのでそこから buildConfigField などを参照できるようにする
  • configure: BindPropertyScope.() -> Unit:

NOTE

  • Release ビルドのときにプロパティが読み込めなかったら例外飛ばす感じにしたい
    • 現状 BuildType をビルド実行時にとる方法が不明
    • あんまり頑張るところでもないので難しそうならいいかなみたいな気持ちがある
  • プラグインにしたほうが綺麗か?
    • dsl の拡張みたいな感じだがどうやる?
    • あんまり頑張るところでもないので(以下略)
このスクラップは2023/11/10にクローズされました