1がうまく動かない部分があったのですが、ジワジワLGTMしていただいて、うまく動かないものになっていて申し訳ないので、修正版を用意しました。
結論とコード
androidComponents.finalizeDslを使って、カスタマイズしよう。
こちらで確認できます。buildSrcとライブラリのbuild.gradleをご確認ください。
使う側のコード
plugins {
id("my.custom.library")
}
myCustomExtension {
useCompose = true // カスタマイズしたい部分だけ変更する
}
使われる側のコード
buildSrc/src/main/kotlin/my.custom.library.gradle.kts
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
open class MyCustomPluginExtension @JvmOverloads constructor(
var useCompose: Boolean = false
)
val extension = project.extensions.create<MyCustomPluginExtension>("myCustomExtension")
android {
compileSdk = 32
...普通のandroidブロック
}
dependencies {
implementation("androidx.core:core-ktx:1.7.0")
...
}
// カスマイズしたいものは以下で書く
// https://developer.android.com/studio/build/extend-agp
androidComponents.finalizeDsl { androidExtension ->
androidExtension.buildFeatures {
println("extension.useCompose:" + extension.useCompose)
compose = extension.useCompose
}
}
具体的にに何がうまく動かなかったのか?
変更diffは以下の通りで、以下のようにuseCompose = true
のように設定していた部分で設定が反映されていませんでした。
plugins {
id("my.custom.library")
}
myCustomExtension {
useCompose = true
}
なぜうまく動かなかったか?
使う側のコード
plugins {
id("my.custom.library") // ←この時点でもうAndroidブロックが実行されてしまうので、下の設定を反映できない!!!
}
myCustomExtension {
useCompose = true
}
どうしたか?
androidComponents.finalizeDslを使って、カスタマイズしています。
androidComponents.finalizeDsl{}とは?
一般的にこういうときにはafterEvaluate{}が使えますが、Androidのドキュメントには以下のようにあり、AndroidのAGPと一緒に使う場合は推奨されていません。
このDSL parsingというAPIを使うことで、AGPが設定可能になったタイミングで、設定することができます。
When interacting with AGP, use specially made extension points instead of registering the typical Gradle lifecycle callbacks (such as afterEvaluate()) or setting up explicit Task dependencies.
plugins {
id("my.custom.library")
}
myCustomExtension {
useCompose = true
}
// ←この後でandroidComponents.finalizeDsl {}がよばれる!!
細かい変更点
Gradle Propertyを使っていましたが、特にTaskでもないので使う必要がないので普通のKotlin Propertyにしました。
これによって使う側で、より直感的に書くことができるようになります。