android - 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 文件中。不过,我找不到关于这种事情的任何信息,我希望这里的人能对如何做到这一点有所了解,或者至少告诉我这是不可能的。
谢谢!
解决方案
您始终可以为多风味组合使用单独的源树,并将字符串直接存储在正确的资源中(因为这基本上就是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"
}
}
但是你可以看到后者很快就会变得讨厌
推荐阅读
- python - 如何从列表列表中创建对象?
- python - GtkSourceView/Buffer 崩溃:Gtk-ERROR: Byte index is off the end of the line
- spring - 如何在spring security + spring boot中为同一用户禁用多个登录
- python - 无法使用 psycopg2 将日期时间对象传递到 postgresql
- java - 如何使用 JUnit 使用 Mockito 测试 void 方法
- logging - Log4j2:如何在控制台日志中查找日志配置文件是否已定位
- powershell - 安装 Anaconda 后控制台(powershell 和 CMD)中的 CreateFile() 错误
- r - 文章模板不编译
- haskell - 如何在 Haskell 中创建数字列表
- php - 为什么 php 脚本(Gmail API、moometric/GSuiteSignatureManager)只更新 100 个用户的电子邮件签名?