有没有一种在gradle中同时使用buildConfigField和resValue的通用方法?

39

我有一个产品,它有多种口味,比如:

buildTypes {
    debug {
    }

    release {
    }

}

productFlavors {
    flavor1 {
        buildConfigField "String" "country" "se"
        buildConfigField "String" "language" "sv-SE"
        buildConfigField "String" "appName" "Flavor1"
    }
    flavor2 {
        buildConfigField "String" "country" "se"
        buildConfigField "String" "language" "sv-SE"
        buildConfigField "String" "appName" "Flavor2"
    }
    flavor3 {
        buildConfigField "String" "country" "se"
        buildConfigField "String" "language" "sv-SE"
        buildConfigField "String" "appName" "Flavor3"
    }
    flavor4 {
        buildConfigField "String" "country" "se"
        buildConfigField "String" "language" "sv-SE"
        buildConfigField "String" "appName" "Flavor4"
    }
    flavor5 {
        buildConfigField "String" "country" "se"
        buildConfigField "String" "language" "no-NO"
        buildConfigField "String" "appName" "Flavor5"
    }
}

我更喜欢使用一个公共部分包含所有属性,仅覆盖不同的属性。这可行吗?

我还想将所有风味(也许是构建类型)放入它自己的文件中,以使其更易读。因此,每当您必须更改风味时,您可以轻松地在其自己的文件中找到它,而不必在主构建文件中与所有其他内容一起滚动数千行。


我考虑过这个问题,但是在那个部分添加resValues和buildConfigFields似乎很混乱。但也许这是唯一的方法。将它移动到单独的文件中怎么样? - peuhse
1
debugreleasebuildTypes 也可以完成任务,但你必须给它们都设置值……不管怎么样,为什么这么凌乱呢?默认配置将包含默认值……关于多个文件……我从未使用过。 - Selvin
也许我的问题没有表达清楚。当你有15个或更多的productFlavors和大约20个不同的键时,情况会变得混乱。那么最好将它们与签名、打包以及所有其他关于Android SDK版本的信息等构建过程中的其他内容分开处理。这就是为什么它变得混乱的原因。 - peuhse
1个回答

77

Selvin是正确的,使用defaultConfig闭包- 没有比这更简洁的方法了!在下面的例子中,flavor 1、2和5会将默认国家和语言设置为de。而flavor 3和4则会用它们自己的语言覆盖这个设置。

defaultConfig {
    buildConfigField "String", "country", "de"
    buildConfigField "String", "language", "de"
}

buildTypes {
    debug {
    }

    release {
    }
}

productFlavors {
    flavor1 {
        buildConfigField "String", "appName", "Flavor1"
    }
    flavor2 {
        buildConfigField "String", "appName", "Flavor2"
    }
    flavor3 {
        buildConfigField "String", "country", "uk"
        buildConfigField "String", "language", "en_GB"
        buildConfigField "String", "appName", "Flavor3"
    }
    flavor4 {
        buildConfigField "String", "country", "fr"
        buildConfigField "String", "language", "fr"
        buildConfigField "String", "appName", "Flavor4"
    }
    flavor5 {
        buildConfigField "String", "appName", name.capitalize()
    }
}

注意

提醒大家,您可以使用 name.capitalize() 将任何风味的名称转换为应用程序名称,例如将 flavor5 转换为 Flavor5 ,方法是使用 capitalize() 方法 - 它会将字符串中的第一个字符大写。但是,这必须在风味中实现,而不是在 defaultConfig 中进行。


非常有帮助。非常感谢! - iroiroys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接