You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:30:53