繁体   English   中英

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

[英]Android Gradle Flavor values dependent on other flavor dimensions

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

我已经使用两种风味维度将此行为烘焙到 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"
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM