什么是变体?
变体是构建类型(Build Type)和产品风味(Product Flavor)的组合结果,它代表了一个特定配置的 APK 或 AAR 构建版本,也是 Android Gradle Plugin(AGP)的核心概念之一。
构建类型(Build Type)
debug:调试版本,包含调试信息release:发布版本,进行代码优化- 可自定义其他类型
产品风味(Product Flavor)
- 基于不同配置(如:免费版/付费版、不同API级别等)
- 例如:
free、paid、demo
变体的生成规则
变体 = 构建类型 × 产品风味
例如:
android {
buildTypes {
debug {}
release {}
}
flavorDimensions "version"
productFlavors {
free {}
paid {}
}
}将生成 4 个变体:freeDebug、freeRelease、paidDebug、paidRelease
大多数简单项目都没有定义 Product Flavor,此时:
android {
buildTypes {
debug { }
release { }
}
// 没有定义 productFlavors
}只生成 2 个变体:debug、release
android.libraryVariants.all
.all { } 是什么意思?
android.libraryVariants.all { variant ->
// 这个闭包会对每个变体执行一次
}假设你有 debug 和 release 两个变体:
android.libraryVariants.all { variant ->
println("处理变体: ${variant.name}")
}会针对两个变体分别执行一次,执行结果如下:
第1次执行:variant = debug
输出:处理变体: debug第2次执行:variant = release
输出:处理变体: releaseall vs each vs configureEach
// 方式1:all(最常用,推荐)
android.libraryVariants.all { variant ->
// 对已存在和未来添加的变体都生效
// 立即执行
}
// 方式2:each(不推荐)
android.libraryVariants.each { variant ->
// 只对当前已存在的变体执行
// 如果变体还没创建完,可能遗漏
}
// 方式3:configureEach(Gradle 4.9+,性能更好)
android.libraryVariants.configureEach { variant ->
// 懒执行:只在真正需要该变体时才配置
// 大型项目推荐使用
}为什么推荐 all?
因为 Gradle 配置阶段,变体可能还在陆续创建中。all 能确保”后来者”也被处理。
4.4 variant 对象有哪些属性?
android.libraryVariants.all { variant ->
// === 基本信息 ===
println "变体名称: ${variant.name}" // 如 "debug", "release"
println "构建类型: ${variant.buildType.name}" // 如 "debug"
println "产品风味: ${variant.productFlavors}" // 列表,可能为空
// === 目录和路径 ===
println "输出目录: ${variant.dirName}" // 如 "debug"
// === 任务相关 ===
println "Java编译任务: ${variant.javaCompileProvider.name}"
// === 方法调用 ===
variant.buildConfigField "String", "VARIANT_NAME", "\"${variant.name}\""
}延伸阅读
更新: 2026-02-12 15:39:24
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/mq1gn0nyu9g7ezs8