Android Gradle 口味值取决于其他口味维度



所以我在白标样式项目上工作了一段时间,我在可扩展性方面遇到了一些问题。 具体来说,项目的工作方式,我需要能够在每个客户端的基础上支持多个后端环境,每个环境都有唯一的凭据。

我已经使用两个风味维度将这种行为烘焙到 gradle 中,一个用于客户端,一个用于后端,但我在让它们像我想要的那样无缝地结合在一起时遇到了一些麻烦。

以下是 gradle 设置的示例:

productFlavors {
client1 {
applicationId "com.app.client1"
dimension "customer"
resValue "string", "app_name", "Client 1"
}
client2{
applicationId "com.app.client2"
dimension "customer"
resValue "string", "app_name", "Client 2"
}
dev {
ext {
packageExtension = ".DEV"
}
dimension "environment"
resValue "string", "url", "https://dev.hostname.com/"
}
uat {
ext {
packageExtension = ".UAT"
}
dimension "environment"
resValue "string", "url", "https://uat.hostname.com/"
}
stage {
ext {
packageExtension = ".STAGE"
}
dimension "environment"
resValue "string", "url", "https://stg.hostname.com/"
}
prod {
ext {
packageExtension = ""
}
dimension "environment"
resValue "string", "url", "https://hostname.com/"
}
}

这非常适合为每个客户端授予对正确环境和唯一代码的访问权限,但这意味着我不能在 gradle 中包含客户端 ID。 我必须将其粘贴在 client1Dev 目录等的资源文件中,以便在运行时获得正确的值。

我的问题是,有没有办法将客户端 ID 移动到 gradle 中并根据客户和环境风格的组合获得正确的值?

例如,我想做的是这样的:

client1 {
applicationId "com.app.client1"
dimension "customer"
resValue "string", "app_name", "Client 1"
dev{
resValue "string", "clientId", "1032145d8eefa00aff0098b08c9d"
}
uat{
resValue "string", "clientId", "8654684561584798531985964/56"
}
}
client2{
applicationId "com.app.client2"
dimension "customer"
resValue "string", "app_name", "Client 2"
dev{
resValue "string", "clientId", "89612ad8967a00aff0098b08c08e"
}
uat{
resValue "string", "clientId", "8612ad890981237409d0ab08c08f"
}
}

类似的东西可以让我将我的客户端 ID 与其他后端设置信息一起存储在 gradle 文件中。 不过,我找不到关于这种事情的任何信息,我希望这里有人能阐明如何做到这一点,或者至少告诉我这是不可能的。

谢谢!

您始终可以为多口味组合使用单独的源树,并将字符串直接存储在正确的资源中(因为这本质上是resValue "string" "{ID}" "{VALUE}"正在做的事情(。

src/
main/
java/
res/
values/
strings_ids.xml
<string name="clientId">override_me</string>
client1Dev/
client1Uat/
client2Dev/
res/
values/
strings_ids.xml
<string name="clientId">89612ad8967a00aff0098b08c08e</string>
client2Uat/
res/
values/
strings_ids.xml
<string name="clientId">8612ad890981237409d0ab08c08f</string>

或者,如果你真的想保留在build.gradle文件中,你可以用一些(不太优雅(的东西来编写它的脚本,如下:

android.applicationVariants.all { variant ->
if (variant.getFlavorName().equalsIgnoreCase("client1Dev")) {
variant.resValue "string", "clientId", "1032145d8eefa00aff0098b08c9d"
}
else if (variant.getFlavorName().equalsIgnoreCase("client1Uat")) {
variant.resValue "string", "clientId", "8654684561584798531985964/56"
}
}

但你可以看到后者会很快变得令人讨厌。

最新更新