首页 > 解决方案 > Android Gradle Flavor 值取决于其他风味维度

问题描述

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

我已经使用两个风味维度将这种行为烘焙到 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 文件中。不过,我找不到关于这种事情的任何信息,我希望这里的人能对如何做到这一点有所了解,或者至少告诉我这是不可能的。

谢谢!

标签: androidgradle

解决方案


您始终可以为多风味组合使用单独的源树,并将字符串直接存储在正确的资源中(因为这基本上就是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"
  }
}

但是你可以看到后者很快就会变得讨厌


推荐阅读