2017-02-15 60 views
0

我開發的android應用可以與某些服務器基礎設施配合使用。 現在有3個服務器基礎設施,稱爲serv1,serv2,serv3(在本例中)。 另外我有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 

這工作正常,但恕我直言,有很多重複的代碼。

現在我要補充CRT文件HTTPS驗證。我不想包含所有3個crt文件的apk文件。 所以我認爲有關創建每臺服務器配置一個目錄:

├ 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

@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 
     } 
    } 
} 
+0

如果flavor可以從其他繼承,那將會非常有幫助。 [可能會繼承productFlavor問題](https://code.google.com/p/android/issues/detail?id=183350) – obywatelgcc

1

我的解決方案是使用的文件夾結構,這樣與證書文件一個小的變化,

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" 
     } 
    } 
+0

我不確定這是我尋找的解決方案。我有3個ca.crt文件,所以我必須將這些文件複製到8個(功能更多)風味資產位置。而在我的情況下使用基類是無用的,因爲ServerConfig具有靜態的最終字段和服務器地址等,這些字段沒有默認值。 – obywatelgcc

+0

我需要更改服務器地址,例如。從serv1.domain.com到serv7.domain.com for flav7。在不更改ca.crt的情況下,僅更改ServerConfig中的字段的人不知道資產目錄在flav7中包含ca.crt可能導致生成具有大bug的生產版本。我搜索可擴展的解決方案,允許使用盡可能少的步驟切換服務器配置。 – obywatelgcc

+0

@obywatelgcc我已經更新了我的答案,你可以檢查一下。 – Krish