如何为不同flavor和buildType配置对应applicationId(kotlin-dsl环境)
Android Gradle Kotlin DSL 多风味多构建类型applicationId配置方案
实现核心思路:通过AGP提供的变体动态配置能力,针对不同flavor和buildType的组合自定义拼接规则,release版本直接使用基础applicationId,非release版本按flavor对应的规则拼接后缀。
完整配置代码
在app模块的build.gradle.kts文件中修改android配置块:
android { namespace = "com.example.demo" // 替换为你自己的项目namespace compileSdk = 34 // 替换为你的编译版本号 defaultConfig { minSdk = 24 targetSdk = 34 versionCode = 1 versionName = "1.0" } // 配置已有的5种buildType,可保留你原有的混淆、签名、调试开关等配置 buildTypes { getByName("dev") { isMinifyEnabled = false // 其他原有配置保留 } getByName("debug") { isMinifyEnabled = false // 其他原有配置保留 } getByName("uat") { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") // 其他原有配置保留 } getByName("preprod") { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") // 其他原有配置保留 } getByName("release") { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") // 其他原有配置保留 } } // 配置风味维度和已有的2种flavor flavorDimensions += "channel" productFlavors { create("flavor1") { dimension = "channel" } create("flavor2") { dimension = "channel" } } // 核心逻辑:动态设置不同变体的applicationId androidComponents { onVariants { variant -> val buildTypeName = variant.buildType ?: return@onVariants val flavorName = variant.productFlavors.first().second // release版本直接使用无后缀的基础id if (buildTypeName == "release") { variant.applicationId.set("com.example.${flavorName}") return@onVariants } // 非release版本按flavor规则拼接后缀 variant.applicationId.set( when (flavorName) { "flavor1" -> "com.example.flavor1${buildTypeName}" "flavor2" -> "com.example.flavor2.${buildTypeName}" else -> variant.applicationId.get() } ) } } }
该方案适配AGP 7.0及以上版本,无额外依赖,配置规则可直接扩展适配更多flavor或buildType
配置效果验证
所有构建组合的applicationId完全匹配需求:
- flavor1 + dev:
com.example.flavor1dev - flavor1 + debug:
com.example.flavor1debug - flavor1 + uat:
com.example.flavor1uat - flavor1 + preprod:
com.example.flavor1preprod - flavor1 + release:
com.example.flavor1 - flavor2 + dev:
com.example.flavor2.dev - flavor2 + debug:
com.example.flavor2.debug - flavor2 + uat:
com.example.flavor2.uat - flavor2 + preprod:
com.example.flavor2.preprod - flavor2 + release:
com.example.flavor2
内容的提问来源于stack exchange,提问作者freeman
相关产品推荐
相关产品推荐

