Skip to content

Commit

Permalink
Migrate to KSP from KAPT for Hilt
Browse files Browse the repository at this point in the history
  • Loading branch information
azizutku committed Oct 25, 2023
1 parent 2a22984 commit 3c32b80
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,4 @@ class AndroidApplicationConventionPlugin : Plugin<Project> {
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,6 @@ class AndroidBenchmarkConventionPlugin : Plugin<Project> {
}
}

internal fun Project.androidComponents(configure: Action<TestAndroidComponentsExtension>): Unit =
private fun Project.androidComponents(configure: Action<TestAndroidComponentsExtension>): Unit =
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("androidComponents", configure)

Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import com.android.build.api.variant.LibraryAndroidComponentsExtension
import com.android.build.gradle.internal.tasks.databinding.DataBindingGenBaseClassesTask
import com.azizutku.movie.BuildPlugins
import org.gradle.api.Action
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.configurationcache.extensions.capitalized
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool

class AndroidFeatureConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
Expand Down Expand Up @@ -37,6 +42,26 @@ class AndroidFeatureConventionPlugin : Plugin<Project> {
add("implementation", libs.findBundle("androidx.room").get())
add("ksp", libs.findLibrary("room.compiler").get())
}
// This is a workaround for the issue where ViewBinding-generated classes are not considered as inputs to KSP.
// This arose during the KSP migration for Hilt.
// Refer: https://issuetracker.google.com/issues/301245705?pli=1
androidComponents {
onVariants(selector().all()) { variant ->
afterEvaluate {
project.tasks.getByName("ksp" + variant.name.capitalized() + "Kotlin") {
val dataBindingTask = project.tasks.getByName(
"dataBindingGenBaseClasses" + variant.name.capitalized()
) as? DataBindingGenBaseClassesTask
dataBindingTask?.let { task ->
(this as? AbstractKotlinCompileTool<*>)?.setSource(task.sourceOutFolder)
}
}
}
}
}
}
}
}

private fun Project.androidComponents(configure: Action<LibraryAndroidComponentsExtension>): Unit =
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("androidComponents", configure)
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,24 @@ import com.azizutku.movie.BuildPlugins
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.api.plugins.ExtensionAware
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.gradle.plugin.KaptExtension

class AndroidHiltConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply(BuildPlugins.HILT_PLUGIN)
apply(BuildPlugins.KOTLIN_KAPT)
apply(BuildPlugins.KSP)
}

val libs = extensions.getByType<VersionCatalogsExtension>().named("libs")
dependencies {
"implementation"(libs.findLibrary("hilt").get())
"kapt"(libs.findLibrary("hilt.compiler").get())
"kaptAndroidTest"(libs.findLibrary("hilt.compiler").get())
"kaptTest"(libs.findLibrary("hilt.compiler").get())
}
kapt {
correctErrorTypes = true
"ksp"(libs.findLibrary("hilt.compiler").get())
"kspAndroidTest"(libs.findLibrary("hilt.compiler").get())
"kspTest"(libs.findLibrary("hilt.compiler").get())
}
}
}
}

fun Project.kapt(block: KaptExtension.() -> Unit): Unit =
(this as ExtensionAware).extensions.configure("kapt", block)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ object BuildPlugins {
const val ANDROID_APPLICATION = "com.android.application"
const val KOTLIN_ANDROID = "kotlin-android"
const val ANDROID_LIBRARY = "com.android.library"
const val KOTLIN_KAPT = "kotlin-kapt"
const val HILT_PLUGIN = "dagger.hilt.android.plugin"
const val KOTLINX_SERIALIZATION = "kotlinx-serialization"
const val NAVIGATION_SAFEARGS = "androidx.navigation.safeargs.kotlin"
Expand Down

0 comments on commit 3c32b80

Please sign in to comment.