Android Gradle Plugin 3.0.0如何发布所有Flavor变体至Maven?
问题分析与解决方案
这问题我之前升级AGP的时候也踩过坑!核心原因是AGP 3.0彻底重构了库的发布机制,旧的uploadArchives任务已经跟不上多变体的处理逻辑了,咱们一步步理清楚:
AGP 3.0关于库发布的关键变更
- 废弃旧的
maven插件与uploadArchives任务:AGP 3.0开始官方推荐使用maven-publish插件来处理发布,旧的uploadArchives是基于老版maven插件实现的,在多变体(带productFlavors)场景下无法正确识别和发布所有变体。 - 移除
publishNonDefault配置:你提到的这个配置确实被移除了,因为新机制默认支持发布所有变体,但需要通过maven-publish的配置显式声明要发布的组件,而不是依赖旧任务的隐式处理。 - 变体与组件绑定:每个构建变体(比如
freeRelease、paidDebug)现在对应一个独立的SoftwareComponent,需要在发布配置中明确引用这些组件才能完成发布。
为什么移除productFlavors后能正常发布?
当你去掉productFlavors时,项目只有默认的release和debug构建类型,旧的uploadArchives任务还能勉强兼容识别默认的release组件,所以能正常发布。但一旦引入productFlavors产生多变体,旧任务就无法处理多组件的发布逻辑,导致发布无内容。
正确的配置方案(切换到maven-publish)
步骤1:替换插件
把原来的apply plugin: 'maven'替换为maven-publish插件:
apply plugin: 'maven-publish'
步骤2:配置发布规则与仓库
在build.gradle中添加publishing块,根据需求配置要发布的变体:
android { // 你的原有配置,比如productFlavors和buildTypes productFlavors { free {} paid {} } buildTypes { debug {} release {} } } publishing { publications { // 方式1:发布所有变体(每个变体生成独立的Maven构件) allVariants(MavenPublication) { from components.all groupId = "com.your.group" artifactId = "your-library" // 如果要区分变体,可以改成 "your-library-${variant.name}" version = "1.0.0" } // 方式2:只发布特定变体(比如仅发布所有Release变体) /* releaseVariants(MavenPublication) { from components.findAll { it.name.endsWith('Release') } groupId = "com.your.group" artifactId = "your-library" version = "1.0.0" } */ } repositories { // 配置Maven仓库地址与凭证 maven { url = uri("https://your-maven-repo-url.com") credentials { username = "your-username" password = "your-password" } } } }
步骤3:执行发布任务
现在你可以通过Gradle任务面板执行对应的发布任务,比如:
- 发布所有变体:执行
publishAllVariantsPublicationToMavenRepository任务 - 发布单个变体(比如
freeRelease):执行publishFreeReleasePublicationToMavenRepository任务
额外注意事项
- 如果需要自定义POM文件内容(比如添加依赖说明、开发者信息),可以在
MavenPublication块中添加pom配置:pom { name = "Your Library Name" description = "A sample library with multiple flavors" developers { developer { id = "your-id" name = "Your Name" email = "your-email@example.com" } } } - AGP 3.0+中,
uploadArchives任务虽然还存在,但已经被标记为废弃,官方不推荐继续使用,后续版本可能会彻底移除。
内容的提问来源于stack exchange,提问作者Ponsuyambu




