android - 使服务器配置与多种生产风格相匹配

标签 android gradle

我开发了可与某些服务器基础结构配合使用的android应用。
现在有3个服务器基础结构,分别称为serv1,serv2,serv3(在此示例中)。
我也有8种产品口味(flav1,flav2,... flav8),并且该数量可能会增加。

服务器配置(例如域和端口)存储在ServerConfig.java中。
每个 flavor 都有带有相应服务器基础结构配置的ServerConfig java文件:

├ app/src
|   ├ flav1/java/app/package/name/ServerConfig.java //config for serv1
|   ├ flav2/java/app/package/name/ServerConfig.java //config for serv1
|   ├ flav3/java/app/package/name/ServerConfig.java //config for serv2
|   ├ flav4/java/app/package/name/ServerConfig.java //config for serv3
|   ├ flav5/java/app/package/name/ServerConfig.java //config for serv2
|   ├ flav6/java/app/package/name/ServerConfig.java //config for serv3
|   ├ flav7/java/app/package/name/ServerConfig.java //config for serv1
|   └ flav8/java/app/package/name/ServerConfig.java //config for serv3

效果很好,但是恕我直言,有很多重复的代码。

现在,我必须添加crt文件以进行HTTPS验证。我不想apk文件包含所有3个crt文件。
因此,我考虑为每个服务器配置创建一个目录:
├ app/src/main/java/app/package/name
├ app/server
|    ├ serv1
|    |   ├ ServerConfig.java
|    |   └ ca.crt
|    ├ serv2
|    |   ├ ServerConfig.java
|    |   └ ca.crt
|    ├ serv3
|    |   ├ ServerConfig.java
|    |   └ ca.crt

并使用build.gradle复制配置并将crt复制到源主位置。
android {
    productFlavors.whenObjectAdded { flavor ->
        flavor.ext.set('serverType', 'serv1') //serv1/serv2/serv3
    }
    productFlavors {
        flav1 {
            serverType = 'serv1'
        }
        flav1 {
            serverType = 'serv2'
        }
        ...
        flav8 {
            serverType = 'serv3'
        }
    }
}
afterEvaluate {
    android.applicationVariants.all { variant ->
        variant.productFlavors.each { flavor ->
              if(flavor.serverType.contains("serv1"){
              //add dependency to copy task to pre + variant.name + Build 
              //to copy serv1 config and crt from app/server/serv1 to app/src/main/java/app/package/name
              }
              ...
        }
    }
}

该解决方案的一大缺点是用于应对和粘贴的硬编码位置。因此,每次ServerConfig和ca.crt的重构(例如重命名)都必须更改build.gradle文件。

是否有更好的解决方案来匹配具有多种生产风格的服务器配置(ServerConfig.java和ca.crt)?

最佳答案

我的解决方案是使用这样的文件夹结构,并对证书文件进行少量更改,

enter image description here

并将其与gradle中的flavorDimensions一起使用。

并像这样在gradle文件中添加。

flavorDimensions "flav", "conf"

    productFlavors{
        flav1{
            applicationId "com.flav1"
            dimension "flav"
        }

        flav2{
            applicationId "com.flav2"
            dimension "flav"
        }

        serv1{
            dimension "conf"
        }

        serv2{
            dimension "conf"
        }
    }

关于android - 使服务器配置与多种生产风格相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42251885/

相关文章:

android sqlite 查询慢

android - 由于线程 "main"java.util.zip.ZipException : error in opening zip file 中的异常,无法运行 native 应用程序

android - 迭代执行任务

android - 带有 ViewPager 的 TabLayout 不能在 fragment Android 中工作

android - 以编程方式防止使用 USB 端口

android - Android 自定义 ListView 中的搜索功能

java - 如何使用 Gradle 启用 Java 12 预览功能?

android - Jelly Bean DatePickerDialog --- 有没有办法取消?

android - 具有外部依赖项定义的 Gradle DSL 中的关闭错误

android - 错误 :Error converting bytecode to dex: Realm