我开发Android应用程序以使用某些服务器基础结构。 现在有一个名为serv1,serv2,serv3的3个服务器基础结构(在本例中)。 我还有8种产品口味(flav1,flav2,... flav8),这个数字可能会增加。
域和端口等服务器配置存储在ServerConfig.java
中。
每种风格都有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
这很好但是,恕我直言,还有很多重复的代码。
现在我必须添加用于HTTPS验证的crt文件。我不想要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)?
答案 0 :(得分:1)
我的解决方案是使用像这样的文件夹结构,对证书文件进行少量更改,
并在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"
}
}
答案 1 :(得分:0)
@Krish的答案非常有用,但在我的情况下使用flavorDimensions导致了48个构建变体的创建。为了减少构建变体列表,我结合了我的命题(关于这个线程),Krish答案和variantFilter特征。
android {
productFlavors.whenObjectAdded { flavor ->
flavor.ext.set('serverType', 'serv1') //set serv1 as default value //serv1/serv2/serv3
}
flavorDimensions "flav", "conf"
productFlavors {
//===== SERVER CONFIG FLAVORS =====
serv1 {
dimension "conf"
}
serv2 {
dimension "conf"
}
serv3 {
dimension "conf"
}
//===== CLIENT FLAVORS =====
flav1 {
serverType = 'serv1' //have to be one of server config flavours name
dimension "flav"
}
flav1 {
serverType = 'serv2'
dimension "flav"
}
...
flav8 {
serverType = 'serv3'
dimension "flav"
}
}
variantFilter { variant ->
def firstFlav = variant.getFlavors().get(0)
def secondFlav = variant.getFlavors().get(1)
if (!firstFlav.serverType.equals(secondFlav.name)) {
variant.setIgnore(true); //hide variants where serverType mismatch server config flavor
}
}
}