如何一隻雞下多個蛋? 如何一套程式碼,對應多個版本,多個客戶?
實際的開發中遇到這樣一個需求:一個產品要供應給不同的客戶,絕大部分的邏輯程式碼和資原始檔是一樣的,伺服器地址是不一樣的。難道要把整個專案完整的拷貝一份,建一個新的專案?如果要修改共同的bug,這樣就麻煩了。但是,不同的客戶後期可能會有不同的需求,需要針對性的進行開發,怎麼辦?
不賣關子了,我的做法是堅持維護一套程式碼,同時還可以根據不同客戶版本開發不同的功能。
我使用的開發環境是 Android Studio 3.0 Canary 9。利用gradle進行配置。
####1.伺服器地址,String資源,不同的依賴
flavorDimensions "server"
productFlavors {
C1_releaseServer {
//BuildConfig.SERVER_ROOT_URL
buildConfigField("String", "SERVER_ROOT_URL", "\"http://211.7.1.224:80/\"")
//R.String.app_name
resValue("string", "app_name", "應用名1")
dependencies {
compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-*.jar')
}
applicationId "com.smart1"
dimension "server"
}
C2_releaseServer {
//BuildConfig.SERVER_ROOT_URL
buildConfigField("String", "SERVER_ROOT_URL", "\"http://211.7.1.224:80/\"")
//R.String.app_name
resValue("string", "app_name", "應用名2")
//依賴配置
dependencies {
compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-*.jar')
}
applicationId "com.smart2"
dimension "server"
}
}
複製程式碼
flavorDimensions 是版本的維度,這裡只使用了一個維度,如果需要可以使用多個維度。多個維度會進行組合。applicationId 不同是為了一臺手機上可以同時安裝多個apk。注:AndroidManifest.xml中的package不需要修改。
Module的gradle修改完成之後,執行一下gradle。然後下面就會出現已經配置的Flavors了,可以選擇之後,點選執行。注:如果你切換了不同的Flavors,gradle會再次執行一遍。執行之後程式碼中的BuildConfig.***才會編譯成功。
####2.資原始檔 不同的版本可能還會用到不同的圖片資源。src資料夾下面間對應Flavors的資原始檔,這裡的資原始檔可以是圖片或者java檔案。
進入資原始檔夾建立介面。紅框裡就是對應的Flavors,選擇之後,上面是資原始檔夾的型別。
資料夾建立好之後,就可以把資原始檔拷貝進去了。這裡需要注意的是,原來在main資料夾下的同名的檔案需要刪除。
//和productFlavors同級
sourceSets {
//不同的資源要放在不同的版本對應資料夾中,main中不放,同且公用的資源放在main資料夾下
// C1_releaseServer.java.srcDirs
// C1_releaseServer.manifest.srcFile 'AndroidManifest.xml'
C1_releaseServer.res.srcDirs = ['src/main/res','src/C1_releaseServer/res']
C2_releaseServer.res.srcDirs = ['src/C2_releaseServer/res','src/main/res']
}
複製程式碼
最後,執行gradle,然後選擇Build Variant,然後再執行gradle,完成後直接執行!