diff --git a/gradle-plugin/api/gradle-plugin.api b/gradle-plugin/api/gradle-plugin.api
index 855c4cee7..6e0be05d0 100644
--- a/gradle-plugin/api/gradle-plugin.api
+++ b/gradle-plugin/api/gradle-plugin.api
@@ -154,6 +154,10 @@ public abstract class kotlinx/rpc/protoc/DefaultProtoTask : org/gradle/api/Defau
public final fun getProperties ()Lkotlinx/rpc/protoc/ProtoTask$Properties;
}
+public abstract class kotlinx/rpc/protoc/ExtractDependencyProtoImports : org/gradle/api/tasks/Sync, kotlinx/rpc/protoc/ProtoTask {
+ public fun getProperties ()Lkotlinx/rpc/protoc/ProtoTask$Properties;
+}
+
public final class kotlinx/rpc/protoc/PluginJarsKt {
public static final fun getGrpcKotlinMultiplatformProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
public static final fun getKotlinMultiplatformProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
@@ -190,7 +194,9 @@ public final class kotlinx/rpc/protoc/ProtoSourceSetKt {
public static final fun getProto (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;)Lkotlinx/rpc/protoc/ProtoSourceSet;
public static final fun proto (Lorg/gradle/api/NamedDomainObjectProvider;Lorg/gradle/api/Action;)V
public static final fun proto (Lorg/gradle/api/tasks/SourceSet;Lorg/gradle/api/Action;)V
+ public static final fun proto (Lorg/jetbrains/kotlin/gradle/plugin/KotlinDependencyHandler;Ljava/lang/Object;)Lorg/gradle/api/artifacts/Dependency;
public static final fun proto (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;Lorg/gradle/api/Action;)V
+ public static final fun protoImport (Lorg/jetbrains/kotlin/gradle/plugin/KotlinDependencyHandler;Ljava/lang/Object;)Lorg/gradle/api/artifacts/Dependency;
public static final fun proto_kotlin (Lorg/gradle/api/NamedDomainObjectProvider;)Lorg/gradle/api/provider/Provider;
public static final fun proto_kotlin (Lorg/gradle/api/NamedDomainObjectProvider;Lorg/gradle/api/Action;)V
}
diff --git a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtoSourceSet.kt b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtoSourceSet.kt
index a5f3623d2..4f2f0c3eb 100644
--- a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtoSourceSet.kt
+++ b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtoSourceSet.kt
@@ -6,6 +6,7 @@ package kotlinx.rpc.protoc
import kotlinx.rpc.buf.tasks.BufGenerateTask
import kotlinx.rpc.rpcExtension
+import kotlinx.rpc.util.extendsFromLazy
import kotlinx.rpc.util.findOrCreate
import kotlinx.rpc.util.withLegacyAndroid
import kotlinx.rpc.util.withAndroidSourceSets
@@ -18,7 +19,9 @@ import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.NamedDomainObjectProvider
import org.gradle.api.Project
+import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
@@ -35,6 +38,7 @@ import java.io.File
import java.util.*
import java.util.function.Consumer
import javax.inject.Inject
+import kotlin.contracts.ExperimentalContracts
@Suppress("UNCHECKED_CAST")
internal val Project.protoSourceSets: ProtoSourceSets
@@ -61,6 +65,7 @@ internal fun Project.findOrCreateProtoSourceSets(): NamedDomainObjectContainer
= project.objects.property()
+ // Proto dependency configuration for this source set, created when protoc is activated.
+ // Allows users to declare proto dependencies via `dependencies { Proto("...") }`.
+ // Resolved artifacts are extracted and included in code generation.
+ internal val protoConfiguration: Configuration
+
+ // Proto import dependency configuration for this source set, created when protoc is activated.
+ // Allows users to declare proto import dependencies via `dependencies { ProtoImport("...") }`.
+ // Resolved artifacts are extracted and available as imports, but not for code generation.
+ private val protoImportConfigurationNew: Configuration
+
+ // Configurations attached lazily via importsFrom(Provider<...>) / importsAllFrom that cannot
+ // be wired through Configuration.extendsFrom: Gradle 8.8–9.3 has no Provider-based overload at
+ // all, and no Gradle version exposes a Provider> overload. Their files are
+ // merged into [protoImportFiles] at the consumer site, so resolution still sees them.
+ private val protoImportConfigurationLegacyList: ListProperty = project.objects.listProperty()
+
+ // Aggregated proto-import inputs for tasks: declared dependencies plus the transitive closure
+ // built up via Configuration.extendsFrom, plus everything stored in protoImportConfigOverflow.
+ internal val protoImportConfiguration: FileCollection by lazy {
+ project.files(protoImportConfigurationNew, protoImportConfigurationLegacyList)
+ }
+
+ init {
+ val protoConfigName = protoConfigurationName(name)
+ protoConfiguration = project.configurations.maybeCreate(protoConfigName).apply {
+ isCanBeResolved = true
+ isCanBeConsumed = false
+ description = "Proto file dependencies for source set '$name' (code generation)"
+ }
+
+ val protoImportConfigName = protoImportConfigurationName(name)
+ protoImportConfigurationNew = project.configurations.maybeCreate(protoImportConfigName).apply {
+ isCanBeResolved = true
+ isCanBeConsumed = false
+ description = "Proto file import dependencies for source set '$name' (imports only)"
+ }
+ }
+
override val imports: SetProperty = project.objects.setProperty()
override val fileImports: ConfigurableFileCollection = project.objects.fileCollection()
- override fun importsFrom(protoSourceSet: ProtoSourceSet) {
+ override fun importsFrom(rawProtoSourceSet: ProtoSourceSet) {
+ val protoSourceSet = rawProtoSourceSet.asDefault("extend")
+
imports.add(protoSourceSet.checkSelfImport())
imports.addAll(protoSourceSet.imports.checkSelfImport())
+
+ protoImportConfigurationNew.extendsFrom(protoSourceSet.protoImportConfigurationNew)
+ protoImportConfigurationLegacyList.addAll(protoSourceSet.protoImportConfigurationLegacyList)
}
- override fun importsFrom(protoSourceSet: Provider) {
+ override fun importsFrom(rawProtoSourceSet: Provider) {
+ val protoSourceSet = rawProtoSourceSet.asDefault("extend")
+
imports.add(protoSourceSet.checkSelfImport())
imports.addAll(protoSourceSet.flatMap { it.imports.checkSelfImport() })
+
+ protoImportConfigurationNew.extendsFromLazy(
+ legacyList = protoImportConfigurationLegacyList,
+ provider = protoSourceSet.map { it.protoImportConfigurationNew },
+ )
+ protoImportConfigurationLegacyList.addAll(protoSourceSet.flatMap { it.protoImportConfigurationLegacyList })
}
- override fun importsAllFrom(protoSourceSets: Provider>) {
+ override fun importsAllFrom(rawProtoSourceSets: Provider>) {
+ val protoSourceSets = rawProtoSourceSets.asDefault("extend")
+
imports.addAll(protoSourceSets.checkSelfImport())
imports.addAll(protoSourceSets.map { list -> list.flatMap { it.imports.checkSelfImport().get() } })
- }
- override fun importsFrom(protoSourceSet: NamedDomainObjectProvider) {
- imports.add(protoSourceSet.checkSelfImport())
- imports.addAll(protoSourceSet.flatMap { it.imports.checkSelfImport() })
+ protoImportConfigurationLegacyList.addAll(
+ protoSourceSets.map { list -> list.map { it.protoImportConfigurationNew } },
+ )
+ protoImportConfigurationLegacyList.addAll(
+ protoSourceSets.map { list -> list.flatMap { it.protoImportConfigurationLegacyList.get() } },
+ )
}
private val extendsFrom: MutableSet = mutableSetOf()
- override fun extendsFrom(protoSourceSet: ProtoSourceSet) {
- if (extendsFrom.contains(protoSourceSet)) {
+ override fun extendsFrom(rawProtoSourceSet: ProtoSourceSet) {
+ if (extendsFrom.contains(rawProtoSourceSet)) {
return
}
- require(this != protoSourceSet) {
+ require(this != rawProtoSourceSet) {
"$name proto source set cannot extend from self"
}
- require(protoSourceSet is DefaultProtoSourceSet) {
- "$name proto source set can only extend from other default proto source sets." +
- "${protoSourceSet.name} is not a ${DefaultProtoSourceSet::class.simpleName}"
- }
+ val protoSourceSet = rawProtoSourceSet.asDefault("extend")
extendsFrom += protoSourceSet
@@ -196,10 +253,15 @@ internal open class DefaultProtoSourceSet(
imports.addAll(protoSourceSet.imports.checkSelfImport())
plugins.addAll(protoSourceSet.plugins)
+
+ // Wire Gradle configuration inheritance for proto dependency configurations
+ protoConfiguration.extendsFrom(protoSourceSet.protoConfiguration)
+ protoImportConfigurationNew.extendsFrom(protoSourceSet.protoImportConfigurationNew)
+ protoImportConfigurationLegacyList.addAll(protoSourceSet.protoImportConfigurationLegacyList)
}
@JvmName("checkSelfImport_provider")
- private fun Provider.checkSelfImport() = map {
+ private fun Provider.checkSelfImport() = map {
it.checkSelfImport()
}
@@ -208,7 +270,7 @@ internal open class DefaultProtoSourceSet(
}
@JvmName("checkSelfImport_provider_list")
- private fun Provider>.checkSelfImport() = map { set ->
+ private fun Provider>.checkSelfImport() = map { set ->
set.onEach { it.checkSelfImport() }
}
@@ -220,6 +282,25 @@ internal open class DefaultProtoSourceSet(
return this
}
+ private fun Provider.asDefault(action: String): Provider {
+ return map { it.asDefault(action) }
+ }
+
+ @JvmName("asDefault_provider_list")
+ private fun Provider>.asDefault(action: String): Provider> {
+ return map { lists -> lists.map { it.asDefault(action) } }
+ }
+
+ @OptIn(ExperimentalContracts::class)
+ private fun ProtoSourceSet.asDefault(action: String): DefaultProtoSourceSet {
+ require(this is DefaultProtoSourceSet) {
+ "$name proto source set can only $action from other default proto source sets." +
+ "${this.name} is not a ${DefaultProtoSourceSet::class.simpleName}"
+ }
+
+ return this
+ }
+
// Java default methods
override fun forEach(action: Consumer?) {
@@ -240,7 +321,6 @@ internal fun Project.createProtoExtensions() {
val protoSourceSet = container.maybeCreate(languageSourceSetName) as DefaultProtoSourceSet
languageSourceSet?.let { protoSourceSet.languageSourceSets.add(it) }
-
return protoSourceSet
}
@@ -289,3 +369,13 @@ internal object PlatformOption {
const val COMMON = "common"
const val WASM = "wasm"
}
+
+internal fun protoConfigurationName(sourceSetName: String): String {
+ if (sourceSetName == "main") return "proto"
+ return "${sourceSetName}Proto"
+}
+
+internal fun protoImportConfigurationName(sourceSetName: String): String {
+ if (sourceSetName == "main") return "protoImport"
+ return "${sourceSetName}ProtoImport"
+}
diff --git a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtocExtension.kt b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtocExtension.kt
index 73cfff18d..82a6c5899 100644
--- a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtocExtension.kt
+++ b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtocExtension.kt
@@ -243,12 +243,43 @@ internal open class DefaultProtocExtension @Inject constructor(
dependsOn(processProtoTask)
}
+ val extractProtoTask = project.registerExtractDependencyProtoTask(
+ taskName = "extractProto${capitalName}",
+ destination = buildSourceSetsDir.resolve("protoExtracted"),
+ dependencyArchives = protoSourceSet.protoConfiguration,
+ properties = properties,
+ )
+
+ val extractProtoImportTask = project.registerExtractDependencyProtoTask(
+ taskName = "extractProtoImport${capitalName}",
+ destination = buildSourceSetsDir.resolve("importExtracted"),
+ dependencyArchives = protoSourceSet.protoImportConfiguration,
+ properties = properties,
+ )
+
+ // Wire extracted protos into the existing process tasks
+ processProtoTask.configure {
+ from(extractProtoTask.map { it.destinationDir })
+ dependsOn(extractProtoTask)
+ }
+
+ processImportProtoTask.configure {
+ from(extractProtoImportTask.map { it.destinationDir })
+ dependsOn(extractProtoImportTask)
+ }
+
+ val hasProtoImports = protoSourceSet.imports.map { it.isNotEmpty() || !protoSourceSet.fileImports.isEmpty }
+ val hasProtoImportConfig = project.provider {
+ !protoSourceSet.protoImportConfiguration.isEmpty
+ }
+ val withImport = hasProtoImports.zip(hasProtoImportConfig) { a, b -> a || b }
+
val generateBufYamlTask = project.registerGenerateBufYamlTask(
name = capitalName,
buildSourceSetsDir = buildSourceSetsDir,
buildSourceSetsProtoDir = buildSourceSetsProtoDir,
buildSourceSetsImportDir = buildSourceSetsImportDir,
- withImport = protoSourceSet.imports.map { it.isNotEmpty() || !protoSourceSet.fileImports.isEmpty },
+ withImport = withImport,
properties = properties,
) {
dependsOn(processProtoTask)
@@ -295,6 +326,8 @@ internal open class DefaultProtocExtension @Inject constructor(
dependsOn(generateBufYamlTask)
dependsOn(processProtoTask)
dependsOn(processImportProtoTask)
+ dependsOn(extractProtoTask)
+ dependsOn(extractProtoImportTask)
val dependencies = project.provider {
protoSourceSet.getDependsOnTasksOf(project.protoSourceSets).mapNotNull { it.generateTask.orNull }
@@ -322,6 +355,8 @@ internal open class DefaultProtocExtension @Inject constructor(
generateBufGenYamlTask = generateBufGenYamlTask,
processProtoTask = processProtoTask,
processImportProtoTask = processImportProtoTask,
+ extractProtoTask = extractProtoTask,
+ extractProtoImportTask = extractProtoImportTask,
sourceSetsProtoDirFileTree = sourceSetsProtoDirFileTree,
properties = properties,
) {
@@ -450,6 +485,8 @@ internal open class DefaultProtocExtension @Inject constructor(
generateBufGenYamlTask: TaskProvider,
processProtoTask: TaskProvider,
processImportProtoTask: TaskProvider,
+ extractProtoTask: TaskProvider,
+ extractProtoImportTask: TaskProvider,
sourceSetsProtoDirFileTree: ConfigurableFileTree,
properties: ProtoTask.Properties,
configure: BufExecTask.() -> Unit,
@@ -473,6 +510,8 @@ internal open class DefaultProtocExtension @Inject constructor(
dependsOn(generateBufGenYamlTask)
dependsOn(processProtoTask)
dependsOn(processImportProtoTask)
+ dependsOn(extractProtoTask)
+ dependsOn(extractProtoImportTask)
val dependencies = project.provider {
protoSourceSet.getDependsOnTasksOf(project.protoSourceSets).map { dependency ->
diff --git a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProcessProtoFiles.kt b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProcessProtoFiles.kt
index 493d91b27..02bcdf2a4 100644
--- a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProcessProtoFiles.kt
+++ b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProcessProtoFiles.kt
@@ -5,8 +5,10 @@
package kotlinx.rpc.protoc
import org.gradle.api.Project
+import org.gradle.api.file.ArchiveOperations
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DuplicatesStrategy
+import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Internal
@@ -90,3 +92,52 @@ internal fun Project.registerProcessProtoFilesImportsTask(
return task
}
+
+/**
+ * Extract proto files from dependency archives (JARs, ZIPs).
+ *
+ * Registered automatically when proto dependency configurations are used.
+ */
+public abstract class ExtractDependencyProtoImports @Inject internal constructor(
+ @get:Internal
+ override val properties: ProtoTask.Properties,
+) : Sync(), ProtoTask {
+ @get:Inject
+ internal abstract val archiveOperations: ArchiveOperations
+
+ init {
+ group = PROTO_GROUP
+ }
+}
+
+internal fun Project.registerExtractDependencyProtoTask(
+ taskName: String,
+ destination: File,
+ dependencyArchives: FileCollection,
+ properties: ProtoTask.Properties,
+ configure: ExtractDependencyProtoImports.() -> Unit = {},
+): TaskProvider {
+ val task = tasks.register(
+ taskName,
+ ExtractDependencyProtoImports::class,
+ properties,
+ )
+
+ task.configure {
+ duplicatesStrategy = DuplicatesStrategy.WARN
+
+ from(dependencyArchives.elements.map { elements ->
+ elements.map { element ->
+ archiveOperations.zipTree(element.asFile).matching {
+ include("**/*.proto")
+ }
+ }
+ })
+
+ into(destination)
+
+ configure()
+ }
+
+ return task
+}
diff --git a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProtoSourceSet.kt b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProtoSourceSet.kt
index 0080628e3..27e929e86 100644
--- a/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProtoSourceSet.kt
+++ b/gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/ProtoSourceSet.kt
@@ -5,14 +5,17 @@
package kotlinx.rpc.protoc
import org.gradle.api.Action
+import org.gradle.api.Named
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.NamedDomainObjectProvider
+import org.gradle.api.artifacts.Dependency
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty
import org.gradle.api.tasks.SourceSet
+import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
public typealias ProtoSourceSets = NamedDomainObjectContainer
@@ -204,23 +207,6 @@ public sealed interface ProtoSourceSet : SourceDirectorySet {
*/
public fun importsFrom(protoSourceSet: Provider)
- /**
- * Proto files from [protoSourceSet] will be available as import, but will not be used for code generation.
- *
- * Example:
- * ```kotlin
- * kotlin.sourceSets {
- * val someProto = create("someProto")
- * commonMain {
- * proto {
- * importsFrom(protoSourceSets.getByName("someProto"))
- * }
- * }
- * }
- * ```
- */
- public fun importsFrom(protoSourceSet: NamedDomainObjectProvider)
-
/**
* Proto files from [protoSourceSets] will be available as import, but will not be used for code generation.
*
@@ -344,3 +330,66 @@ public fun NamedDomainObjectProvider.proto(action: Action${suffix}(\"...\") } syntax instead."
+ )
+
+ return if (sourceSetName == "main") {
+ suffix.replaceFirstChar { it.lowercase() }
+ } else {
+ "$sourceSetName$suffix"
+ }
+}
diff --git a/gradle-plugin/src/main/kotlin/kotlinx/rpc/util/ConfigurationCompat.kt b/gradle-plugin/src/main/kotlin/kotlinx/rpc/util/ConfigurationCompat.kt
new file mode 100644
index 000000000..4d437560a
--- /dev/null
+++ b/gradle-plugin/src/main/kotlin/kotlinx/rpc/util/ConfigurationCompat.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+package kotlinx.rpc.util
+
+import org.gradle.api.artifacts.Configuration
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Provider
+import org.gradle.util.GradleVersion
+
+private val SUPPORTS_LAZY_EXTENDS_FROM: Boolean =
+ GradleVersion.current().baseVersion >= GradleVersion.version("9.4")
+
+@Suppress("UnstableApiUsage")
+internal fun Configuration.extendsFromLazy(
+ legacyList: ListProperty,
+ provider: Provider,
+) {
+ if (SUPPORTS_LAZY_EXTENDS_FROM) {
+ extendsFrom(provider)
+ } else {
+ legacyList.add(provider)
+ }
+}
diff --git a/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcAndroidProjectTest.kt b/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcAndroidProjectTest.kt
index fcc95315c..5ecbef328 100644
--- a/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcAndroidProjectTest.kt
+++ b/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcAndroidProjectTest.kt
@@ -231,6 +231,68 @@ class GrpcAndroidProjectTest : GrpcBaseTest() {
)
}
+ @TestFactory
+ fun `Dependency Proto Per Source Set All Variants`() = runGrpcTest(versionsPredicate = { !isAgp9 }) {
+ dependencyProtoPerSourceSetAllVariantsBody()
+ }
+
+ @TestFactory
+ fun `Dependency Proto Per Source Set All Variants No KGP`() = runGrpcTest(versionsPredicate = { isAgp9 }) {
+ // AGP 9.0 built-in Kotlin only creates unit test compilation for testBuildType (debug),
+ // so testRelease has no compile task, and we skip it here.
+ dependencyProtoPerSourceSetAllVariantsBody(includeTestRelease = false)
+ }
+
+ private fun GrpcTestEnv.dependencyProtoPerSourceSetAllVariantsBody(includeTestRelease: Boolean = true) {
+ runAndCheckZipFiles(
+ SSetsAndroid.Default.debug,
+ extended = listOf(SSetsAndroid.Default.main),
+ )
+ runAndCheckZipFiles(
+ SSetsAndroid.Default.release,
+ extended = listOf(SSetsAndroid.Default.main),
+ )
+ runAndCheckZipFiles(
+ SSetsAndroid.Default.testDebug,
+ SSetsAndroid.Default.debug, SSetsAndroid.Default.main,
+ extended = listOf(
+ SSetsAndroid.Default.test,
+ SSetsAndroid.Default.testFixtures,
+ SSetsAndroid.Default.testFixturesDebug,
+ ),
+ )
+ if (includeTestRelease) {
+ runAndCheckZipFiles(
+ SSetsAndroid.Default.testRelease,
+ SSetsAndroid.Default.release, SSetsAndroid.Default.main,
+ extended = listOf(
+ SSetsAndroid.Default.test,
+ SSetsAndroid.Default.testFixtures,
+ SSetsAndroid.Default.testFixturesRelease,
+ ),
+ )
+ }
+ runAndCheckZipFiles(
+ SSetsAndroid.Default.androidTestDebug,
+ SSetsAndroid.Default.debug, SSetsAndroid.Default.main,
+ extended = listOf(
+ SSetsAndroid.Default.androidTest,
+ SSetsAndroid.Default.testFixtures,
+ SSetsAndroid.Default.testFixturesDebug,
+ ),
+ )
+ }
+
+ @TestFactory
+ fun `Dependency Configurations And Tasks`() = runGrpcTest(versionsPredicate = { !isAgp9 }) {
+ runGradle("test_tasks", "--no-configuration-cache")
+ }
+
+ @TestFactory
+ fun `Dependency Configurations And Tasks No KGP`() = runGrpcTest(versionsPredicate = { isAgp9 }) {
+ runGradle("test_tasks", "--no-configuration-cache")
+ }
+
@TestFactory
fun `No gRPC`() = runGrpcTest(versionsPredicate = { !isAgp9 }) {
SSetsAndroid.Default.entries.forEach {
diff --git a/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcJvmProjectTest.kt b/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcJvmProjectTest.kt
index e99dbe577..6946b4887 100644
--- a/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcJvmProjectTest.kt
+++ b/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcJvmProjectTest.kt
@@ -9,6 +9,9 @@ import kotlinx.rpc.protoc.PlatformOption
import org.gradle.testkit.runner.TaskOutcome
import org.junit.jupiter.api.TestFactory
import org.junit.jupiter.api.TestInstance
+import java.nio.file.Files
+import java.util.zip.ZipEntry
+import java.util.zip.ZipOutputStream
import kotlin.io.path.Path
import kotlin.io.path.appendText
import kotlin.test.assertEquals
@@ -27,11 +30,174 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
),
generatedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
)
)
}
+ @TestFactory
+ fun `Dependency Proto Codegen`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonMain)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonMainProtoFiles)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoCommonMain)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoImportCommonMain)
+
+ // dependency.proto should be in the proto dir (codegen), not import dir
+ assertWorkspaceProtoFilesCopied(mainSourceSet, Path("some.proto"), Path("dependency.proto"))
+
+ // Both local and dependency protos generate code
+ assertSourceCodeGenerated(
+ mainSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ Path("dependency", "Dependency.kt"),
+ Path("dependency", "Dependency.ext.kt"),
+ Path("dependency", RPC_INTERNAL, "Dependency.kt"),
+ )
+
+ dryRunCompilation(SSetsJvm.main)
+ }
+
+ @TestFactory
+ fun `Dependency Proto Import`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonMain)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonMainProtoFiles)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonMain)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoImportCommonMain)
+
+ // dependency.proto should be in the import dir (import-only), not proto dir
+ assertWorkspaceProtoFilesCopied(mainSourceSet, Path("some.proto"))
+ assertWorkspaceImportProtoFilesCopied(mainSourceSet, Path("dependency.proto"))
+
+ // Only local protos generate code, dependency protos are imports only
+ assertSourceCodeGenerated(
+ mainSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ )
+
+ dryRunCompilation(SSetsJvm.main)
+ }
+
+ @TestFactory
+ fun `Dependency Proto Test Codegen`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonTest)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonTest)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonTestProtoFiles)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, processCommonTestProtoFilesImports)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonTest)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonTest)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoCommonTest)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoImportCommonTest)
+
+
+ // testDep proto reaches the test source set as codegen
+ assertWorkspaceProtoFilesCopied(testSourceSet, Path("some.proto"), Path("testDep.proto"))
+
+ // main is untouched: testProto must not leak to main
+ assertWorkspaceProtoFilesCopied(mainSourceSet)
+ assertWorkspaceImportProtoFilesCopied(mainSourceSet)
+
+ assertSourceCodeGenerated(
+ testSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ Path("dependency", "TestDep.kt"),
+ Path("dependency", "TestDep.ext.kt"),
+ Path("dependency", RPC_INTERNAL, "TestDep.kt"),
+ )
+
+ dryRunCompilation(SSetsJvm.test)
+ }
+
+ @TestFactory
+ fun `Dependency Proto Test Import`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonTest)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonTest)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonTestProtoFiles)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonTestProtoFilesImports)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonTest)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonTest)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoCommonTest)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoImportCommonTest)
+
+
+ // testImportDep proto reaches test as import only
+ assertWorkspaceProtoFilesCopied(testSourceSet, Path("some.proto"))
+ assertWorkspaceImportProtoFilesCopied(testSourceSet, Path("testImportDep.proto"))
+
+ // main is untouched
+ assertWorkspaceProtoFilesCopied(mainSourceSet)
+ assertWorkspaceImportProtoFilesCopied(mainSourceSet)
+
+ // testImportDep.proto is import-only, so no TestImportDep.kt generated
+ assertSourceCodeGenerated(
+ testSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ )
+
+ dryRunCompilation(SSetsJvm.test)
+ }
+
+ @TestFactory
+ fun `Dependency Proto Extract Tasks Are Cached Properly`() = runGrpcTest {
+ val firstRun = runGradle(extractProtoCommonMain, extractProtoImportCommonMain)
+ assertEquals(TaskOutcome.SUCCESS, firstRun.protoTaskOutcome(extractProtoCommonMain))
+ assertEquals(TaskOutcome.SUCCESS, firstRun.protoTaskOutcome(extractProtoImportCommonMain))
+
+ val secondRun = runGradle(extractProtoCommonMain, extractProtoImportCommonMain)
+ assertEquals(TaskOutcome.UP_TO_DATE, secondRun.protoTaskOutcome(extractProtoCommonMain))
+ assertEquals(TaskOutcome.UP_TO_DATE, secondRun.protoTaskOutcome(extractProtoImportCommonMain))
+
+ cleanProtoBuildDir()
+
+ // Sync isn't a cacheable task, so a clean output dir means re-execute → SUCCESS,
+ // not FROM_CACHE. UP_TO_DATE detection relies on the persisted output state.
+ val thirdRun = runGradle(extractProtoCommonMain, extractProtoImportCommonMain)
+ assertEquals(TaskOutcome.SUCCESS, thirdRun.protoTaskOutcome(extractProtoCommonMain))
+ assertEquals(TaskOutcome.SUCCESS, thirdRun.protoTaskOutcome(extractProtoImportCommonMain))
+
+ // rewrite the codegen zip with different content — must invalidate extractProtoMain
+ // but NOT extractProtoImportMain, which reads a separate zip.
+ val codegenZip = projectDir.resolve("zip/main-dependency.zip")
+ ZipOutputStream(Files.newOutputStream(codegenZip)).use { zos ->
+ zos.putNextEntry(ZipEntry("mainDep.proto"))
+ zos.write(
+ """
+ syntax = "proto3";
+
+ package dependency;
+
+ message MainDep {
+ string value = 1;
+ int32 version = 2;
+ }
+ """.trimIndent().toByteArray(),
+ )
+ zos.closeEntry()
+ }
+
+ val fourthRun = runGradle(extractProtoCommonMain, extractProtoImportCommonMain)
+ assertEquals(TaskOutcome.SUCCESS, fourthRun.protoTaskOutcome(extractProtoCommonMain))
+ assertEquals(TaskOutcome.UP_TO_DATE, fourthRun.protoTaskOutcome(extractProtoImportCommonMain))
+ }
+
@TestFactory
fun `No gRPC`() = runGrpcTest {
SSetsJvm.entries.forEach {
@@ -51,6 +217,7 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
),
generatedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
)
)
@@ -67,6 +234,7 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
importProtoFiles = emptyList(),
generatedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
),
importGeneratedFiles = emptyList()
@@ -83,6 +251,7 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
),
generatedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
)
)
@@ -102,10 +271,12 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
),
generatedFiles = listOf(
Path("Other.kt"),
+ Path("Other.ext.kt"),
Path(RPC_INTERNAL, "Other.kt"),
),
importGeneratedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
),
mainGenerateOutcome = TaskOutcome.FROM_CACHE,
@@ -124,6 +295,7 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
),
generatedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
)
)
@@ -141,10 +313,12 @@ class GrpcJvmProjectTest : GrpcBaseTest() {
),
generatedFiles = listOf(
Path("Other.kt"),
+ Path("Other.ext.kt"),
Path(RPC_INTERNAL, "Other.kt"),
),
importGeneratedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
),
mainGenerateOutcome = TaskOutcome.FROM_CACHE,
diff --git a/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcKmpProjectTest.kt b/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcKmpProjectTest.kt
index 1033c1506..af3ac0613 100644
--- a/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcKmpProjectTest.kt
+++ b/gradle-plugin/src/test/kotlin/kotlinx/rpc/GrpcKmpProjectTest.kt
@@ -27,11 +27,126 @@ class GrpcKmpProjectTest : GrpcBaseTest() {
),
generatedFiles = listOf(
Path("Some.kt"),
+ Path("Some.ext.kt"),
Path(RPC_INTERNAL, "Some.kt"),
)
)
}
+ @TestFactory
+ fun `Dependency Proto Import KMP DSL`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonMain)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonMainProtoFiles)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonMain)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoImportCommonMain)
+
+ assertWorkspaceProtoFilesCopied(mainSourceSet, Path("some.proto"))
+ assertWorkspaceImportProtoFilesCopied(mainSourceSet, Path("dependency.proto"))
+
+ assertSourceCodeGenerated(
+ mainSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ )
+
+ dryRunCompilation(SSetsKmp.Default.jvmMain)
+ }
+
+ @TestFactory
+ fun `Dependency Proto Import`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonMain)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonMainProtoFiles)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonMain)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoImportCommonMain)
+
+ assertWorkspaceProtoFilesCopied(mainSourceSet, Path("some.proto"))
+ assertWorkspaceImportProtoFilesCopied(mainSourceSet, Path("dependency.proto"))
+
+ assertSourceCodeGenerated(
+ mainSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ )
+
+ dryRunCompilation(SSetsKmp.Default.jvmMain)
+ }
+
+ @TestFactory
+ fun `Dependency Proto Codegen`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonMain)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonMainProtoFiles)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoCommonMain)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoImportCommonMain)
+
+ // dependency proto reaches commonMain as codegen
+ assertWorkspaceProtoFilesCopied(mainSourceSet, Path("some.proto"), Path("dependency.proto"))
+
+ assertSourceCodeGenerated(
+ mainSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ Path("dependency", "Dependency.kt"),
+ Path("dependency", "Dependency.ext.kt"),
+ Path("dependency", RPC_INTERNAL, "Dependency.kt"),
+ )
+
+ dryRunCompilation(SSetsKmp.Default.jvmMain)
+ }
+
+ @TestFactory
+ fun `Dependency Proto Codegen KMP DSL`() = runGrpcTest {
+ val result = runGradle(bufGenerateCommonMain)
+
+ result.assertOutcome(TaskOutcome.SUCCESS, bufGenerateCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, processCommonMainProtoFiles)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, generateBufGenYamlCommonMain)
+ result.assertOutcome(TaskOutcome.SUCCESS, extractProtoCommonMain)
+ result.assertOutcome(TaskOutcome.NO_SOURCE, extractProtoImportCommonMain)
+
+ assertWorkspaceProtoFilesCopied(mainSourceSet, Path("some.proto"), Path("commonMainDep.proto"))
+
+ assertSourceCodeGenerated(
+ mainSourceSet,
+ Path("Some.kt"),
+ Path("Some.ext.kt"),
+ Path(RPC_INTERNAL, "Some.kt"),
+ Path("dependency", "CommonMainDep.kt"),
+ Path("dependency", "CommonMainDep.ext.kt"),
+ Path("dependency", RPC_INTERNAL, "CommonMainDep.kt"),
+ )
+
+ dryRunCompilation(SSetsKmp.Default.jvmMain)
+ }
+
+ @TestFactory
+ fun `Dependency Imports From Provider Source Set`() = runGrpcTest {
+ runGradle(processCommonMainProtoFiles)
+ runGradle("processCommonMainProtoFilesImports")
+
+ assertWorkspaceProtoFilesCopied(mainSourceSet, Path("some.proto"))
+ assertWorkspaceImportProtoFilesCopied(
+ mainSourceSet,
+ Path("common2.proto"),
+ Path("common2ImportDep.proto"),
+ )
+ }
+
@TestFactory
fun `No gRPC`() = runGrpcTest {
SSetsKmp.Default.entries.forEach {
@@ -126,6 +241,383 @@ class GrpcKmpProjectTest : GrpcBaseTest() {
)
}
+ @TestFactory
+ fun `Dependency KMP Hierarchy`() = runGrpcTest {
+ runAndCheckZipFiles(
+ SSetsKmp.Default.commonMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.commonTest,
+ SSetsKmp.Default.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.Default.nativeMain,
+ SSetsKmp.Default.commonMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.nativeTest,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.nativeMain,
+ SSetsKmp.Default.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.Default.jvmMain,
+ SSetsKmp.Default.commonMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.jvmTest,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.jvmMain,
+ SSetsKmp.Default.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.Default.webMain,
+ SSetsKmp.Default.commonMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.webTest,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.webMain,
+ SSetsKmp.Default.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.Default.jsMain,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.webMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.jsTest,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.webMain, SSetsKmp.Default.jsMain,
+ SSetsKmp.Default.commonTest, SSetsKmp.Default.webTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.Default.appleMain,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.nativeMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.appleTest,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.nativeMain, SSetsKmp.Default.appleMain,
+ SSetsKmp.Default.commonTest, SSetsKmp.Default.nativeTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.Default.macosMain,
+ SSetsKmp.Default.commonMain, SSetsKmp.Default.nativeMain, SSetsKmp.Default.appleMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.macosTest,
+ SSetsKmp.Default.commonMain,
+ SSetsKmp.Default.nativeMain,
+ SSetsKmp.Default.appleMain,
+ SSetsKmp.Default.macosMain,
+ SSetsKmp.Default.commonTest,
+ SSetsKmp.Default.nativeTest,
+ SSetsKmp.Default.appleTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.Default.macosArm64Main,
+ SSetsKmp.Default.commonMain,
+ SSetsKmp.Default.nativeMain,
+ SSetsKmp.Default.appleMain,
+ SSetsKmp.Default.macosMain,
+ )
+ runAndCheckZipFiles(
+ SSetsKmp.Default.macosArm64Test,
+ SSetsKmp.Default.commonMain,
+ SSetsKmp.Default.nativeMain,
+ SSetsKmp.Default.appleMain,
+ SSetsKmp.Default.macosMain,
+ SSetsKmp.Default.macosArm64Main,
+ SSetsKmp.Default.commonTest,
+ SSetsKmp.Default.nativeTest,
+ SSetsKmp.Default.appleTest,
+ SSetsKmp.Default.macosTest,
+ )
+ }
+
+ @TestFactory
+ fun `Dependency KMP Hierarchy Android KMP Library`() = runGrpcTest {
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.commonTest,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.jvmMain,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.jvmTest,
+ SSetsKmp.AndroidKmpLib.commonMain, SSetsKmp.AndroidKmpLib.jvmMain,
+ SSetsKmp.AndroidKmpLib.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.androidMain,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+ }
+
+ @TestFactory
+ fun `Dependency KMP Hierarchy Android KMP Library With Test Tasks`() = runGrpcTest(
+ versionsPredicate = { versionsWhereAndroidKmpLibExist() },
+ ) {
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.commonTest,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.jvmMain,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.jvmTest,
+ SSetsKmp.AndroidKmpLib.commonMain, SSetsKmp.AndroidKmpLib.jvmMain,
+ SSetsKmp.AndroidKmpLib.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.androidMain,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.androidHostTest,
+ SSetsKmp.AndroidKmpLib.commonMain, SSetsKmp.AndroidKmpLib.commonTest,
+ SSetsKmp.AndroidKmpLib.androidMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.androidDeviceTest,
+ SSetsKmp.AndroidKmpLib.commonMain, SSetsKmp.AndroidKmpLib.commonTest,
+ SSetsKmp.AndroidKmpLib.androidMain,
+ )
+ }
+
+ @TestFactory
+ fun `Dependency KMP Hierarchy Android KMP Library With Test Tasks Not Wired`() = runGrpcTest(
+ versionsPredicate = { versionsWhereAndroidKmpLibExist() },
+ ) {
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.commonTest,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.jvmMain,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.jvmTest,
+ SSetsKmp.AndroidKmpLib.commonMain, SSetsKmp.AndroidKmpLib.jvmMain,
+ SSetsKmp.AndroidKmpLib.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.androidMain,
+ SSetsKmp.AndroidKmpLib.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.androidHostTest,
+ SSetsKmp.AndroidKmpLib.commonMain, SSetsKmp.AndroidKmpLib.commonTest,
+ SSetsKmp.AndroidKmpLib.androidMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.AndroidKmpLib.androidDeviceTest,
+ SSetsKmp.AndroidKmpLib.commonMain, SSetsKmp.AndroidKmpLib.androidMain,
+ )
+ }
+
+ @TestFactory
+ fun `Dependency KMP Hierarchy Legacy Android`() = runGrpcTest(
+ versionsPredicate = { !isAgp9 },
+ ) {
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.commonTest,
+ SSetsKmp.LegacyAndroid.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.jvmMain,
+ SSetsKmp.LegacyAndroid.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.jvmTest,
+ SSetsKmp.LegacyAndroid.commonMain, SSetsKmp.LegacyAndroid.jvmMain,
+ SSetsKmp.LegacyAndroid.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidDebug,
+ SSetsKmp.LegacyAndroid.commonMain,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain,
+ SSetsKmp.LegacyAndroid.debug,
+ ),
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidRelease,
+ SSetsKmp.LegacyAndroid.commonMain,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain,
+ SSetsKmp.LegacyAndroid.release,
+ )
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidUnitTestDebug,
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain, SSetsKmp.LegacyAndroid.commonMain,
+ SSetsKmp.LegacyAndroid.debug, SSetsKmp.LegacyAndroid.androidDebug,
+ SSetsKmp.LegacyAndroid.commonTest,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.test,
+ SSetsKmp.LegacyAndroid.androidUnitTest,
+ SSetsKmp.LegacyAndroid.testDebug,
+ SSetsKmp.LegacyAndroid.testFixtures,
+ SSetsKmp.LegacyAndroid.testFixturesDebug,
+ )
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidUnitTestRelease,
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain, SSetsKmp.LegacyAndroid.commonMain,
+ SSetsKmp.LegacyAndroid.release, SSetsKmp.LegacyAndroid.androidRelease,
+ SSetsKmp.LegacyAndroid.commonTest,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.test,
+ SSetsKmp.LegacyAndroid.androidUnitTest,
+ SSetsKmp.LegacyAndroid.testRelease,
+ SSetsKmp.LegacyAndroid.testFixtures,
+ SSetsKmp.LegacyAndroid.testFixturesRelease,
+ )
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidInstrumentedTestDebug,
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain, SSetsKmp.LegacyAndroid.commonMain,
+ SSetsKmp.LegacyAndroid.debug, SSetsKmp.LegacyAndroid.androidDebug,
+ SSetsKmp.LegacyAndroid.commonTest,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.androidTest,
+ SSetsKmp.LegacyAndroid.androidInstrumentedTest,
+ SSetsKmp.LegacyAndroid.androidTestDebug,
+ SSetsKmp.LegacyAndroid.testFixtures,
+ SSetsKmp.LegacyAndroid.testFixturesDebug,
+ )
+ )
+ }
+
+ @TestFactory
+ fun `Dependency KMP Hierarchy Legacy Android Not Wired`() = runGrpcTest(
+ versionsPredicate = { !isAgp9 },
+ ) {
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.commonTest,
+ SSetsKmp.LegacyAndroid.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.jvmMain,
+ SSetsKmp.LegacyAndroid.commonMain,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.jvmTest,
+ SSetsKmp.LegacyAndroid.commonMain, SSetsKmp.LegacyAndroid.jvmMain,
+ SSetsKmp.LegacyAndroid.commonTest,
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidDebug,
+ SSetsKmp.LegacyAndroid.commonMain,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain,
+ SSetsKmp.LegacyAndroid.debug,
+ ),
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidRelease,
+ SSetsKmp.LegacyAndroid.commonMain,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain,
+ SSetsKmp.LegacyAndroid.release,
+ )
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidUnitTestDebug,
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain, SSetsKmp.LegacyAndroid.commonMain,
+ SSetsKmp.LegacyAndroid.debug, SSetsKmp.LegacyAndroid.androidDebug,
+ SSetsKmp.LegacyAndroid.commonTest,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.test,
+ SSetsKmp.LegacyAndroid.androidUnitTest,
+ SSetsKmp.LegacyAndroid.testDebug,
+ SSetsKmp.LegacyAndroid.testFixtures,
+ SSetsKmp.LegacyAndroid.testFixturesDebug,
+ )
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidUnitTestRelease,
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain, SSetsKmp.LegacyAndroid.commonMain,
+ SSetsKmp.LegacyAndroid.release, SSetsKmp.LegacyAndroid.androidRelease,
+ SSetsKmp.LegacyAndroid.commonTest,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.test,
+ SSetsKmp.LegacyAndroid.androidUnitTest,
+ SSetsKmp.LegacyAndroid.testRelease,
+ SSetsKmp.LegacyAndroid.testFixtures,
+ SSetsKmp.LegacyAndroid.testFixturesRelease,
+ )
+ )
+
+ runAndCheckZipFiles(
+ SSetsKmp.LegacyAndroid.androidInstrumentedTestDebug,
+ SSetsKmp.LegacyAndroid.main, SSetsKmp.LegacyAndroid.androidMain, SSetsKmp.LegacyAndroid.commonMain,
+ SSetsKmp.LegacyAndroid.debug, SSetsKmp.LegacyAndroid.androidDebug,
+ extended = listOf(
+ SSetsKmp.LegacyAndroid.androidTest,
+ SSetsKmp.LegacyAndroid.androidInstrumentedTest,
+ SSetsKmp.LegacyAndroid.androidTestDebug,
+ SSetsKmp.LegacyAndroid.testFixtures,
+ SSetsKmp.LegacyAndroid.testFixturesDebug,
+ )
+ )
+ }
+
+
@TestFactory
fun `KMP Hierarchy`() = runGrpcTest {
runAndCheckFiles(
diff --git a/gradle-plugin/src/test/kotlin/kotlinx/rpc/base/GrpcBaseTest.kt b/gradle-plugin/src/test/kotlin/kotlinx/rpc/base/GrpcBaseTest.kt
index 1b0c8aa2d..db73eadcb 100644
--- a/gradle-plugin/src/test/kotlin/kotlinx/rpc/base/GrpcBaseTest.kt
+++ b/gradle-plugin/src/test/kotlin/kotlinx/rpc/base/GrpcBaseTest.kt
@@ -9,10 +9,12 @@ package kotlinx.rpc.base
import kotlinx.rpc.base.GrpcBaseTest.PluginMode
import kotlinx.rpc.base.GrpcBaseTest.SSets
import org.gradle.testkit.runner.BuildResult
+import org.gradle.testkit.runner.BuildTask
import org.gradle.testkit.runner.TaskOutcome
import org.intellij.lang.annotations.Language
import org.junit.jupiter.api.DynamicTest
import org.junit.jupiter.api.TestInstance
+import java.io.BufferedReader
import java.nio.file.Path
import java.util.stream.Stream
import kotlin.io.path.*
@@ -32,6 +34,8 @@ abstract class GrpcBaseTest : BaseTest() {
runNonExistentTask(bufGenerate(set))
runNonExistentTask(processProtoFiles(set))
runNonExistentTask(processProtoFilesImports(set))
+ runNonExistentTask(extractProto(set))
+ runNonExistentTask(extractProtoImport(set))
runNonExistentTask(generateBufYaml(set))
runNonExistentTask(generateBufGenYaml(set))
}
@@ -92,6 +96,9 @@ abstract class GrpcBaseTest : BaseTest() {
"File '${file}' in '$dir' does not exist"
}
}
+
+ // todo check no tests are broken
+ assertSourceCodeNotGeneratedExcept(sourceSet, *files)
}
fun assertSourceCodeNotGenerated(sourceSet: SSets, vararg files: Path) {
@@ -104,7 +111,7 @@ abstract class GrpcBaseTest : BaseTest() {
}
}
- fun assertSourceCodeNotGeneratedExcept(sourceSet: SSets, vararg files: Path) {
+ private fun assertSourceCodeNotGeneratedExcept(sourceSet: SSets, vararg files: Path) {
val dir = protoBuildDirGenerated.resolve(sourceSet.name).resolve(KOTLIN_MULTIPLATFORM_DIR)
fun Path.doAssert() {
@@ -312,7 +319,6 @@ abstract class GrpcBaseTest : BaseTest() {
assertOutcome(TaskOutcome.SUCCESS, generateBufGenYaml(sourceSet))
assertSourceCodeGenerated(sourceSet, *generatedFiles.toTypedArray())
- assertSourceCodeNotGeneratedExcept(sourceSet, *generatedFiles.toTypedArray())
assertWorkspaceProtoFilesCopied(sourceSet, *protoFiles.toTypedArray())
assertWorkspaceImportProtoFilesCopied(sourceSet, *importProtoFiles.toTypedArray())
@@ -322,9 +328,23 @@ abstract class GrpcBaseTest : BaseTest() {
assertProtoTaskNotExecuted(processProtoFilesImports(it))
assertProtoTaskNotExecuted(generateBufYaml(it))
assertProtoTaskNotExecuted(generateBufGenYaml(it))
+ assertProtoTaskNotExecuted(extractProto(it))
+ assertProtoTaskNotExecuted(extractProtoImport(it))
}
}
+ fun GrpcTestEnv.runAndCheckZipFiles(
+ sourceSet: SSets,
+ vararg imports: SSets,
+ extended: List = emptyList(),
+ ) {
+ cleanProtoBuildDir()
+
+ runForSet(sourceSet).assertZipSourceSet(sourceSet, *imports, extendedProto = extended)
+
+ dryRunCompilation(sourceSet)
+ }
+
fun GrpcTestEnv.runAndCheckFiles(
sourceSet: SSets,
vararg imports: SSets,
@@ -358,10 +378,59 @@ abstract class GrpcBaseTest : BaseTest() {
}
fun GrpcTestEnv.runForSet(sourceSet: SSets): BuildResult {
+ if (!sourceSet.applicable()) {
+ return SkipBuild
+ }
+
return runGradle(bufGenerate(sourceSet))
}
- fun BuildResult.assertSourceSet(
+ private fun BuildResult.assertZipSourceSet(
+ sourceSet: SSets,
+ vararg imports: SSets,
+ extendedProto: List,
+ ) {
+ if (!sourceSet.applicable()) {
+ println(
+ "Skipping ${sourceSet.capital} source set " +
+ "because it's not applicable for the current Kotlin version"
+ )
+ return
+ }
+
+ val importsSet = imports
+ .onEach {
+ if (!it.applicable()) {
+ println(
+ "Skipping ${it.capital} import source set " +
+ "because it's not applicable for the current Kotlin version"
+ )
+ }
+ }
+ .filter { it.applicable() }
+ .toSet()
+
+ val generateFor = extendedProto.filter { it.applicable() } + sourceSet
+ // because every sset has import dependency too for these tests
+ val fullImports = importsSet + generateFor
+
+ assertTaskExecuted(
+ sourceSet = sourceSet,
+ protoFiles = generateFor.map { Path("${it.name}Dep.proto") },
+ importProtoFiles = fullImports.map { Path("${it.name}ImportDep.proto") },
+ generatedFiles = generateFor.flatMap {
+ val pascal = it.capital
+ listOf(
+ Path("dependency", "${pascal}Dep.kt"),
+ Path("dependency", "${pascal}Dep.ext.kt"),
+ Path("dependency", RPC_INTERNAL, "${pascal}Dep.kt"),
+ )
+ },
+ notExecuted = sourceSet.all().filter { it != sourceSet && it !in fullImports },
+ )
+ }
+
+ private fun BuildResult.assertSourceSet(
sourceSet: SSets,
vararg imports: SSets,
extendedProto: List,
@@ -386,7 +455,7 @@ abstract class GrpcBaseTest : BaseTest() {
.filter { it.applicable() }
.toSet()
- val generateFor = extendedProto + sourceSet
+ val generateFor = extendedProto.filter { it.applicable() } + sourceSet
assertTaskExecuted(
sourceSet = sourceSet,
@@ -444,6 +513,8 @@ inputs:
fun bufGenerate(sourceSet: SSets) = "bufGenerate${sourceSet.capital}"
fun processProtoFiles(sourceSet: SSets) = "process${sourceSet.capital}ProtoFiles"
fun processProtoFilesImports(sourceSet: SSets) = "process${sourceSet.capital}ProtoFilesImports"
+ fun extractProto(sourceSet: SSets) = "extractProto${sourceSet.capital}"
+ fun extractProtoImport(sourceSet: SSets) = "extractProtoImport${sourceSet.capital}"
fun generateBufYaml(sourceSet: SSets) = "generateBufYaml${sourceSet.capital}"
fun generateBufGenYaml(sourceSet: SSets) = "generateBufGenYaml${sourceSet.capital}"
@@ -468,6 +539,10 @@ inputs:
val generateBufYamlCommonTest = generateBufYaml(testSourceSet)
val generateBufGenYamlCommonMain = generateBufGenYaml(mainSourceSet)
val generateBufGenYamlCommonTest = generateBufGenYaml(testSourceSet)
+ val extractProtoCommonMain = extractProto(mainSourceSet)
+ val extractProtoCommonTest = extractProto(testSourceSet)
+ val extractProtoImportCommonMain = extractProtoImport(mainSourceSet)
+ val extractProtoImportCommonTest = extractProtoImport(testSourceSet)
val protoBuildDir: Path by lazy {
projectDir
@@ -635,6 +710,37 @@ inputs:
return entries
}
}
+
+ enum class Flavors(
+ override val mode: PluginMode? = null,
+ override val minKotlin: KotlinVersion = KtVersion.v2_0_0,
+ ) : SSetsAndroid {
+ // non-executable root source sets
+ main, test, androidTest,
+
+ // per-flavor non-executable
+ arm, x86,
+
+ // build-type non-executable
+ debug, release,
+
+ // executable leaf variants
+ armDebug(plm.a), armRelease(plm.a),
+ x86Debug(plm.a), x86Release(plm.a),
+
+ // test variants
+ testArmDebug(plm.a), testArmRelease(plm.a),
+ testX86Debug(plm.a), testX86Release(plm.a),
+
+ // androidTest variants
+ androidTestArmDebug(plm.a),
+ androidTestX86Debug(plm.a),
+ ;
+
+ override fun all(): List {
+ return entries
+ }
+ }
}
enum class PluginMode {
@@ -774,3 +880,13 @@ private fun SSets.preBuildTaskName(mode: PluginMode): String? {
}
}
}
+
+private object SkipBuild : BuildResult {
+ override fun getOutput(): String = ""
+ @Suppress("UnstableApiUsage")
+ override fun getOutputReader(): BufferedReader? = null
+ override fun getTasks(): List = emptyList()
+ override fun tasks(outcome: TaskOutcome?): List = emptyList()
+ override fun taskPaths(outcome: TaskOutcome?): List = emptyList()
+ override fun task(taskPath: String?): BuildTask? = null
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks/build.gradle.kts
new file mode 100644
index 000000000..5a323c513
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks/build.gradle.kts
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.api.GradleException
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ id("com.android.application") version ""
+ kotlin("android") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+android {
+ namespace = "com.example.myapp"
+ compileSdk = 34
+
+ flavorDimensions("abi", "version")
+
+ productFlavors {
+ create("freeapp") {
+ dimension = "version"
+ }
+ create("retailapp") {
+ dimension = "version"
+ }
+ create("x86") {
+ dimension = "abi"
+ }
+ create("arm") {
+ dimension = "abi"
+ }
+ }
+}
+
+dependencies {
+ protoImport(files("zip/dependency-protos.zip"))
+}
+
+fun assertConfigurationExists(name: String) {
+ configurations.findByName(name)
+ ?: throw GradleException("Configuration '$name' does not exist")
+}
+
+fun assertTaskExists(name: String) {
+ tasks.findByName(name)
+ ?: throw GradleException("Task '$name' does not exist")
+}
+
+tasks.register("test_tasks") {
+ doLast {
+ // Verify proto and protoImport configurations exist for root source sets
+ assertConfigurationExists("proto") // main
+ assertConfigurationExists("protoImport") // main
+ assertConfigurationExists("testProto") // test
+ assertConfigurationExists("testProtoImport") // test
+ assertConfigurationExists("androidTestProto")
+ assertConfigurationExists("androidTestProtoImport")
+
+ // Verify proto configurations exist for flavor source sets
+ assertConfigurationExists("armProto")
+ assertConfigurationExists("armProtoImport")
+ assertConfigurationExists("x86Proto")
+ assertConfigurationExists("x86ProtoImport")
+ assertConfigurationExists("freeappProto")
+ assertConfigurationExists("freeappProtoImport")
+ assertConfigurationExists("retailappProto")
+ assertConfigurationExists("retailappProtoImport")
+
+ // Verify proto configurations exist for combined flavor source sets
+ assertConfigurationExists("armFreeappProto")
+ assertConfigurationExists("armFreeappProtoImport")
+ assertConfigurationExists("armRetailappProto")
+ assertConfigurationExists("armRetailappProtoImport")
+ assertConfigurationExists("x86FreeappProto")
+ assertConfigurationExists("x86FreeappProtoImport")
+ assertConfigurationExists("x86RetailappProto")
+ assertConfigurationExists("x86RetailappProtoImport")
+
+ // Verify proto configurations exist for build type source sets
+ assertConfigurationExists("debugProto")
+ assertConfigurationExists("debugProtoImport")
+ assertConfigurationExists("releaseProto")
+ assertConfigurationExists("releaseProtoImport")
+
+ // Verify proto configurations for variant source sets
+ assertConfigurationExists("armFreeappDebugProto")
+ assertConfigurationExists("armFreeappDebugProtoImport")
+ assertConfigurationExists("armFreeappReleaseProto")
+ assertConfigurationExists("armFreeappReleaseProtoImport")
+ assertConfigurationExists("armRetailappDebugProto")
+ assertConfigurationExists("armRetailappDebugProtoImport")
+ assertConfigurationExists("armRetailappReleaseProto")
+ assertConfigurationExists("armRetailappReleaseProtoImport")
+ assertConfigurationExists("x86FreeappDebugProto")
+ assertConfigurationExists("x86FreeappDebugProtoImport")
+ assertConfigurationExists("x86FreeappReleaseProto")
+ assertConfigurationExists("x86FreeappReleaseProtoImport")
+ assertConfigurationExists("x86RetailappDebugProto")
+ assertConfigurationExists("x86RetailappDebugProtoImport")
+ assertConfigurationExists("x86RetailappReleaseProto")
+ assertConfigurationExists("x86RetailappReleaseProtoImport")
+
+ // Verify proto configurations for test variant source sets
+ assertConfigurationExists("testArmFreeappDebugProto")
+ assertConfigurationExists("testArmFreeappDebugProtoImport")
+ assertConfigurationExists("testArmFreeappReleaseProto")
+ assertConfigurationExists("testArmFreeappReleaseProtoImport")
+ assertConfigurationExists("testX86FreeappDebugProto")
+ assertConfigurationExists("testX86FreeappDebugProtoImport")
+
+ // Verify proto configurations for androidTest variant source sets
+ assertConfigurationExists("androidTestArmFreeappDebugProto")
+ assertConfigurationExists("androidTestArmFreeappDebugProtoImport")
+ assertConfigurationExists("androidTestX86FreeappDebugProto")
+ assertConfigurationExists("androidTestX86FreeappDebugProtoImport")
+
+ // Verify extract tasks exist for main variants
+ assertTaskExists("extractProtoArmFreeappDebug")
+ assertTaskExists("extractProtoImportArmFreeappDebug")
+ assertTaskExists("extractProtoArmFreeappRelease")
+ assertTaskExists("extractProtoImportArmFreeappRelease")
+ assertTaskExists("extractProtoArmRetailappDebug")
+ assertTaskExists("extractProtoImportArmRetailappDebug")
+ assertTaskExists("extractProtoArmRetailappRelease")
+ assertTaskExists("extractProtoImportArmRetailappRelease")
+ assertTaskExists("extractProtoX86FreeappDebug")
+ assertTaskExists("extractProtoImportX86FreeappDebug")
+ assertTaskExists("extractProtoX86FreeappRelease")
+ assertTaskExists("extractProtoImportX86FreeappRelease")
+ assertTaskExists("extractProtoX86RetailappDebug")
+ assertTaskExists("extractProtoImportX86RetailappDebug")
+ assertTaskExists("extractProtoX86RetailappRelease")
+ assertTaskExists("extractProtoImportX86RetailappRelease")
+
+ // Verify extract tasks exist for test variants
+ assertTaskExists("extractProtoTestArmFreeappDebug")
+ assertTaskExists("extractProtoImportTestArmFreeappDebug")
+ assertTaskExists("extractProtoTestArmFreeappRelease")
+ assertTaskExists("extractProtoImportTestArmFreeappRelease")
+ assertTaskExists("extractProtoTestX86FreeappDebug")
+ assertTaskExists("extractProtoImportTestX86FreeappDebug")
+
+ // Verify extract tasks exist for androidTest variants
+ assertTaskExists("extractProtoAndroidTestArmFreeappDebug")
+ assertTaskExists("extractProtoImportAndroidTestArmFreeappDebug")
+ assertTaskExists("extractProtoAndroidTestX86FreeappDebug")
+ assertTaskExists("extractProtoImportAndroidTestX86FreeappDebug")
+
+ // Verify the protoImport configuration on main has the dependency
+ val protoImportConfig = configurations.getByName("protoImport")
+ val depCount = protoImportConfig.dependencies.size
+ if (depCount != 1) {
+ throw GradleException("Expected 1 dependency on protoImport, got $depCount")
+ }
+ }
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks/zip/dependency-protos.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks/zip/dependency-protos.zip
new file mode 100644
index 000000000..e612110d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks/zip/dependency-protos.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks_no_kgp/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks_no_kgp/build.gradle.kts
new file mode 100644
index 000000000..57b2d65db
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks_no_kgp/build.gradle.kts
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.api.GradleException
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ id("com.android.application") version ""
+// kotlin("android") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+android {
+ namespace = "com.example.myapp"
+ compileSdk = 34
+
+ flavorDimensions += listOf("abi", "version")
+
+ productFlavors {
+ create("freeapp") {
+ dimension = "version"
+ }
+ create("retailapp") {
+ dimension = "version"
+ }
+ create("x86") {
+ dimension = "abi"
+ }
+ create("arm") {
+ dimension = "abi"
+ }
+ }
+}
+
+dependencies {
+ protoImport(files("zip/dependency-protos.zip"))
+}
+
+fun assertConfigurationExists(name: String) {
+ configurations.findByName(name)
+ ?: throw GradleException("Configuration '$name' does not exist")
+}
+
+fun assertTaskExists(name: String) {
+ tasks.findByName(name)
+ ?: throw GradleException("Task '$name' does not exist")
+}
+
+tasks.register("test_tasks") {
+ doLast {
+ // Verify proto and protoImport configurations exist for root source sets
+ assertConfigurationExists("proto") // main
+ assertConfigurationExists("protoImport") // main
+ assertConfigurationExists("testProto") // test
+ assertConfigurationExists("testProtoImport") // test
+ assertConfigurationExists("androidTestProto")
+ assertConfigurationExists("androidTestProtoImport")
+
+ // Verify proto configurations exist for flavor source sets
+ assertConfigurationExists("armProto")
+ assertConfigurationExists("armProtoImport")
+ assertConfigurationExists("x86Proto")
+ assertConfigurationExists("x86ProtoImport")
+ assertConfigurationExists("freeappProto")
+ assertConfigurationExists("freeappProtoImport")
+ assertConfigurationExists("retailappProto")
+ assertConfigurationExists("retailappProtoImport")
+
+ // Verify proto configurations exist for combined flavor source sets
+ assertConfigurationExists("armFreeappProto")
+ assertConfigurationExists("armFreeappProtoImport")
+ assertConfigurationExists("armRetailappProto")
+ assertConfigurationExists("armRetailappProtoImport")
+ assertConfigurationExists("x86FreeappProto")
+ assertConfigurationExists("x86FreeappProtoImport")
+ assertConfigurationExists("x86RetailappProto")
+ assertConfigurationExists("x86RetailappProtoImport")
+
+ // Verify proto configurations exist for build type source sets
+ assertConfigurationExists("debugProto")
+ assertConfigurationExists("debugProtoImport")
+ assertConfigurationExists("releaseProto")
+ assertConfigurationExists("releaseProtoImport")
+
+ // Verify proto configurations for variant source sets
+ assertConfigurationExists("armFreeappDebugProto")
+ assertConfigurationExists("armFreeappDebugProtoImport")
+ assertConfigurationExists("armFreeappReleaseProto")
+ assertConfigurationExists("armFreeappReleaseProtoImport")
+ assertConfigurationExists("armRetailappDebugProto")
+ assertConfigurationExists("armRetailappDebugProtoImport")
+ assertConfigurationExists("armRetailappReleaseProto")
+ assertConfigurationExists("armRetailappReleaseProtoImport")
+ assertConfigurationExists("x86FreeappDebugProto")
+ assertConfigurationExists("x86FreeappDebugProtoImport")
+ assertConfigurationExists("x86FreeappReleaseProto")
+ assertConfigurationExists("x86FreeappReleaseProtoImport")
+ assertConfigurationExists("x86RetailappDebugProto")
+ assertConfigurationExists("x86RetailappDebugProtoImport")
+ assertConfigurationExists("x86RetailappReleaseProto")
+ assertConfigurationExists("x86RetailappReleaseProtoImport")
+
+ // Verify proto configurations for test variant source sets
+ assertConfigurationExists("testArmFreeappDebugProto")
+ assertConfigurationExists("testArmFreeappDebugProtoImport")
+ assertConfigurationExists("testX86FreeappDebugProto")
+ assertConfigurationExists("testX86FreeappDebugProtoImport")
+
+ // Verify proto configurations for androidTest variant source sets
+ assertConfigurationExists("androidTestArmFreeappDebugProto")
+ assertConfigurationExists("androidTestArmFreeappDebugProtoImport")
+ assertConfigurationExists("androidTestX86FreeappDebugProto")
+ assertConfigurationExists("androidTestX86FreeappDebugProtoImport")
+
+ // Verify extract tasks exist for main variants
+ assertTaskExists("extractProtoArmFreeappDebug")
+ assertTaskExists("extractProtoImportArmFreeappDebug")
+ assertTaskExists("extractProtoArmFreeappRelease")
+ assertTaskExists("extractProtoImportArmFreeappRelease")
+ assertTaskExists("extractProtoArmRetailappDebug")
+ assertTaskExists("extractProtoImportArmRetailappDebug")
+ assertTaskExists("extractProtoArmRetailappRelease")
+ assertTaskExists("extractProtoImportArmRetailappRelease")
+ assertTaskExists("extractProtoX86FreeappDebug")
+ assertTaskExists("extractProtoImportX86FreeappDebug")
+ assertTaskExists("extractProtoX86FreeappRelease")
+ assertTaskExists("extractProtoImportX86FreeappRelease")
+ assertTaskExists("extractProtoX86RetailappDebug")
+ assertTaskExists("extractProtoImportX86RetailappDebug")
+ assertTaskExists("extractProtoX86RetailappRelease")
+ assertTaskExists("extractProtoImportX86RetailappRelease")
+
+ // Verify extract tasks exist for test variants
+ assertTaskExists("extractProtoTestArmFreeappDebug")
+ assertTaskExists("extractProtoImportTestArmFreeappDebug")
+ assertTaskExists("extractProtoTestX86FreeappDebug")
+ assertTaskExists("extractProtoImportTestX86FreeappDebug")
+
+ // Verify extract tasks exist for androidTest variants
+ assertTaskExists("extractProtoAndroidTestArmFreeappDebug")
+ assertTaskExists("extractProtoImportAndroidTestArmFreeappDebug")
+ assertTaskExists("extractProtoAndroidTestX86FreeappDebug")
+ assertTaskExists("extractProtoImportAndroidTestX86FreeappDebug")
+
+ // Verify the protoImport configuration on main has the dependency
+ val protoImportConfig = configurations.getByName("protoImport")
+ val depCount = protoImportConfig.dependencies.size
+ if (depCount != 1) {
+ throw GradleException("Expected 1 dependency on protoImport, got $depCount")
+ }
+ }
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks_no_kgp/zip/dependency-protos.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks_no_kgp/zip/dependency-protos.zip
new file mode 100644
index 000000000..e612110d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_configurations_and_tasks_no_kgp/zip/dependency-protos.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/build.gradle.kts
new file mode 100644
index 000000000..ad3063760
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/build.gradle.kts
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ id("com.android.application") version ""
+ kotlin("android") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+android {
+ namespace = "com.example.myapp"
+ compileSdk = 34
+}
+
+dependencies {
+ proto(files("zip/main-dependency.zip"))
+ protoImport(files("zip/main-import-dependency.zip"))
+
+ testProto(files("zip/test-dependency.zip"))
+ testProtoImport(files("zip/test-import-dependency.zip"))
+
+ testFixturesProto(files("zip/test-fixtures-dependency.zip"))
+ testFixturesProtoImport(files("zip/test-fixtures-import-dependency.zip"))
+
+ testFixturesDebugProto(files("zip/test-fixtures-debug-dependency.zip"))
+ testFixturesDebugProtoImport(files("zip/test-fixtures-debug-import-dependency.zip"))
+
+ testFixturesReleaseProto(files("zip/test-fixtures-release-dependency.zip"))
+ testFixturesReleaseProtoImport(files("zip/test-fixtures-release-import-dependency.zip"))
+
+ androidTestProto(files("zip/android-test-dependency.zip"))
+ androidTestProtoImport(files("zip/android-test-import-dependency.zip"))
+
+ debugProto(files("zip/debug-dependency.zip"))
+ debugProtoImport(files("zip/debug-import-dependency.zip"))
+
+ releaseProto(files("zip/release-dependency.zip"))
+ releaseProtoImport(files("zip/release-import-dependency.zip"))
+
+ testDebugProto(files("zip/test-debug-dependency.zip"))
+ testDebugProtoImport(files("zip/test-debug-import-dependency.zip"))
+
+ testReleaseProto(files("zip/test-release-dependency.zip"))
+ testReleaseProtoImport(files("zip/test-release-import-dependency.zip"))
+
+ androidTestDebugProto(files("zip/android-test-debug-dependency.zip"))
+ androidTestDebugProtoImport(files("zip/android-test-debug-import-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-debug-dependency.zip
new file mode 100644
index 000000000..8ce4fc8b1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-debug-import-dependency.zip
new file mode 100644
index 000000000..dbb2543c5
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-dependency.zip
new file mode 100644
index 000000000..3bc0fda8e
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-import-dependency.zip
new file mode 100644
index 000000000..a287322ae
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/android-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/debug-dependency.zip
new file mode 100644
index 000000000..02e24bdda
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/debug-import-dependency.zip
new file mode 100644
index 000000000..c4cb032ff
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/main-dependency.zip
new file mode 100644
index 000000000..f39a52e2b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/main-import-dependency.zip
new file mode 100644
index 000000000..901f3d56a
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/release-dependency.zip
new file mode 100644
index 000000000..ec4ac10d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/release-import-dependency.zip
new file mode 100644
index 000000000..6c977b626
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-debug-dependency.zip
new file mode 100644
index 000000000..b435cfd8e
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-debug-import-dependency.zip
new file mode 100644
index 000000000..052808462
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-dependency.zip
new file mode 100644
index 000000000..c1e4706e2
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-debug-dependency.zip
new file mode 100644
index 000000000..0712864d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-debug-import-dependency.zip
new file mode 100644
index 000000000..f9188cd8c
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-dependency.zip
new file mode 100644
index 000000000..f7cd508e4
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-import-dependency.zip
new file mode 100644
index 000000000..4d5e39b03
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-release-dependency.zip
new file mode 100644
index 000000000..09e5fc490
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-release-import-dependency.zip
new file mode 100644
index 000000000..1f414a704
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-fixtures-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-import-dependency.zip
new file mode 100644
index 000000000..b2aa090f1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-release-dependency.zip
new file mode 100644
index 000000000..15da56823
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-release-import-dependency.zip
new file mode 100644
index 000000000..7cd5c76cf
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants/zip/test-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/build.gradle.kts
new file mode 100644
index 000000000..974266e81
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/build.gradle.kts
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ id("com.android.application") version ""
+ // No kotlin("android") plugin - using AGP 9.0+ built-in Kotlin
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+android {
+ namespace = "com.example.myapp"
+ compileSdk = 34
+}
+
+dependencies {
+ proto(files("zip/main-dependency.zip"))
+ protoImport(files("zip/main-import-dependency.zip"))
+
+ testProto(files("zip/test-dependency.zip"))
+ testProtoImport(files("zip/test-import-dependency.zip"))
+
+ testFixturesProto(files("zip/test-fixtures-dependency.zip"))
+ testFixturesProtoImport(files("zip/test-fixtures-import-dependency.zip"))
+
+ testFixturesDebugProto(files("zip/test-fixtures-debug-dependency.zip"))
+ testFixturesDebugProtoImport(files("zip/test-fixtures-debug-import-dependency.zip"))
+
+ testFixturesReleaseProto(files("zip/test-fixtures-release-dependency.zip"))
+ testFixturesReleaseProtoImport(files("zip/test-fixtures-release-import-dependency.zip"))
+
+ androidTestProto(files("zip/android-test-dependency.zip"))
+ androidTestProtoImport(files("zip/android-test-import-dependency.zip"))
+
+ debugProto(files("zip/debug-dependency.zip"))
+ debugProtoImport(files("zip/debug-import-dependency.zip"))
+
+ releaseProto(files("zip/release-dependency.zip"))
+ releaseProtoImport(files("zip/release-import-dependency.zip"))
+
+ testDebugProto(files("zip/test-debug-dependency.zip"))
+ testDebugProtoImport(files("zip/test-debug-import-dependency.zip"))
+
+ testReleaseProto(files("zip/test-release-dependency.zip"))
+ testReleaseProtoImport(files("zip/test-release-import-dependency.zip"))
+
+ androidTestDebugProto(files("zip/android-test-debug-dependency.zip"))
+ androidTestDebugProtoImport(files("zip/android-test-debug-import-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-debug-dependency.zip
new file mode 100644
index 000000000..8ce4fc8b1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-debug-import-dependency.zip
new file mode 100644
index 000000000..dbb2543c5
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-dependency.zip
new file mode 100644
index 000000000..3bc0fda8e
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-import-dependency.zip
new file mode 100644
index 000000000..a287322ae
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/android-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/debug-dependency.zip
new file mode 100644
index 000000000..02e24bdda
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/debug-import-dependency.zip
new file mode 100644
index 000000000..c4cb032ff
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/main-dependency.zip
new file mode 100644
index 000000000..f39a52e2b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/main-import-dependency.zip
new file mode 100644
index 000000000..901f3d56a
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/release-dependency.zip
new file mode 100644
index 000000000..ec4ac10d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/release-import-dependency.zip
new file mode 100644
index 000000000..6c977b626
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-debug-dependency.zip
new file mode 100644
index 000000000..b435cfd8e
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-debug-import-dependency.zip
new file mode 100644
index 000000000..052808462
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-dependency.zip
new file mode 100644
index 000000000..c1e4706e2
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-debug-dependency.zip
new file mode 100644
index 000000000..0712864d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-debug-import-dependency.zip
new file mode 100644
index 000000000..f9188cd8c
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-dependency.zip
new file mode 100644
index 000000000..f7cd508e4
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-import-dependency.zip
new file mode 100644
index 000000000..4d5e39b03
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-release-dependency.zip
new file mode 100644
index 000000000..09e5fc490
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-release-import-dependency.zip
new file mode 100644
index 000000000..1f414a704
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-fixtures-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-import-dependency.zip
new file mode 100644
index 000000000..b2aa090f1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-release-dependency.zip
new file mode 100644
index 000000000..15da56823
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-release-import-dependency.zip
new file mode 100644
index 000000000..7cd5c76cf
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcAndroidProjectTest/dependency_proto_per_source_set_all_variants_no_kgp/zip/test-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/build.gradle.kts
new file mode 100644
index 000000000..ae7b0dfbb
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/build.gradle.kts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("jvm") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ proto(files("zip/dependency-protos.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/src/main/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/src/main/proto/some.proto
new file mode 100644
index 000000000..c0b46f49a
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/src/main/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "dependency.proto";
+
+message Some {
+ string content = 1;
+ dependency.DependencyMessage dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/zip/dependency-protos.zip b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/zip/dependency-protos.zip
new file mode 100644
index 000000000..e612110d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_codegen/zip/dependency-protos.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/build.gradle.kts
new file mode 100644
index 000000000..d07d5ad80
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/build.gradle.kts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("jvm") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ proto(files("zip/main-dependency.zip"))
+ protoImport(files("zip/main-import-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/src/main/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/src/main/proto/some.proto
new file mode 100644
index 000000000..9ce4a4156
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/src/main/proto/some.proto
@@ -0,0 +1,5 @@
+syntax = "proto3";
+
+message Some {
+ string content = 1;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/zip/main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/zip/main-dependency.zip
new file mode 100644
index 000000000..dc19f447f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/zip/main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/zip/main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/zip/main-import-dependency.zip
new file mode 100644
index 000000000..aba4520aa
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_extract_tasks_are_cached_properly/zip/main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/build.gradle.kts
new file mode 100644
index 000000000..c11c79d31
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/build.gradle.kts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("jvm") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ protoImport(files("zip/dependency-protos.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/src/main/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/src/main/proto/some.proto
new file mode 100644
index 000000000..c0b46f49a
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/src/main/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "dependency.proto";
+
+message Some {
+ string content = 1;
+ dependency.DependencyMessage dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/zip/dependency-protos.zip b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/zip/dependency-protos.zip
new file mode 100644
index 000000000..e612110d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_import/zip/dependency-protos.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/build.gradle.kts
new file mode 100644
index 000000000..e632ff09d
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/build.gradle.kts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("jvm") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ testProto(files("zip/test-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/src/test/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/src/test/proto/some.proto
new file mode 100644
index 000000000..78346d415
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/src/test/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "testDep.proto";
+
+message Some {
+ string content = 1;
+ dependency.TestDep dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/zip/test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/zip/test-dependency.zip
new file mode 100644
index 000000000..4e40125ac
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_codegen/zip/test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/build.gradle.kts
new file mode 100644
index 000000000..aae1251b6
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/build.gradle.kts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("jvm") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ testProtoImport(files("zip/test-import-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/src/test/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/src/test/proto/some.proto
new file mode 100644
index 000000000..30258e2d0
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/src/test/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "testImportDep.proto";
+
+message Some {
+ string content = 1;
+ dependency.TestImportDep dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/zip/test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/zip/test-import-dependency.zip
new file mode 100644
index 000000000..f95b014e1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcJvmProjectTest/dependency_proto_test_import/zip/test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/build.gradle.kts
new file mode 100644
index 000000000..0357e9c4a
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/build.gradle.kts
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+kotlin {
+ jvm()
+ sourceSets {
+ create("common2")
+ }
+}
+
+rpc {
+ protoc()
+}
+
+protoSourceSets {
+ named("commonMain") {
+ importsFrom(project.provider { protoSourceSets.getByName("common2") })
+ }
+}
+
+dependencies {
+ "common2ProtoImport"(files("zip/common-2-import-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/src/common2/proto/common2.proto b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/src/common2/proto/common2.proto
new file mode 100644
index 000000000..baf033503
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/src/common2/proto/common2.proto
@@ -0,0 +1,5 @@
+syntax = "proto3";
+
+message Common2Message {
+ string value = 1;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/src/commonMain/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/src/commonMain/proto/some.proto
new file mode 100644
index 000000000..dd16daa73
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/src/commonMain/proto/some.proto
@@ -0,0 +1,10 @@
+syntax = "proto3";
+
+import "common2.proto";
+import "common2ImportDep.proto";
+
+message Some {
+ string content = 1;
+ AuxMessage aux = 2;
+ dependency.CommonAuxImportDep dep = 3;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/zip/common-2-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/zip/common-2-import-dependency.zip
new file mode 100644
index 000000000..3458fa072
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_imports_from_provider_source_set/zip/common-2-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/build.gradle.kts
new file mode 100644
index 000000000..263f5b862
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/build.gradle.kts
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+kotlin {
+ jvm()
+ js {
+ nodejs()
+ }
+ macosArm64()
+
+ sourceSets {
+ commonMain.dependencies {
+ proto(files("zip/common-main-dependency.zip"))
+ protoImport(files("zip/common-main-import-dependency.zip"))
+ }
+ commonTest.dependencies {
+ proto(files("zip/common-test-dependency.zip"))
+ protoImport(files("zip/common-test-import-dependency.zip"))
+ }
+
+ nativeMain.dependencies {
+ proto(files("zip/native-main-dependency.zip"))
+ protoImport(files("zip/native-main-import-dependency.zip"))
+ }
+ nativeTest.dependencies {
+ proto(files("zip/native-test-dependency.zip"))
+ protoImport(files("zip/native-test-import-dependency.zip"))
+ }
+
+ appleMain.dependencies {
+ proto(files("zip/apple-main-dependency.zip"))
+ protoImport(files("zip/apple-main-import-dependency.zip"))
+ }
+ appleTest.dependencies {
+ proto(files("zip/apple-test-dependency.zip"))
+ protoImport(files("zip/apple-test-import-dependency.zip"))
+ }
+
+ macosMain.dependencies {
+ proto(files("zip/macos-main-dependency.zip"))
+ protoImport(files("zip/macos-main-import-dependency.zip"))
+ }
+ macosTest.dependencies {
+ proto(files("zip/macos-test-dependency.zip"))
+ protoImport(files("zip/macos-test-import-dependency.zip"))
+ }
+
+ macosArm64Main.dependencies {
+ proto(files("zip/macos-arm64-main-dependency.zip"))
+ protoImport(files("zip/macos-arm64-main-import-dependency.zip"))
+ }
+ macosArm64Test.dependencies {
+ proto(files("zip/macos-arm64-test-dependency.zip"))
+ protoImport(files("zip/macos-arm64-test-import-dependency.zip"))
+ }
+
+ jvmMain.dependencies {
+ proto(files("zip/jvm-main-dependency.zip"))
+ protoImport(files("zip/jvm-main-import-dependency.zip"))
+ }
+ jvmTest.dependencies {
+ proto(files("zip/jvm-test-dependency.zip"))
+ protoImport(files("zip/jvm-test-import-dependency.zip"))
+ }
+
+ jsMain.dependencies {
+ proto(files("zip/js-main-dependency.zip"))
+ protoImport(files("zip/js-main-import-dependency.zip"))
+ }
+ jsTest.dependencies {
+ proto(files("zip/js-test-dependency.zip"))
+ protoImport(files("zip/js-test-import-dependency.zip"))
+ }
+
+ if ("" >= "2.2.20") {
+ configureEach {
+ if (name == "webMain") dependencies {
+ proto(files("zip/web-main-dependency.zip"))
+ protoImport(files("zip/web-main-import-dependency.zip"))
+ }
+ }
+ configureEach {
+ if (name == "webTest") dependencies {
+ proto(files("zip/web-test-dependency.zip"))
+ protoImport(files("zip/web-test-import-dependency.zip"))
+ }
+ }
+ }
+ }
+}
+
+rpc {
+ protoc()
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-main-dependency.zip
new file mode 100644
index 000000000..c3ff957ef
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-main-import-dependency.zip
new file mode 100644
index 000000000..1ce6bf596
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-test-dependency.zip
new file mode 100644
index 000000000..4169e7d76
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-test-import-dependency.zip
new file mode 100644
index 000000000..f0915df19
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/apple-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-main-dependency.zip
new file mode 100644
index 000000000..d196d8161
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-main-import-dependency.zip
new file mode 100644
index 000000000..a09b894bd
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-test-dependency.zip
new file mode 100644
index 000000000..ddb6d203a
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-test-import-dependency.zip
new file mode 100644
index 000000000..fa3d4a8da
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/common-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-main-dependency.zip
new file mode 100644
index 000000000..f4273ce10
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-main-import-dependency.zip
new file mode 100644
index 000000000..5be39ebde
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-test-dependency.zip
new file mode 100644
index 000000000..3900bda2d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-test-import-dependency.zip
new file mode 100644
index 000000000..61e165cd3
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/js-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-main-dependency.zip
new file mode 100644
index 000000000..d95aea910
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-main-import-dependency.zip
new file mode 100644
index 000000000..16af799bf
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-test-dependency.zip
new file mode 100644
index 000000000..b1e5f6aae
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-test-import-dependency.zip
new file mode 100644
index 000000000..fe1f812f1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/jvm-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-main-dependency.zip
new file mode 100644
index 000000000..474dc3669
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-main-import-dependency.zip
new file mode 100644
index 000000000..39c112e34
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-test-dependency.zip
new file mode 100644
index 000000000..0cf02b32d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-test-import-dependency.zip
new file mode 100644
index 000000000..f4ad8cd4b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-arm64-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-main-dependency.zip
new file mode 100644
index 000000000..1c6007e8e
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-main-import-dependency.zip
new file mode 100644
index 000000000..ef93cc181
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-test-dependency.zip
new file mode 100644
index 000000000..e7504a8b7
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-test-import-dependency.zip
new file mode 100644
index 000000000..54fd5e988
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/macos-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-main-dependency.zip
new file mode 100644
index 000000000..8690045bf
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-main-import-dependency.zip
new file mode 100644
index 000000000..45cc0be38
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-test-dependency.zip
new file mode 100644
index 000000000..038805c10
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-test-import-dependency.zip
new file mode 100644
index 000000000..548a859c3
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/native-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-main-dependency.zip
new file mode 100644
index 000000000..737935d78
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-main-import-dependency.zip
new file mode 100644
index 000000000..8028fa4f1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-test-dependency.zip
new file mode 100644
index 000000000..8d2a87376
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-test-import-dependency.zip
new file mode 100644
index 000000000..da5512caf
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy/zip/web-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/build.gradle.kts
new file mode 100644
index 000000000..2cc582d00
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/build.gradle.kts
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+ id("com.android.kotlin.multiplatform.library") version ""
+}
+
+kotlin {
+ jvm()
+ androidLibrary {
+ namespace = "com.example.namespace"
+ compileSdk = 34
+ }
+
+ sourceSets {
+ commonMain.dependencies {
+ proto(files("zip/common-main-dependency.zip"))
+ protoImport(files("zip/common-main-import-dependency.zip"))
+ }
+ commonTest.dependencies {
+ proto(files("zip/common-test-dependency.zip"))
+ protoImport(files("zip/common-test-import-dependency.zip"))
+ }
+
+ jvmMain.dependencies {
+ proto(files("zip/jvm-main-dependency.zip"))
+ protoImport(files("zip/jvm-main-import-dependency.zip"))
+ }
+ jvmTest.dependencies {
+ proto(files("zip/jvm-test-dependency.zip"))
+ protoImport(files("zip/jvm-test-import-dependency.zip"))
+ }
+
+ androidMain.dependencies {
+ proto(files("zip/android-main-dependency.zip"))
+ protoImport(files("zip/android-main-import-dependency.zip"))
+ }
+ }
+}
+
+rpc {
+ protoc()
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/android-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/android-main-dependency.zip
new file mode 100644
index 000000000..1b8be9413
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/android-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/android-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/android-main-import-dependency.zip
new file mode 100644
index 000000000..db33717cb
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/android-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-main-dependency.zip
new file mode 100644
index 000000000..226ba4934
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-main-import-dependency.zip
new file mode 100644
index 000000000..d7ce64fc9
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-test-dependency.zip
new file mode 100644
index 000000000..fafff5890
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-test-import-dependency.zip
new file mode 100644
index 000000000..4f463794b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/common-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-main-dependency.zip
new file mode 100644
index 000000000..90644d21f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-main-import-dependency.zip
new file mode 100644
index 000000000..61fd9a88d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-test-dependency.zip
new file mode 100644
index 000000000..6ffba2629
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-test-import-dependency.zip
new file mode 100644
index 000000000..3437c1f46
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library/zip/jvm-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/build.gradle.kts
new file mode 100644
index 000000000..e6c764e5f
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/build.gradle.kts
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+ id("com.android.kotlin.multiplatform.library") version ""
+}
+
+kotlin {
+ jvm()
+ androidLibrary {
+ namespace = "com.example.namespace"
+ compileSdk = 34
+
+ withDeviceTestBuilder {
+ sourceSetTreeName = "test"
+ }
+
+ withHostTestBuilder {
+ sourceSetTreeName = "test"
+ }
+ }
+
+ sourceSets {
+ commonMain.dependencies {
+ proto(files("zip/common-main-dependency.zip"))
+ protoImport(files("zip/common-main-import-dependency.zip"))
+ }
+ commonTest.dependencies {
+ proto(files("zip/common-test-dependency.zip"))
+ protoImport(files("zip/common-test-import-dependency.zip"))
+ }
+
+ jvmMain.dependencies {
+ proto(files("zip/jvm-main-dependency.zip"))
+ protoImport(files("zip/jvm-main-import-dependency.zip"))
+ }
+ jvmTest.dependencies {
+ proto(files("zip/jvm-test-dependency.zip"))
+ protoImport(files("zip/jvm-test-import-dependency.zip"))
+ }
+
+ androidMain.dependencies {
+ proto(files("zip/android-main-dependency.zip"))
+ protoImport(files("zip/android-main-import-dependency.zip"))
+ }
+
+ named("androidHostTest").dependencies {
+ proto(files("zip/android-host-test-dependency.zip"))
+ protoImport(files("zip/android-host-test-import-dependency.zip"))
+ }
+
+ named("androidDeviceTest").dependencies {
+ proto(files("zip/android-device-test-dependency.zip"))
+ protoImport(files("zip/android-device-test-import-dependency.zip"))
+ }
+ }
+}
+
+rpc {
+ protoc()
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-device-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-device-test-dependency.zip
new file mode 100644
index 000000000..9481f1533
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-device-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-device-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-device-test-import-dependency.zip
new file mode 100644
index 000000000..0f5ce47c1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-device-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-host-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-host-test-dependency.zip
new file mode 100644
index 000000000..8bd5d6b10
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-host-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-host-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-host-test-import-dependency.zip
new file mode 100644
index 000000000..c36cfcb2d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-host-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-main-dependency.zip
new file mode 100644
index 000000000..1b8be9413
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-main-import-dependency.zip
new file mode 100644
index 000000000..db33717cb
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/android-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-main-dependency.zip
new file mode 100644
index 000000000..226ba4934
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-main-import-dependency.zip
new file mode 100644
index 000000000..d7ce64fc9
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-test-dependency.zip
new file mode 100644
index 000000000..fafff5890
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-test-import-dependency.zip
new file mode 100644
index 000000000..4f463794b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/common-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-main-dependency.zip
new file mode 100644
index 000000000..90644d21f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-main-import-dependency.zip
new file mode 100644
index 000000000..61fd9a88d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-test-dependency.zip
new file mode 100644
index 000000000..6ffba2629
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-test-import-dependency.zip
new file mode 100644
index 000000000..3437c1f46
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks/zip/jvm-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/build.gradle.kts
new file mode 100644
index 000000000..ff0e7a589
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/build.gradle.kts
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+ id("com.android.kotlin.multiplatform.library") version ""
+}
+
+kotlin {
+ jvm()
+ androidLibrary {
+ namespace = "com.example.namespace"
+ compileSdk = 34
+
+ withDeviceTestBuilder { }
+
+ withHostTestBuilder { }
+ }
+
+ sourceSets {
+ commonMain.dependencies {
+ proto(files("zip/common-main-dependency.zip"))
+ protoImport(files("zip/common-main-import-dependency.zip"))
+ }
+ commonTest.dependencies {
+ proto(files("zip/common-test-dependency.zip"))
+ protoImport(files("zip/common-test-import-dependency.zip"))
+ }
+
+ jvmMain.dependencies {
+ proto(files("zip/jvm-main-dependency.zip"))
+ protoImport(files("zip/jvm-main-import-dependency.zip"))
+ }
+ jvmTest.dependencies {
+ proto(files("zip/jvm-test-dependency.zip"))
+ protoImport(files("zip/jvm-test-import-dependency.zip"))
+ }
+
+ androidMain.dependencies {
+ proto(files("zip/android-main-dependency.zip"))
+ protoImport(files("zip/android-main-import-dependency.zip"))
+ }
+
+ named("androidHostTest").dependencies {
+ proto(files("zip/android-host-test-dependency.zip"))
+ protoImport(files("zip/android-host-test-import-dependency.zip"))
+ }
+
+ named("androidDeviceTest").dependencies {
+ proto(files("zip/android-device-test-dependency.zip"))
+ protoImport(files("zip/android-device-test-import-dependency.zip"))
+ }
+ }
+}
+
+rpc {
+ protoc()
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-device-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-device-test-dependency.zip
new file mode 100644
index 000000000..9481f1533
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-device-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-device-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-device-test-import-dependency.zip
new file mode 100644
index 000000000..0f5ce47c1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-device-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-host-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-host-test-dependency.zip
new file mode 100644
index 000000000..8bd5d6b10
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-host-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-host-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-host-test-import-dependency.zip
new file mode 100644
index 000000000..c36cfcb2d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-host-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-main-dependency.zip
new file mode 100644
index 000000000..1b8be9413
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-main-import-dependency.zip
new file mode 100644
index 000000000..db33717cb
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/android-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-main-dependency.zip
new file mode 100644
index 000000000..226ba4934
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-main-import-dependency.zip
new file mode 100644
index 000000000..d7ce64fc9
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-test-dependency.zip
new file mode 100644
index 000000000..fafff5890
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-test-import-dependency.zip
new file mode 100644
index 000000000..4f463794b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/common-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-main-dependency.zip
new file mode 100644
index 000000000..90644d21f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-main-import-dependency.zip
new file mode 100644
index 000000000..61fd9a88d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-test-dependency.zip
new file mode 100644
index 000000000..6ffba2629
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-test-import-dependency.zip
new file mode 100644
index 000000000..3437c1f46
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_android_kmp_library_with_test_tasks_not_wired/zip/jvm-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/build.gradle.kts
new file mode 100644
index 000000000..8cbb4ec54
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/build.gradle.kts
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+ id("com.android.application") version ""
+}
+
+kotlin {
+ jvm()
+
+ androidTarget {
+ instrumentedTestVariant {
+ sourceSetTree.set(KotlinSourceSetTree.test)
+ }
+
+ unitTestVariant {
+ sourceSetTree.set(KotlinSourceSetTree.test)
+ }
+ }
+
+ sourceSets {
+ commonMain.dependencies {
+ proto(files("zip/common-main-dependency.zip"))
+ protoImport(files("zip/common-main-import-dependency.zip"))
+ }
+ commonTest.dependencies {
+ proto(files("zip/common-test-dependency.zip"))
+ protoImport(files("zip/common-test-import-dependency.zip"))
+ }
+
+ jvmMain.dependencies {
+ proto(files("zip/jvm-main-dependency.zip"))
+ protoImport(files("zip/jvm-main-import-dependency.zip"))
+ }
+ jvmTest.dependencies {
+ proto(files("zip/jvm-test-dependency.zip"))
+ protoImport(files("zip/jvm-test-import-dependency.zip"))
+ }
+ }
+}
+
+android {
+ namespace = "com.example.myapp"
+ compileSdk = 34
+}
+
+rpc {
+ protoc()
+}
+
+configurations.all {
+ if (name.endsWith("Proto") || name.endsWith("ProtoImport")) {
+ println("configuration: $name")
+ }
+}
+
+dependencies {
+ // KMP android non-executable
+ "androidMainProto"(files("zip/android-main-dependency.zip"))
+ "androidMainProtoImport"(files("zip/android-main-import-dependency.zip"))
+
+ "androidTestProto"(files("zip/android-test-dependency.zip"))
+ "androidTestProtoImport"(files("zip/android-test-import-dependency.zip"))
+
+ "androidUnitTestProto"(files("zip/android-unit-test-dependency.zip"))
+ "androidUnitTestProtoImport"(files("zip/android-unit-test-import-dependency.zip"))
+
+ "androidInstrumentedTestProto"(files("zip/android-instrumented-test-dependency.zip"))
+ "androidInstrumentedTestProtoImport"(files("zip/android-instrumented-test-import-dependency.zip"))
+
+ // KMP android executable (these are created in a wierd way and probably are not used in real life anyway)
+ afterEvaluate {
+ "androidDebugProto"(files("zip/android-debug-dependency.zip"))
+ "androidDebugProtoImport"(files("zip/android-debug-import-dependency.zip"))
+
+ "androidReleaseProto"(files("zip/android-release-dependency.zip"))
+ "androidReleaseProtoImport"(files("zip/android-release-import-dependency.zip"))
+
+ "androidUnitTestDebugProto"(files("zip/android-unit-test-debug-dependency.zip"))
+ "androidUnitTestDebugProtoImport"(files("zip/android-unit-test-debug-import-dependency.zip"))
+
+ "androidUnitTestReleaseProto"(files("zip/android-unit-test-release-dependency.zip"))
+ "androidUnitTestReleaseProtoImport"(files("zip/android-unit-test-release-import-dependency.zip"))
+
+ "androidInstrumentedTestDebugProto"(files("zip/android-instrumented-test-debug-dependency.zip"))
+ "androidInstrumentedTestDebugProtoImport"(files("zip/android-instrumented-test-debug-import-dependency.zip"))
+ }
+
+ // legacy android non-executable
+ proto(files("zip/main-dependency.zip"))
+ protoImport(files("zip/main-import-dependency.zip"))
+
+ testProto(files("zip/test-dependency.zip"))
+ testProtoImport(files("zip/test-import-dependency.zip"))
+
+ testFixturesProto(files("zip/test-fixtures-dependency.zip"))
+ testFixturesProtoImport(files("zip/test-fixtures-import-dependency.zip"))
+
+ testFixturesDebugProto(files("zip/test-fixtures-debug-dependency.zip"))
+ testFixturesDebugProtoImport(files("zip/test-fixtures-debug-import-dependency.zip"))
+
+ testFixturesReleaseProto(files("zip/test-fixtures-release-dependency.zip"))
+ testFixturesReleaseProtoImport(files("zip/test-fixtures-release-import-dependency.zip"))
+
+ androidTestProto(files("zip/android-test-dependency.zip"))
+ androidTestProtoImport(files("zip/android-test-import-dependency.zip"))
+
+ // legacy android variants
+ debugProto(files("zip/debug-dependency.zip"))
+ debugProtoImport(files("zip/debug-import-dependency.zip"))
+
+ releaseProto(files("zip/release-dependency.zip"))
+ releaseProtoImport(files("zip/release-import-dependency.zip"))
+
+ testDebugProto(files("zip/test-debug-dependency.zip"))
+ testDebugProtoImport(files("zip/test-debug-import-dependency.zip"))
+
+ testReleaseProto(files("zip/test-release-dependency.zip"))
+ testReleaseProtoImport(files("zip/test-release-import-dependency.zip"))
+
+ androidTestDebugProto(files("zip/android-test-debug-dependency.zip"))
+ androidTestDebugProtoImport(files("zip/android-test-debug-import-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-debug-dependency.zip
new file mode 100644
index 000000000..170ca4c65
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-debug-import-dependency.zip
new file mode 100644
index 000000000..d266794d0
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-debug-dependency.zip
new file mode 100644
index 000000000..5d120b780
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-debug-import-dependency.zip
new file mode 100644
index 000000000..e4797ea35
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-dependency.zip
new file mode 100644
index 000000000..f3f52af56
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-import-dependency.zip
new file mode 100644
index 000000000..7f81cdf9b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-instrumented-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-main-dependency.zip
new file mode 100644
index 000000000..1b8be9413
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-main-import-dependency.zip
new file mode 100644
index 000000000..db33717cb
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-release-dependency.zip
new file mode 100644
index 000000000..6daaeb60f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-release-import-dependency.zip
new file mode 100644
index 000000000..ea2377613
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-debug-dependency.zip
new file mode 100644
index 000000000..474b2849d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-debug-import-dependency.zip
new file mode 100644
index 000000000..09462b160
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-dependency.zip
new file mode 100644
index 000000000..003b00ccc
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-import-dependency.zip
new file mode 100644
index 000000000..66ec2b257
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-debug-dependency.zip
new file mode 100644
index 000000000..b8f6e77c7
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-debug-import-dependency.zip
new file mode 100644
index 000000000..8e3d505ab
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-dependency.zip
new file mode 100644
index 000000000..23ca25887
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-import-dependency.zip
new file mode 100644
index 000000000..5f4122220
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-release-dependency.zip
new file mode 100644
index 000000000..0908c3d71
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-release-import-dependency.zip
new file mode 100644
index 000000000..1e4c446f2
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/android-unit-test-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-main-dependency.zip
new file mode 100644
index 000000000..226ba4934
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-main-import-dependency.zip
new file mode 100644
index 000000000..d7ce64fc9
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-test-dependency.zip
new file mode 100644
index 000000000..fafff5890
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-test-import-dependency.zip
new file mode 100644
index 000000000..4f463794b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/common-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/debug-dependency.zip
new file mode 100644
index 000000000..86bb2e511
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/debug-import-dependency.zip
new file mode 100644
index 000000000..e255a4815
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-main-dependency.zip
new file mode 100644
index 000000000..90644d21f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-main-import-dependency.zip
new file mode 100644
index 000000000..61fd9a88d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-test-dependency.zip
new file mode 100644
index 000000000..6ffba2629
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-test-import-dependency.zip
new file mode 100644
index 000000000..3437c1f46
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/jvm-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/main-dependency.zip
new file mode 100644
index 000000000..39402ac5a
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/main-import-dependency.zip
new file mode 100644
index 000000000..970e93158
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/release-dependency.zip
new file mode 100644
index 000000000..e7b3feb6e
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/release-import-dependency.zip
new file mode 100644
index 000000000..7ad520895
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-debug-dependency.zip
new file mode 100644
index 000000000..3f57104bf
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-debug-import-dependency.zip
new file mode 100644
index 000000000..f15b21721
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-dependency.zip
new file mode 100644
index 000000000..5b372e614
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-debug-dependency.zip
new file mode 100644
index 000000000..0697179a8
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-debug-import-dependency.zip
new file mode 100644
index 000000000..3da5dd47d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-dependency.zip
new file mode 100644
index 000000000..0c2cda598
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-import-dependency.zip
new file mode 100644
index 000000000..bce910651
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-release-dependency.zip
new file mode 100644
index 000000000..0ba7a12f3
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-release-import-dependency.zip
new file mode 100644
index 000000000..2f22a97de
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-fixtures-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-import-dependency.zip
new file mode 100644
index 000000000..c35ced988
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-release-dependency.zip
new file mode 100644
index 000000000..f3eb69927
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-release-import-dependency.zip
new file mode 100644
index 000000000..92c1da678
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android/zip/test-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/build.gradle.kts
new file mode 100644
index 000000000..1fcbb4009
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/build.gradle.kts
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+ id("com.android.application") version ""
+}
+
+kotlin {
+ jvm()
+
+ androidTarget { }
+
+ sourceSets {
+ commonMain.dependencies {
+ proto(files("zip/common-main-dependency.zip"))
+ protoImport(files("zip/common-main-import-dependency.zip"))
+ }
+ commonTest.dependencies {
+ proto(files("zip/common-test-dependency.zip"))
+ protoImport(files("zip/common-test-import-dependency.zip"))
+ }
+
+ jvmMain.dependencies {
+ proto(files("zip/jvm-main-dependency.zip"))
+ protoImport(files("zip/jvm-main-import-dependency.zip"))
+ }
+ jvmTest.dependencies {
+ proto(files("zip/jvm-test-dependency.zip"))
+ protoImport(files("zip/jvm-test-import-dependency.zip"))
+ }
+ }
+}
+
+android {
+ namespace = "com.example.myapp"
+ compileSdk = 34
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ // KMP android non-executable
+ "androidMainProto"(files("zip/android-main-dependency.zip"))
+ "androidMainProtoImport"(files("zip/android-main-import-dependency.zip"))
+
+ "androidTestProto"(files("zip/android-test-dependency.zip"))
+ "androidTestProtoImport"(files("zip/android-test-import-dependency.zip"))
+
+ "androidUnitTestProto"(files("zip/android-unit-test-dependency.zip"))
+ "androidUnitTestProtoImport"(files("zip/android-unit-test-import-dependency.zip"))
+
+ "androidInstrumentedTestProto"(files("zip/android-instrumented-test-dependency.zip"))
+ "androidInstrumentedTestProtoImport"(files("zip/android-instrumented-test-import-dependency.zip"))
+
+ // KMP android executable (these are created in a wierd way and probably are not used in real life anyway)
+ afterEvaluate {
+ "androidDebugProto"(files("zip/android-debug-dependency.zip"))
+ "androidDebugProtoImport"(files("zip/android-debug-import-dependency.zip"))
+
+ "androidReleaseProto"(files("zip/android-release-dependency.zip"))
+ "androidReleaseProtoImport"(files("zip/android-release-import-dependency.zip"))
+
+ "androidUnitTestDebugProto"(files("zip/android-unit-test-debug-dependency.zip"))
+ "androidUnitTestDebugProtoImport"(files("zip/android-unit-test-debug-import-dependency.zip"))
+
+ "androidUnitTestReleaseProto"(files("zip/android-unit-test-release-dependency.zip"))
+ "androidUnitTestReleaseProtoImport"(files("zip/android-unit-test-release-import-dependency.zip"))
+
+ "androidInstrumentedTestDebugProto"(files("zip/android-instrumented-test-debug-dependency.zip"))
+ "androidInstrumentedTestDebugProtoImport"(files("zip/android-instrumented-test-debug-import-dependency.zip"))
+ }
+
+ // legacy android non-executable
+ proto(files("zip/main-dependency.zip"))
+ protoImport(files("zip/main-import-dependency.zip"))
+
+ testProto(files("zip/test-dependency.zip"))
+ testProtoImport(files("zip/test-import-dependency.zip"))
+
+ testFixturesProto(files("zip/test-fixtures-dependency.zip"))
+ testFixturesProtoImport(files("zip/test-fixtures-import-dependency.zip"))
+
+ testFixturesDebugProto(files("zip/test-fixtures-debug-dependency.zip"))
+ testFixturesDebugProtoImport(files("zip/test-fixtures-debug-import-dependency.zip"))
+
+ testFixturesReleaseProto(files("zip/test-fixtures-release-dependency.zip"))
+ testFixturesReleaseProtoImport(files("zip/test-fixtures-release-import-dependency.zip"))
+
+ androidTestProto(files("zip/android-test-dependency.zip"))
+ androidTestProtoImport(files("zip/android-test-import-dependency.zip"))
+
+ // legacy android variants
+ debugProto(files("zip/debug-dependency.zip"))
+ debugProtoImport(files("zip/debug-import-dependency.zip"))
+
+ releaseProto(files("zip/release-dependency.zip"))
+ releaseProtoImport(files("zip/release-import-dependency.zip"))
+
+ testDebugProto(files("zip/test-debug-dependency.zip"))
+ testDebugProtoImport(files("zip/test-debug-import-dependency.zip"))
+
+ testReleaseProto(files("zip/test-release-dependency.zip"))
+ testReleaseProtoImport(files("zip/test-release-import-dependency.zip"))
+
+ androidTestDebugProto(files("zip/android-test-debug-dependency.zip"))
+ androidTestDebugProtoImport(files("zip/android-test-debug-import-dependency.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-debug-dependency.zip
new file mode 100644
index 000000000..170ca4c65
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-debug-import-dependency.zip
new file mode 100644
index 000000000..d266794d0
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-debug-dependency.zip
new file mode 100644
index 000000000..5d120b780
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-debug-import-dependency.zip
new file mode 100644
index 000000000..e4797ea35
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-dependency.zip
new file mode 100644
index 000000000..f3f52af56
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-import-dependency.zip
new file mode 100644
index 000000000..7f81cdf9b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-instrumented-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-main-dependency.zip
new file mode 100644
index 000000000..1b8be9413
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-main-import-dependency.zip
new file mode 100644
index 000000000..db33717cb
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-release-dependency.zip
new file mode 100644
index 000000000..6daaeb60f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-release-import-dependency.zip
new file mode 100644
index 000000000..ea2377613
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-debug-dependency.zip
new file mode 100644
index 000000000..474b2849d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-debug-import-dependency.zip
new file mode 100644
index 000000000..09462b160
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-dependency.zip
new file mode 100644
index 000000000..003b00ccc
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-import-dependency.zip
new file mode 100644
index 000000000..66ec2b257
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-debug-dependency.zip
new file mode 100644
index 000000000..b8f6e77c7
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-debug-import-dependency.zip
new file mode 100644
index 000000000..8e3d505ab
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-dependency.zip
new file mode 100644
index 000000000..23ca25887
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-import-dependency.zip
new file mode 100644
index 000000000..5f4122220
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-release-dependency.zip
new file mode 100644
index 000000000..0908c3d71
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-release-import-dependency.zip
new file mode 100644
index 000000000..1e4c446f2
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/android-unit-test-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-main-dependency.zip
new file mode 100644
index 000000000..226ba4934
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-main-import-dependency.zip
new file mode 100644
index 000000000..d7ce64fc9
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-test-dependency.zip
new file mode 100644
index 000000000..fafff5890
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-test-import-dependency.zip
new file mode 100644
index 000000000..4f463794b
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/common-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/debug-dependency.zip
new file mode 100644
index 000000000..86bb2e511
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/debug-import-dependency.zip
new file mode 100644
index 000000000..e255a4815
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-main-dependency.zip
new file mode 100644
index 000000000..90644d21f
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-main-import-dependency.zip
new file mode 100644
index 000000000..61fd9a88d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-test-dependency.zip
new file mode 100644
index 000000000..6ffba2629
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-test-import-dependency.zip
new file mode 100644
index 000000000..3437c1f46
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/jvm-test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/main-dependency.zip
new file mode 100644
index 000000000..39402ac5a
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/main-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/main-import-dependency.zip
new file mode 100644
index 000000000..970e93158
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/main-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/release-dependency.zip
new file mode 100644
index 000000000..e7b3feb6e
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/release-import-dependency.zip
new file mode 100644
index 000000000..7ad520895
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-debug-dependency.zip
new file mode 100644
index 000000000..3f57104bf
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-debug-import-dependency.zip
new file mode 100644
index 000000000..f15b21721
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-dependency.zip
new file mode 100644
index 000000000..5b372e614
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-debug-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-debug-dependency.zip
new file mode 100644
index 000000000..0697179a8
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-debug-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-debug-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-debug-import-dependency.zip
new file mode 100644
index 000000000..3da5dd47d
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-debug-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-dependency.zip
new file mode 100644
index 000000000..0c2cda598
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-import-dependency.zip
new file mode 100644
index 000000000..bce910651
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-release-dependency.zip
new file mode 100644
index 000000000..0ba7a12f3
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-release-import-dependency.zip
new file mode 100644
index 000000000..2f22a97de
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-fixtures-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-import-dependency.zip
new file mode 100644
index 000000000..c35ced988
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-release-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-release-dependency.zip
new file mode 100644
index 000000000..f3eb69927
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-release-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-release-import-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-release-import-dependency.zip
new file mode 100644
index 000000000..92c1da678
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_kmp_hierarchy_legacy_android_not_wired/zip/test-release-import-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/build.gradle.kts
new file mode 100644
index 000000000..66c755b02
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/build.gradle.kts
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+kotlin {
+ jvm()
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ commonMainProto(files("zip/dependency-protos.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/src/commonMain/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/src/commonMain/proto/some.proto
new file mode 100644
index 000000000..c0b46f49a
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/src/commonMain/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "dependency.proto";
+
+message Some {
+ string content = 1;
+ dependency.DependencyMessage dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/zip/dependency-protos.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/zip/dependency-protos.zip
new file mode 100644
index 000000000..e612110d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen/zip/dependency-protos.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/build.gradle.kts
new file mode 100644
index 000000000..7571fc5dd
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/build.gradle.kts
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+kotlin {
+ jvm()
+
+ sourceSets {
+ commonMain {
+ dependencies {
+ proto(files("zip/common-main-dependency.zip"))
+ }
+ }
+ }
+}
+
+rpc {
+ protoc()
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/src/commonMain/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/src/commonMain/proto/some.proto
new file mode 100644
index 000000000..d6118d37b
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/src/commonMain/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "commonMainDep.proto";
+
+message Some {
+ string content = 1;
+ dependency.CommonMainDep dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/zip/common-main-dependency.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/zip/common-main-dependency.zip
new file mode 100644
index 000000000..71a307b5a
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_codegen_kmp_dsl/zip/common-main-dependency.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/build.gradle.kts
new file mode 100644
index 000000000..cf3a2e7d0
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/build.gradle.kts
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+kotlin {
+ jvm()
+}
+
+rpc {
+ protoc()
+}
+
+dependencies {
+ commonMainProtoImport(files("zip/dependency-protos.zip"))
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/src/commonMain/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/src/commonMain/proto/some.proto
new file mode 100644
index 000000000..c0b46f49a
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/src/commonMain/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "dependency.proto";
+
+message Some {
+ string content = 1;
+ dependency.DependencyMessage dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/zip/dependency-protos.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/zip/dependency-protos.zip
new file mode 100644
index 000000000..e612110d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import/zip/dependency-protos.zip differ
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/build.gradle.kts b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/build.gradle.kts
new file mode 100644
index 000000000..ef882dc88
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/build.gradle.kts
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.gradle.kotlin.dsl.version
+import kotlinx.rpc.protoc.*
+
+plugins {
+ kotlin("multiplatform") version ""
+ id("org.jetbrains.kotlinx.rpc.plugin") version ""
+}
+
+kotlin {
+ jvm()
+
+ sourceSets {
+ commonMain {
+ dependencies {
+ protoImport(files("zip/dependency-protos.zip"))
+ }
+ }
+ }
+}
+
+rpc {
+ protoc()
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/src/commonMain/proto/some.proto b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/src/commonMain/proto/some.proto
new file mode 100644
index 000000000..c0b46f49a
--- /dev/null
+++ b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/src/commonMain/proto/some.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+import "dependency.proto";
+
+message Some {
+ string content = 1;
+ dependency.DependencyMessage dep = 2;
+}
diff --git a/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/zip/dependency-protos.zip b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/zip/dependency-protos.zip
new file mode 100644
index 000000000..e612110d1
Binary files /dev/null and b/gradle-plugin/src/test/resources/projects/GrpcKmpProjectTest/dependency_proto_import_kmp_dsl/zip/dependency-protos.zip differ