Android / Gradle / Programming

NowInAndroidのbuild.gradleを読み解く – Android Kotlin Gradle

NowInAndroidのGradleを読み解くシリーズの第2弾です。
NowInAndroidではCompositeビルドを使用して、マルチプロジェクトのビルドを行っています。
今回はbuild-logic/conventionにあるbuild.gradle.ktsを見ていきます。

build.gradle.kts

ビルドスクリプトは、Projectオブジェクトを構成します。
このProjectオブジェクトは、ビルドスクリプトの「デリゲートオブジェクト」と呼ばれます。
デリゲートオブジェクトとは、そのスクリプトが操作を行う対象のオブジェクトを意味します。

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins { // 1
    `kotlin-dsl`
}

group = "com.google.samples.apps.nowinandroid.buildlogic" // 2

java { // 3
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}
tasks.withType<KotlinCompile>().configureEach { // 4
    kotlinOptions { // 5
        jvmTarget = JavaVersion.VERSION_17.toString()
    }
}

dependencies { // 6
    compileOnly(libs.android.gradlePlugin) // 7
    compileOnly(libs.firebase.crashlytics.gradlePlugin)
    compileOnly(libs.firebase.performance.gradlePlugin)
    compileOnly(libs.kotlin.gradlePlugin)
    compileOnly(libs.ksp.gradlePlugin)
}

gradlePlugin { // 8
    plugins {
        register("androidApplicationCompose") {
            id = "nowinandroid.android.application.compose"
            implementationClass = "AndroidApplicationComposeConventionPlugin"
        }
        register("androidApplication") {
            id = "nowinandroid.android.application"
            implementationClass = "AndroidApplicationConventionPlugin"
        }
        register("androidApplicationJacoco") {
            id = "nowinandroid.android.application.jacoco"
            implementationClass = "AndroidApplicationJacocoConventionPlugin"
        }
        register("androidLibraryCompose") {
            id = "nowinandroid.android.library.compose"
            implementationClass = "AndroidLibraryComposeConventionPlugin"
        }
        register("androidLibrary") {
            id = "nowinandroid.android.library"
            implementationClass = "AndroidLibraryConventionPlugin"
        }
        register("androidFeature") {
            id = "nowinandroid.android.feature"
            implementationClass = "AndroidFeatureConventionPlugin"
        }
        register("androidLibraryJacoco") {
            id = "nowinandroid.android.library.jacoco"
            implementationClass = "AndroidLibraryJacocoConventionPlugin"
        }
        register("androidTest") {
            id = "nowinandroid.android.test"
            implementationClass = "AndroidTestConventionPlugin"
        }
        register("androidHilt") {
            id = "nowinandroid.android.hilt"
            implementationClass = "AndroidHiltConventionPlugin"
        }
        register("androidRoom") {
            id = "nowinandroid.android.room"
            implementationClass = "AndroidRoomConventionPlugin"
        }
        register("androidFirebase") {
            id = "nowinandroid.android.application.firebase"
            implementationClass = "AndroidApplicationFirebaseConventionPlugin"
        }
        register("androidFlavors") {
            id = "nowinandroid.android.application.flavors"
            implementationClass = "AndroidApplicationFlavorsConventionPlugin"
        }
        register("androidLint") {
            id = "nowinandroid.android.lint"
            implementationClass = "AndroidLintConventionPlugin"
        }
        register("jvmLibrary") {
            id = "nowinandroid.jvm.library"
            implementationClass = "JvmLibraryConventionPlugin"
        }
    }
}

nowinandroid/build-logic/convention/build.gradle.ktsより

1. プラグインの適用
このスクリプト(build.gradle.kts)をKotlinで記述するため、「`kotlin-dsl`」プラグインを適用しています。

プラグインはsettings.gradle(.kts)でもbuild.gradle(.kts)でも記述できますが、違いは適用範囲にあります。
settings.gradle(.kts)のプラグインはプロジェクト全体に適用され、build.gradle(.kts)のプラグインは、そのプロジェクトのモジュールのみに適用されます。

2. グループ名の変更
このプロジェクトのグループ名を設定しています。
初期値として、プロジェクトが存在するディレクトリのパスが設定されていますが、このように任意で変更もできます。
この値は、「toString()」の値として使用されます。

3. javaブロックの使用
kotlin-dslは、GradleのJava APIを含んでいるため、javaブロックの使用が可能になっています。

sourceCompatibilityでは、Javaソースのコンパイルに使用されるソースの互換性を設定しています。
この場合、「JavaVersion.VERSION_17」を設定しているため、Java17の構文とセマンティクスを使用して記述されたJavaソースコードをコンパイルできます。

targetCompatibilityでは、Javaソースのコンパイルに使用されるクラスの互換性を設定しています。
この場合、「JavaVersion.VERSION_17」を設定しているため、生成されるクラスはJava17の実行環境で実行することができます。

4. configureEachで反復処理
tasks: Gradleに登録されているすべてのタスクを参照
.withType<KotlinComplie>(): すべてのKotlinCompile型のオブジェクトをコレクションに追加
.configureEach { … }: コレクション内のすべてにラムダの内容を実行

5. Kotlinコンパイラーの設定変更
Kotlinコンパイラーには、様々な設定があり、kotlinOptions(compilerOptions)を使用することで参照や変更ができます。

公式のリリースノートによると、将来的にkotlinOptionsは、非推奨になるようです。
kotlinOptionsを使用する代わりに、compilerOptionsとtoolOptionsを使用することが推奨されています。

6. DependencyHandlerの使用
dependencies { … }では、依存関係の宣言で使用するDependencyHandlerに対してラムダを実行します。

7. 依存関係の宣言
dependencies { … }のラムダ内部で依存関係を宣言します。
compileOnly()は、コンパイル時は必須だが実行時には不要な依存関係などに使用します。

8. 自作プラグインの定義
gradlePlugin { … }では、プロジェクト内で作成したプラグインの定義を行います。
これには「id」と「implementationClass」が含まれます。
「implementationClass」で定義しているクラスを「id」で定義しているidに紐づけしています。
これにより下記のように参照することができるようになります。

plugins {
    id("nowinandroid.android.application.compose")
}

NowInAndroidでは、nowinandroid/gradle/libs.versions.tomlの177行目から190行目までで参照しています。

おわりに

次回はnowinandroid/settings.gradle.ktsについて解説します。
ご要望等がありましたらお気軽にコメントまでお願いします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です