Gradle多维度打包通过flavorDimensions与productFlavors组合实现正交变体(如region×type生成4种变体),Android原生支持,JVM需手动模拟source set和jar任务,共享代码放main,特有逻辑按flavor隔离。

在 Gradle 中配置多维度(Flavors)打包,核心是使用 flavorDimensions 和多个 productFlavors 块组合定义正交维度(如 region × type),Gradle 会自动组合生成对应变体(Variant)。Android 和 JVM(桌面端)项目配置逻辑相似,但 Android 有更完善的 flavor 支持,JVM 需手动扩展。
Android 项目:标准多维度 Flavor 配置
Android 插件原生支持 flavor dimensions。例如同时按「地区」和「发布类型」区分:
- 定义两个维度:
region(cn / us)和type(free / pro) - 每个 flavor 属于一个 dimension,且同一 dimension 下 flavor 互斥
- 最终生成 2 × 2 = 4 个构建变体(如
cnFreeDebug、usProRelease)
示例 app/build.gradle:
android {
flavorDimensions "region", "type"
<pre class="brush:php;toolbar:false;">productFlavors {
cn {
dimension "region"
applicationIdSuffix ".cn"
versionNameSuffix "-cn"
}
us {
dimension "region"
applicationIdSuffix ".us"
versionNameSuffix "-us"
}
free {
dimension "type"
applicationIdSuffix ".free"
}
pro {
dimension "type"
applicationIdSuffix ".pro"
}
}}
立即学习“Java免费学习笔记(深入)”;
注意:applicationIdSuffix 会叠加(如 cn + free → .cn.free),资源/代码目录也按 flavor 名称分层(src/cnFree/ 优先级高于 src/cn/ 和 src/free/)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
JVM 桌面端(Java/Kotlin):用 Java Library 插件模拟 Flavor
Gradle 的 JVM 项目无原生 flavor,但可通过 namedVariants(Gradle 8.0+)或自定义 source set + 构建任务模拟:
- 声明多个 source set(如
src/cnMain、src/usMain、src/freeMain) - 创建组合 source set(如
cnFree),继承共用 main 并叠加维度特有代码 - 为每种组合注册独立的 JAR 任务(如
jarCnFree)
简化方式(推荐):用 java-library + variant 扩展(Gradle 8.4+):
java {
registerFeature("cn") { /* 启用 cn 特性 */ }
registerFeature("us") { /* 启用 us 特性 */ }
registerFeature("free") { /* 启用 free 特性 */ }
}
// 然后通过 tasks.withType(Jar) 过滤并重命名输出更实用做法是写一个配置闭包,动态生成 source set 和 jar 任务,避免硬编码所有组合。
共享代码与资源隔离策略
无论 Android 还是 JVM,关键在于让不同 flavor 使用专属逻辑,同时复用公共部分:
- 公共代码放
src/main/,各 flavor 特有代码放src/<flavorname>/</flavorname>(Android)或src/<flavorcombination>Main/</flavorcombination>(JVM) - Android 中可在 flavor 目录下放
AndroidManifest.xml覆盖主清单(如权限、Activity 声明) - JVM 可通过
systemProperty或resources.filter注入维度变量(如buildType=pro),运行时读取 - 建议用接口 + flavor 实现类解耦(如
PaymentService接口,src/freeMain/提供免费版实现,src/proMain/提供高级版)
构建与调试技巧
确认配置生效后,常用操作:
- 查看所有变体:
./gradlew app:assemble --no-daemon(Android)或./gradlew tasks | grep jar(JVM) - 构建指定组合:
./gradlew assembleCnFreeDebug(Android)或./gradlew jarCnFree(JVM) - 在 IDE(AS/IntelliJ)中切换 active build variant,自动加载对应 source set
- 调试时,在 flavor 目录下加断点,确保 IDE 正确识别源码路径
不复杂但容易忽略:flavor name 不能含大写字母或特殊符号(仅小写字母、数字、下划线),否则会导致 source set 解析失败或构建报错。

















