From fd0deff656e86b4b68e38055a52bad9ed3a9697b Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Tue, 6 Jan 2026 20:14:03 +0000 Subject: [PATCH] Fix detection of android base plugin usage --- .../ksp/gradle/AndroidPluginIntegration.kt | 12 +++++++--- .../devtools/ksp/gradle/KspConfigurations.kt | 17 +++++++++---- .../devtools/ksp/gradle/KspSubplugin.kt | 24 ++++++++++++------- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt index c3562f05a2..5995425d3a 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt @@ -24,10 +24,12 @@ import com.android.build.api.variant.impl.DirectoryEntry import com.android.build.api.variant.impl.FlatSourceDirectoriesForJavaImpl import com.android.build.api.variant.impl.FlatSourceDirectoriesImpl import com.android.build.gradle.BaseExtension +import com.android.build.gradle.api.AndroidBasePlugin import com.android.build.gradle.api.SourceKind import com.google.devtools.ksp.gradle.utils.canUseAddGeneratedSourceDirectoriesApi import com.google.devtools.ksp.gradle.utils.canUseInternalKspApis import com.google.devtools.ksp.gradle.utils.isAgpBuiltInKotlinUsed +import com.google.devtools.ksp.gradle.utils.useLegacyVariantApi import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.file.Directory @@ -48,9 +50,13 @@ import java.util.concurrent.Callable object AndroidPluginIntegration { fun forEachAndroidSourceSet(project: Project, onSourceSet: (String) -> Unit) { - project.pluginManager.withPlugin("com.android.base") { - // for android modules, we need a configuration per source set - decorateAndroidExtension(project, onSourceSet) + try { + project.plugins.withType(AndroidBasePlugin::class.java).configureEach { + // for android modules, we need a configuration per source set + decorateAndroidExtension(project, onSourceSet) + } + } catch (e: Throwable) { + // Android plugin not found, ignore } } diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt index e5340d3e76..01ab8eb8c2 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.gradle +import com.android.build.gradle.api.AndroidBasePlugin import com.google.devtools.ksp.gradle.utils.kotlinSourceSetsObservable import com.google.devtools.ksp.gradle.utils.useLegacyVariantApi import org.gradle.api.InvalidUserCodeException @@ -104,12 +105,18 @@ class KspConfigurations(private val project: Project) { createAndroidSourceSetConfigurations(project, kotlinTarget = null) } - project.pluginManager.withPlugin("com.android.base") { - if (!project.useLegacyVariantApi()) { - val androidComponents = - project.extensions.findByType(com.android.build.api.variant.AndroidComponentsExtension::class.java) - androidComponents?.addKspConfigurations(useGlobalConfiguration = allowAllTargetConfiguration) + try { + project.plugins.withType(AndroidBasePlugin::class.java).configureEach { + if (!project.useLegacyVariantApi()) { + val androidComponents = + project.extensions.findByType( + com.android.build.api.variant.AndroidComponentsExtension::class.java + ) + androidComponents?.addKspConfigurations(useGlobalConfiguration = allowAllTargetConfiguration) + } } + } catch (e: Throwable) { + // Android plugin not found, ignore } } diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt index cfe848e108..7892ccb3d8 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt @@ -17,7 +17,9 @@ package com.google.devtools.ksp.gradle import com.android.build.api.variant.Component +import com.android.build.gradle.api.AndroidBasePlugin import com.google.devtools.ksp.KspExperimental +import com.google.devtools.ksp.gradle.AndroidPluginIntegration.decorateAndroidExtension import com.google.devtools.ksp.gradle.model.builder.KspModelBuilder import com.google.devtools.ksp.gradle.utils.canUseGeneratedKotlinApi import com.google.devtools.ksp.gradle.utils.canUseInternalKspApis @@ -115,18 +117,22 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool kspConfigurations = KspConfigurations(target) registry.register(KspModelBuilder()) - target.plugins.withId("com.android.base") { - val androidComponents = - target.extensions.findByType(com.android.build.api.variant.AndroidComponentsExtension::class.java)!! - - val selector = androidComponents.selector().all() - androidComponents.onVariants(selector) { variant -> - for (component in variant.components) { - androidComponentCache.computeIfAbsent(component.name) { - component + try { + target.plugins.withType(AndroidBasePlugin::class.java).configureEach { + val androidComponents = + target.extensions.findByType(com.android.build.api.variant.AndroidComponentsExtension::class.java)!! + + val selector = androidComponents.selector().all() + androidComponents.onVariants(selector) { variant -> + for (component in variant.components) { + androidComponentCache.computeIfAbsent(component.name) { + component + } } } } + } catch (e: Throwable) { + // Android plugin not found, ignore } }