我開發的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)一個更好的解決辦法?
如果flavor可以從其他繼承,那將會非常有幫助。 [可能會繼承productFlavor問題](https://code.google.com/p/android/issues/detail?id=183350) – obywatelgcc