如何通过Flavor配置修改Android应用名称?实现变体自定义命名
问题
参考NowInAndroid项目实现了如下Kotlin风格的Flavor配置代码,请问是否可以实现以下应用名称规则:devDebug变体为原应用名称+"devDebug",devRelease变体为原应用名称+"devRelease",prodDebug变体为原应用名称+"prodDebug",prodRelease变体保持原应用名称不变?
配置代码:
enum class FlavorDimension { contentType } enum class Flavor (val dimension : FlavorDimension, val applicationIdSuffix : String? = null) { dev(FlavorDimension.contentType, ".dev"), prod(FlavorDimension.contentType) } fun Project.configureFlavors( commonExtension: CommonExtension<*, *, *, *> ) { commonExtension.apply { flavorDimensions += FlavorDimension.contentType.name productFlavors { Flavor.values().forEach{ create(it.name) { dimension = it.dimension.name if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) { if (it.applicationIdSuffix != null) { this.applicationIdSuffix = it.applicationIdSuffix } } } } } } }
解决方案
可以实现,只需在现有Flavor配置基础上添加应用名称的变体配置逻辑,通过动态生成资源值来实现不同变体的名称区分。具体修改如下:
修改后的完整配置代码
enum class FlavorDimension { contentType } enum class Flavor(val dimension: FlavorDimension, val applicationIdSuffix: String? = null) { dev(FlavorDimension.contentType, ".dev"), prod(FlavorDimension.contentType) } fun Project.configureFlavors( commonExtension: CommonExtension<*, *, *, *> ) { commonExtension.apply { flavorDimensions += FlavorDimension.contentType.name productFlavors { Flavor.values().forEach { flavor -> create(flavor.name) { dimension = flavor.dimension.name if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) { flavor.applicationIdSuffix?.let { this.applicationIdSuffix = it } } } } } // 新增应用名称变体配置逻辑 if (this is ApplicationExtension) { applicationVariants.all { variant -> // 原应用名称,对应src/main/res/values/strings.xml中的app_name定义 val baseAppName = "@string/app_name" val flavorName = variant.flavorName val buildTypeName = variant.buildType.name // 根据变体组合判断后缀 val appNameSuffix = when { flavorName == "prod" && buildTypeName == "release" -> "" else -> "${flavorName.replaceFirstChar(Char::uppercase)}${buildTypeName.replaceFirstChar(Char::uppercase)}" } // 拼接最终应用名称 val finalAppName = if (appNameSuffix.isEmpty()) { baseAppName } else { "$baseAppName$appNameSuffix" } // 动态生成app_name资源,覆盖默认值 variant.resValue("string", "app_name", finalAppName) } } } }
关键注意事项
- 确保
src/main/res/values/strings.xml中存在基础应用名称定义,例如:<string name="app_name">我的应用</string> - 通过
applicationVariants.all遍历所有变体,针对不同Flavor+BuildType组合生成对应名称 - 使用
resValue动态生成的app_name会自动覆盖main目录下的默认资源,无需手动创建多套strings文件 prodRelease变体因后缀为空,将直接使用原应用名称,其余变体自动拼接对应的标识
内容的提问来源于stack exchange,提问作者Harry Jhin
相关产品推荐
相关产品推荐

