AGP配置:如何让Gradle选择指定依赖变体无需新增应用变体
问题说明
现有应用仅配置debug、release两个构建类型,Maven仓库中存在基于Gradle Variants API发布的依赖,其.module元数据中存在anotherBuildType维度的变体,配置片段如下:
{ "name": "anotherBuildTypeVariantCustomApiPublication", "attributes": { "com.android.build.api.attributes.BuildTypeAttr": "anotherBuildType", "org.gradle.category": "library", "org.gradle.dependency.bundling": "external", "org.gradle.libraryelements": "aar", "org.gradle.usage": "java-api" }, "files": [ { "name": "libraryname-0.1-anotherBuildType.aar", "url": "libraryname-0.1-anotherBuildType.aar" } ] }
需求为不新增宿主应用的构建变体,直接让Gradle选中该依赖的anotherBuildType变体。当前构建抛出变体不匹配错误:
Variant 'anotherBuildTypeVariantCustomApiPublication' capability com.example:libraryname:0.1: - Incompatible because this component declares an API of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'anotherBuildType' and the consumer needed a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug'
实现方式
报错本质是变体匹配时两个属性对齐失败:
- 宿主构建默认携带
BuildTypeAttr=debug/release属性,和依赖提供的BuildTypeAttr=anotherBuildType不匹配 - 宿主运行时类路径默认请求
usage=java-runtime属性,和依赖暴露的usage=java-api不匹配
不需要给宿主新增anotherBuildType构建类型,直接在依赖声明时指定要匹配的属性,强制Gradle选中目标变体即可。
Groovy 配置(build.gradle)
dependencies { // 替换成你实际的依赖坐标 implementation('com.example:libraryname:0.1') { attributes { // 指定匹配依赖的anotherBuildType构建类型变体 attribute( com.android.build.api.attributes.BuildTypeAttr.ATTRIBUTE, objects.named(com.android.build.api.attributes.BuildTypeAttr, "anotherBuildType") ) // 如果配置后仍报usage属性不匹配,放开下面这段注释 // attribute( // org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, // objects.named(org.gradle.api.attributes.Usage, org.gradle.api.attributes.Usage.JAVA_RUNTIME) // ) } } }
Kotlin DSL 配置(build.gradle.kts)
import com.android.build.api.attributes.BuildTypeAttr import org.gradle.api.attributes.Usage dependencies { // 替换成你实际的依赖坐标 implementation("com.example:libraryname:0.1") { attributes { // 指定匹配依赖的anotherBuildType构建类型变体 attribute( BuildTypeAttr.ATTRIBUTE, objects.named(BuildTypeAttr::class.java, "anotherBuildType") ) // 如果配置后仍报usage属性不匹配,放开下面这段注释 // attribute( // Usage.USAGE_ATTRIBUTE, // objects.named(Usage::class.java, Usage.JAVA_RUNTIME) // ) } } }
如果需要让所有依赖都默认匹配该构建类型变体,把上述attributes配置块移动到configurations.all作用域下即可,非必要不推荐全局配置,避免影响其他依赖的正常变体选择。
内容的提问来源于stack exchange,提问作者mar3kk
相关产品推荐
相关产品推荐

