You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:39:51