Skip to content

Commit

Permalink
Migrate anvil contribution merging to KSP (#902)
Browse files Browse the repository at this point in the history
**Background**

This PR migrates current kapt-based Anvil contribution merging to KSP
one.
Works with K2 🙂

**Changes**

- Replaced `flipper.anvil.kapt` plugin with `flipper.anvil.entrypoint`
- Upgraded Anvil to ZacSweers Anvil 0.3.3
- Upgraded `anvil-utils` to `0.3.0-beta01`. It supports ZacSweers Anvil
plugin.
- Introduced new `commonKsp` configuration to remove warnings about
usage of `ksp` configuration in KMP projects
- Use default kotlin hierarchy instead of specifying `dependsOn`
manually.
- Disabled warning about `expect/actual` classes being in Beta

**Test plan**

If it builds, it works

---------

Co-authored-by: Nikita Kulikov <[email protected]>
Co-authored-by: Roman Makeev <[email protected]>
3 people authored Oct 28, 2024
1 parent 8f293e5 commit 1e2564a
Showing 27 changed files with 87 additions and 133 deletions.
2 changes: 1 addition & 1 deletion build-logic/plugins/convention/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ dependencies {
implementation(libs.protobuf.gradle)
implementation(libs.grgit.gradle)
implementation(libs.kotlin.ksp.gradle)
implementation(libs.square.anvil.gradle)
implementation(libs.zacsweers.anvil.gradle)
implementation(libs.compose.multiplatform.gradle)
implementation(libs.compose.gradle)
implementation(libs.kotlin.jvm.gradle)
11 changes: 3 additions & 8 deletions build-logic/plugins/convention/src/main/kotlin/commonAndroid.kt
Original file line number Diff line number Diff line change
@@ -82,13 +82,6 @@ private fun BaseExtension.configureBuildFeatures() {
// TODO: Disable by default
// BuildConfig is java source code. Java and Kotlin at one time affect build speed.
buildFeatures.buildConfig = true
// Disable by default. ViewBinding needed only for few modules.
// No need to enable this feature for all modules.
buildFeatures.viewBinding = false
buildFeatures.aidl = false
buildFeatures.compose = false
buildFeatures.prefab = false
buildFeatures.renderScript = false
buildFeatures.resValues = false
buildFeatures.shaders = false
}
@@ -105,6 +98,8 @@ private fun Project.suppressOptIn() {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)

freeCompilerArgs.add("-Xexpect-actual-classes")

optIn.addAll(
"com.google.accompanist.pager.ExperimentalPagerApi",
"androidx.compose.ui.ExperimentalComposeUiApi",
@@ -115,7 +110,7 @@ private fun Project.suppressOptIn() {
"kotlin.time.ExperimentalTime",
"kotlin.RequiresOptIn",
"androidx.compose.animation.ExperimentalAnimationApi",
"com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi", // ktlint-disable max-line-length
"com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi",
"androidx.compose.foundation.layout.ExperimentalLayoutApi"
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import org.gradle.api.Project

fun Project.includeCommonKspConfigurationTo(
vararg toConfigurations: String,
) {
pluginManager.withPlugin("com.google.devtools.ksp") {
val commonKsp = configurations.create("commonKsp")
toConfigurations.forEach { configurationName ->
configurations.getByName(configurationName).extendsFrom(commonKsp)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import com.android.build.gradle.BaseExtension
import com.flipperdevices.buildlogic.ApkConfig
import com.flipperdevices.buildlogic.ApkConfig.IS_SENTRY_PUBLISH
@@ -54,3 +53,5 @@ configure<SentryPluginExtension> {

autoInstallation.enabled.set(false)
}

includeCommonKspConfigurationTo("ksp")
Original file line number Diff line number Diff line change
@@ -9,3 +9,5 @@ plugins {
configure<BaseExtension> {
commonAndroid(project)
}

includeCommonKspConfigurationTo("ksp")
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import org.gradle.kotlin.dsl.dependencies

plugins {
id("flipper.multiplatform")
id("com.squareup.anvil")
@@ -21,7 +19,7 @@ kotlin {

commonMain.dependencies {
implementation(libs.dagger)
implementation(libs.square.anvil.annotations)
implementation(libs.zacsweers.anvil.annotations)
implementation(libs.anvil.utils.annotations)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import com.google.devtools.ksp.gradle.KspExtension

plugins {
id("com.squareup.anvil")
}

anvil {
useKsp(
contributesAndFactoryGeneration = true,
componentMerging = true,
)
}

the<KspExtension>().apply {
arg("anvil.ksp.generateShims", "false")
}

dependencies {
"implementation"(libs.dagger)
"implementation"(libs.anvil.utils.annotations)
"commonKsp"(libs.anvil.utils.compiler)
}
Original file line number Diff line number Diff line change
@@ -7,12 +7,8 @@ anvil {
generateDaggerFactories = true
}

pluginManager.withPlugin("kotlin-kapt") {
error("Please, use `id(\"flipper.anvil.kapt\")` instead")
}

dependencies {
"implementation"(libs.dagger)
"implementation"(libs.anvil.utils.annotations)
"ksp"(libs.anvil.utils.compiler)
"commonKsp"(libs.anvil.utils.compiler)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import com.android.build.gradle.BaseExtension
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
@@ -11,6 +12,7 @@ configure<BaseExtension> {
commonAndroid(project)
}

@OptIn(ExperimentalKotlinGradlePluginApi::class)
kotlin {
androidTarget {
compilerOptions {
@@ -19,51 +21,14 @@ kotlin {
}
jvm("desktop")

sourceSets {
val commonMain by getting

/**
* We shouldn't create sources, which is named as original targets sourcesets.
*
* As an example - jvm() target will create sourceSet jvmMain - and we would have conflicts
* with our create jvmMain sourceSet
*
* This is the reason to name it `jvmSharedMain`
*/
val jvmSharedMain by creating {
dependsOn(commonMain)
}

val androidMain by getting {
dependsOn(jvmSharedMain)
}

val desktopMain by getting {
dependsOn(jvmSharedMain)
}

androidMain.dependencies {
}
commonMain.dependencies {
}
desktopMain.dependencies {
}

// Testing
val commonTest by getting

val jvmSharedTest by creating {
dependsOn(commonTest)
}

@Suppress("UnusedPrivateProperty")
val androidUnitTest by getting {
dependsOn(jvmSharedTest)
}

@Suppress("UnusedPrivateProperty")
val desktopTest by getting {
dependsOn(jvmSharedTest)
applyDefaultHierarchyTemplate {
common {
group("jvmShared") {
withAndroidTarget()
withJvm()
}
}
}
}

includeCommonKspConfigurationTo("kspAndroid", "kspDesktop")
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ plugins {
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.kotlin.ksp) apply false
alias(libs.plugins.square.anvil) apply false
alias(libs.plugins.zacsweers.anvil) apply false
alias(libs.plugins.protobuf) apply false
alias(libs.plugins.google.gms) apply false
alias(libs.plugins.android.test) apply false
5 changes: 2 additions & 3 deletions components/bridge/connection/sample/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
plugins {
id("flipper.android-app")
id("flipper.anvil.kapt")
id("kotlin-kapt")
id("flipper.anvil.entrypoint")
id("kotlinx-serialization")
}

@@ -98,7 +97,7 @@ dependencies {

// Dagger deps
implementation(libs.dagger)
kapt(libs.dagger.kapt)
commonKsp(libs.dagger.compiler)

implementation(libs.timber)

Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ package com.flipperdevices.bridge.connection

import android.app.Application
import com.flipperdevices.bridge.connection.di.AppComponent
import com.flipperdevices.bridge.connection.di.DaggerAppComponent
import com.flipperdevices.bridge.connection.di.DaggerMergedAppComponent
import com.flipperdevices.core.di.ApplicationParams
import com.flipperdevices.core.di.ComponentHolder
import timber.log.Timber
@@ -14,7 +14,7 @@ class ConnectionTestApplication : Application() {

override fun onCreate() {
super.onCreate()
appComponent = DaggerAppComponent.factory()
appComponent = DaggerMergedAppComponent.factory()
.create(
context = this,
application = this,
Original file line number Diff line number Diff line change
@@ -7,15 +7,14 @@ import com.flipperdevices.core.di.AppGraph
import com.flipperdevices.core.di.ApplicationParams
import com.squareup.anvil.annotations.MergeComponent
import dagger.BindsInstance
import dagger.Component
import javax.inject.Singleton

@Singleton
@MergeComponent(AppGraph::class)
interface AppComponent {
fun inject(activity: ConnectionTestActivity)

@Component.Factory
@MergeComponent.Factory
interface Factory {
fun create(
@BindsInstance context: Context,
2 changes: 1 addition & 1 deletion components/bridge/dao/impl/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ dependencies {

implementation(libs.room.runtime)
implementation(libs.room.ktx)
ksp(libs.room.ksp)
commonKsp(libs.room.ksp)

implementation(libs.kotlin.immutable.collections)
implementation(libs.okio)
5 changes: 2 additions & 3 deletions components/nfceditor/sample/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
plugins {
id("flipper.android-app")
id("flipper.anvil.kapt")
id("kotlin-kapt")
id("flipper.anvil.entrypoint")
}

android.namespace = "com.flipperdevices.nfceditor.sample"
@@ -47,7 +46,7 @@ dependencies {

// Dagger deps
implementation(libs.dagger)
kapt(libs.dagger.kapt)
commonKsp(libs.dagger.compiler)

implementation(libs.timber)
implementation(libs.kotlin.immutable.collections)
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ package com.flipperdevices.nfceditor.sample
import android.app.Application
import com.flipperdevices.core.di.ApplicationParams
import com.flipperdevices.nfceditor.sample.di.AppComponent
import com.flipperdevices.nfceditor.sample.di.DaggerAppComponent
import com.flipperdevices.nfceditor.sample.di.DaggerMergedAppComponent
import timber.log.Timber

class NfcEditorApplication : Application() {
@@ -13,7 +13,7 @@ class NfcEditorApplication : Application() {

override fun onCreate() {
super.onCreate()
appComponent = DaggerAppComponent.factory()
appComponent = DaggerMergedAppComponent.factory()
.create(
context = this,
application = this,
Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@ import com.flipperdevices.nfceditor.sample.NfcEditorActivity
import com.flipperdevices.shake2report.api.Shake2ReportApi
import com.squareup.anvil.annotations.MergeComponent
import dagger.BindsInstance
import dagger.Component
import javax.inject.Provider
import javax.inject.Singleton

@@ -18,7 +17,7 @@ interface AppComponent {
val shake2report: Provider<Shake2ReportApi>
fun inject(activity: NfcEditorActivity)

@Component.Factory
@MergeComponent.Factory
interface Factory {
fun create(
@BindsInstance context: Context,
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ androidDependencies {
implementation(projects.components.bridge.rpc.api)

implementation(libs.dagger)
implementation(libs.square.anvil.annotations)
implementation(libs.zacsweers.anvil.annotations)
implementation(libs.ktor.client)
implementation(libs.ktor.serialization)
implementation(libs.ktor.logging)
2 changes: 1 addition & 1 deletion components/remote-controls/api-backend/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@ commonDependencies {
implementation(projects.components.remoteControls.coreModel)

implementation(libs.dagger)
implementation(libs.square.anvil.annotations)
implementation(libs.zacsweers.anvil.annotations)
implementation(libs.ktor.client)
implementation(libs.ktor.serialization)
implementation(libs.ktor.logging)
18 changes: 9 additions & 9 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -5,8 +5,8 @@ kotlin-immutable-collections = "0.3.8" # https://github.com/Kotlin/kotlinx.colle
kotlin-datetime = "0.6.1" # https://github.com/Kotlin/kotlinx-datetime/releases
kotlinx = "1.9.0" # https://github.com/Kotlin/kotlinx.coroutines/releases
ksp = "2.0.21-1.0.25" # https://github.com/google/ksp/releases
anvil = "2.5.0-beta11" # https://github.com/square/anvil/releases
anvil-utils = "0.2.1-beta01" # https://github.com/IlyaGulya/anvil-utils/releases
anvil = "0.3.3" # https://github.com/ZacSweers/anvil/releases
anvil-utils = "0.3.0-beta01" # https://github.com/IlyaGulya/anvil-utils/releases
android-gradle = "8.7.0" # https://developer.android.com/studio/releases/gradle-plugin
protobuf = "4.28.2" # https://github.com/protocolbuffers/protobuf/releases
protobuf-gradle = "0.9.4" # https://github.com/google/protobuf-gradle-plugin/releases
@@ -184,17 +184,17 @@ room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }

# Dependency Injection
dagger = { module = "com.google.dagger:dagger", version.ref = "dagger" }
dagger-kapt = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }
dagger-compiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }

anvil-utils-annotations = { module = "me.gulya.anvil:annotations", version.ref = "anvil-utils" }
anvil-utils-compiler = { module = "me.gulya.anvil:compiler", version.ref = "anvil-utils" }

# Dependency Injection - Anvil
square-anvil-annotations = { module = "com.squareup.anvil:annotations", version.ref = "anvil" }
square-anvil-compiler-api = { module = "com.squareup.anvil:compiler-api", version.ref = "anvil" }
square-anvil-compiler-core = { module = "com.squareup.anvil:compiler", version.ref = "anvil" }
square-anvil-compiler-utils = { module = "com.squareup.anvil:compiler-utils", version.ref = "anvil" }
square-anvil-gradle = { module = "com.squareup.anvil:gradle-plugin", version.ref = "anvil" }
zacsweers-anvil-annotations = { module = "dev.zacsweers.anvil:annotations", version.ref = "anvil" }
zacsweers-anvil-compiler-api = { module = "dev.zacsweers.anvil:compiler-api", version.ref = "anvil" }
zacsweers-anvil-compiler-core = { module = "dev.zacsweers.anvil:compiler", version.ref = "anvil" }
zacsweers-anvil-compiler-utils = { module = "dev.zacsweers.anvil:compiler-utils", version.ref = "anvil" }
zacsweers-anvil-gradle = { module = "dev.zacsweers.anvil:gradle-plugin", version.ref = "anvil" }

# Bug report dependencies
timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }
@@ -301,7 +301,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-ge
kotlin-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin-general" }
protobuf = { id = "com.google.protobuf", version.ref = "protobuf-gradle" }
square-anvil = { id = "com.squareup.anvil", version.ref = "anvil" }
zacsweers-anvil = { id = "dev.zacsweers.anvil", version.ref = "anvil" }
google-gms = { id = "com.google.gms.google-services", version.ref = "google-gms-gradle" }
baselineprofile = { id = "androidx.baselineprofile", version.ref = "baselineprofile" }
compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin-general" }
5 changes: 2 additions & 3 deletions instances/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -6,8 +6,7 @@ import com.flipperdevices.buildlogic.SourceInstall

plugins {
id("flipper.android-app")
id("flipper.anvil.kapt")
id("kotlin-kapt")
id("flipper.anvil.entrypoint")
alias(libs.plugins.google.gms)
alias(libs.plugins.baselineprofile)
}
@@ -277,7 +276,7 @@ dependencies {
implementation(libs.ktx.activity)

implementation(libs.dagger)
kapt(libs.dagger.kapt)
commonKsp(libs.dagger.compiler)

implementation(libs.timber)

Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ import android.app.Application
import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.decode.SvgDecoder
import com.flipperdevices.app.di.DaggerAppComponent
import com.flipperdevices.app.di.DaggerMergedAppComponent
import com.flipperdevices.app.di.MainComponent
import com.flipperdevices.core.activityholder.CurrentActivityHolder
import com.flipperdevices.core.di.ApplicationParams
@@ -28,7 +28,7 @@ class FlipperApplication : Application(), ImageLoaderFactory, LogTagProvider {

CurrentActivityHolder.register(this)

val appComponent = DaggerAppComponent.factory()
val appComponent = DaggerMergedAppComponent.factory()
.create(
context = this,
application = this,
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@ import com.flipperdevices.core.di.AppGraph
import com.flipperdevices.core.di.ApplicationParams
import com.squareup.anvil.annotations.MergeComponent
import dagger.BindsInstance
import dagger.Component
import kotlinx.coroutines.CoroutineScope
import javax.inject.Singleton

@@ -19,7 +18,7 @@ import javax.inject.Singleton
@Singleton
@MergeComponent(AppGraph::class)
interface AppComponent {
@Component.Factory
@MergeComponent.Factory
interface Factory {
fun create(
@BindsInstance context: Context,
5 changes: 2 additions & 3 deletions instances/wearable/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
plugins {
id("flipper.android-app")
id("flipper.anvil.kapt")
id("kotlin-kapt")
id("flipper.anvil.entrypoint")
}

android.namespace = "com.flipperdevices.wearable"
@@ -68,5 +67,5 @@ dependencies {

// Dagger deps
implementation(libs.dagger)
kapt(libs.dagger.kapt)
commonKsp(libs.dagger.compiler)
}
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ import android.app.Application
import com.flipperdevices.core.activityholder.CurrentActivityHolder
import com.flipperdevices.core.di.ApplicationParams
import com.flipperdevices.core.di.ComponentHolder
import com.flipperdevices.wearable.di.DaggerAppComponent
import com.flipperdevices.wearable.di.DaggerMergedAppComponent
import com.flipperdevices.wearable.di.WearableComponent
import timber.log.Timber

@@ -14,7 +14,7 @@ class FlipperApplication : Application() {

CurrentActivityHolder.register(this)

val appComponent = DaggerAppComponent.factory()
val appComponent = DaggerMergedAppComponent.factory()
.create(
context = this,
application = this,
Original file line number Diff line number Diff line change
@@ -6,13 +6,12 @@ import com.flipperdevices.core.di.AppGraph
import com.flipperdevices.core.di.ApplicationParams
import com.squareup.anvil.annotations.MergeComponent
import dagger.BindsInstance
import dagger.Component
import javax.inject.Singleton

@Singleton
@MergeComponent(AppGraph::class)
interface AppComponent {
@Component.Factory
@MergeComponent.Factory
interface Factory {
fun create(
@BindsInstance context: Context,

0 comments on commit 1e2564a

Please sign in to comment.