AGP8.7.3+Gradle8.9跨项目依赖变体不匹配构建失败求助
AGP 8.7.3 + Gradle 8.9 跨项目依赖变体匹配失败问题解决
问题背景
现有两个已升级至AGP 8.7.3、Gradle 8.9的项目:app项目包含base等模块,android项目包含admin等模块。base模块依赖admin模块,构建android项目正常,但构建app项目时触发任务执行失败:
Execution failed for task ':base:collectDependencies'
核心原因是productFlavor维度不匹配:
- standard维度值不匹配:base模块使用
isoStandard,admin模块使用iso - 维度缺失:admin模块缺少base项目中配置的
contentType、environment维度
错误详情
> Could not resolve all dependencies for configuration ':base:demoProductionIsoStandardDebugCompileClasspath'. > Could not resolve com.x.x:admin:0.0.10-SNAPSHOT. Required by: project :base > No matching variant of project :android:admin was found. The consumer was configured to find a library for use during compile-time, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '8.7.3', attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'com.android.build.api.attributes.ProductFlavor:contentType' with value 'demo', attribute 'com.android.build.api.attributes.ProductFlavor:environment' with value 'production', attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'isoStandard', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but: - Variant 'isoDebugApiElements' declares a library for use during compile-time, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '8.7.3', attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'iso' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'isoStandard' - Other compatible attributes: - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:contentType (required 'demo') - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:environment (required 'production') - Variant 'isoDebugRuntimeElements' declares a library for use during runtime, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '8.7.3', attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'iso' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'isoStandard' - Other compatible attributes: - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:contentType (required 'demo') - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:environment (required 'production') - Variant 'isoDebugSourcesElements' declares a component for use during runtime, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '8.7.3', attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares documentation, as well as attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'iso' and the consumer needed a library, as well as attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'isoStandard' - Other compatible attributes: - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:contentType (required 'demo') - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:environment (required 'production') - Variant 'isoReleaseApiElements' declares a library for use during compile-time, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '8.7.3', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release', attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'iso' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'isoStandard' - Other compatible attributes: - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:contentType (required 'demo') - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:environment (required 'production') - Variant 'isoReleaseRuntimeElements' declares a library for use during runtime, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '8.7.3', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release', attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'iso' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'isoStandard' - Other compatible attributes: - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:contentType (required 'demo') - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:environment (required 'production') - Variant 'isoReleaseSourcesElements' declares a component for use during runtime, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '8.7.3', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares documentation, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release', attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'iso' and the consumer needed a library, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'com.android.build.api.attributes.ProductFlavor:standard' with value 'isoStandard' - Other compatible attributes: - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:contentType (required 'demo') - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:environment (required 'production')
admin模块 build.gradle 配置
namespace = "com.x.x.admin" defaultConfig { minSdk = 28 compileSdk = 35 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } flavorDimensions.add("standard") productFlavors { register("iso") { dimension = "standard" } } buildTypes { debug {} release { isMinifyEnabled = true ..... } } // Added with version 8.7.3 androidComponents { beforeVariants(selector().all()) { variant -> println("Variant Name: ${variant.name}") println("Build Type: ${variant.buildType}") println("Product Flavors: ${variant.productFlavors}") // Iterate over project configurations project.configurations.forEach { configuration -> if (configuration.isCanBeResolved) { // Check if the configuration can be resolved println("Configuration: ${configuration.name}") configuration.attributes.keySet().forEach { attribute -> val attributeValue = configuration.attributes.getAttribute(attribute) println(" Attribute: $attribute -> $attributeValue") } } } } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 isCoreLibraryDesugaringEnabled = false } kotlinOptions { jvmTarget = "17" } publishing { singleVariant("isoRelease") } privacySandbox { enable = true } } afterEvaluate { publishing { publications { create<MavenPublication>("isoRelease") { artifactId = "admin" from(components["isoRelease"]) } } repositories { ..... } } } dependencies { api(project(":person")) implementation(libs.timber) coreLibraryDesugaring(libs.android.desugar) }
base模块 build.gradle.kts 配置
import project.convention.logic.config.LibraryModule import project.convention.logic.config.LibraryModule.Logic plugins { id("project.android.library") id("project.android.library.compose") alias(libs.plugins.android.library) kotlin("android") kotlin("kapt") kotlin("plugin.serialization") alias(libs.plugins.about.libraries) alias(libs.plugins.ksp) } android { namespace = "x.x.x.base" version = 1 defaultConfig { minSdk = 28 compileSdk = 35 javaCompileOptions { annotationProcessorOptions { arguments += mapOf( "room.schemaLocation" to "$projectDir/schemas", "room.incremental" to "true", "room.expandProjection" to "true" ) } } vectorDrawables { useSupportLibrary = true } consumerProguardFile("proguard-consumer-rules.pro") } flavorDimensions.addAll(listOf("environment", "standard")) productFlavors { create("production") { dimension = "environment" } create("isoStandard") { dimension = "standard" } } buildFeatures { buildConfig = true aidl = false renderScript = false shaders = false prefab = false compose = true } composeOptions { kotlinCompilerExtensionVersion = libs.versions.kotlin.get() } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" // From coroutines excludes += "DebugProbesKt.bin" } } buildTypes { getByName("debug") getByName("release") { isMinifyEnabled = false } } // Added for debuging... androidComponents { beforeVariants(selector().all()) { variant -> println("Variant Name: ${variant.name}") println("Build Type: ${variant.buildType}") println("Product Flavors: ${variant.productFlavors}") // Iterate over project configurations project.configurations.forEach { configuration -> if (configuration.isCanBeResolved) { // Check if the configuration can be resolved println("Configuration: ${configuration.name}") configuration.attributes.keySet().forEach { attribute -> val attributeValue = configuration.attributes.getAttribute(attribute) println(" Attribute: $attribute -> $attributeValue") } } } } } // ------------------------ lint { abortOnError = false } afterEvaluate { configurations.create("isoDebugApiElements") { isCanBeConsumed = true isCanBeResolved = false attributes { attribute( Attribute.of("com.android.build.api.attributes.ProductFlavor:type", String::class.java), "iso" ) } } } } moduleConfig { module = LibraryModule.Base } dependencies { implementation(libs.admin) } kapt { correctErrorTypes = true } //// Opt in to various experimental APIs tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach { compilerOptions { freeCompilerArgs.add("-opt-in=kotlin.RequiresOptIn") } }
解决方案
1. 统一productFlavor维度与值
Gradle变体匹配要求消费者(base)和生产者(admin)的所有flavor维度必须一致,且对应维度的取值要匹配。修改admin模块的flavor配置:
// 替换原有flavorDimensions和productFlavors配置 flavorDimensions.addAll(["environment", "standard"]) productFlavors { register("production") { dimension = "environment" } register("isoStandard") { dimension = "standard" } }
如果需要保留admin模块原有的iso取值,也可以通过flavor属性映射实现兼容,但统一取值是最简单直接的方案。
2. 移除base模块无效配置
base模块中afterEvaluate里手动创建的isoDebugApiElements配置属于无效操作,会干扰Gradle的变体匹配逻辑,直接删除该部分代码。
3. 检查依赖声明
确保base模块依赖的是本地admin项目而非远程artifact:
// 替换原有implementation(libs.admin) implementation(project(":android:admin"))
如果确实需要通过libs目录管理,要确保libs.versions.toml中admin的配置指向本地项目,同时在settings.gradle.kts中包含android项目的引用。
4. 验证构建
修改完成后,执行./gradlew :base:assembleDemoProductionIsoStandardDebug验证构建是否正常。
内容的提问来源于stack exchange,提问作者Ballon
相关产品推荐
相关产品推荐

