LoginSignup
13
9

More than 1 year has passed since last update.

新しくモジュールを作ったときにbuild.gradleを3行で済まし、カスタマイズをDSLで行う2

Last updated at Posted at 2022-05-07

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を使って、カスタマイズしています。

image.png

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にしました。

image.png

これによって使う側で、より直感的に書くことができるようになります。

image.png

13
9
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
13
9