Android鬼點子 如何一隻雞下多個蛋!

我是綠色大米呀發表於2017-12-15

如何一隻雞下多個蛋? 如何一套程式碼,對應多個版本,多個客戶?

母雞.jpg

實際的開發中遇到這樣一個需求:一個產品要供應給不同的客戶,絕大部分的邏輯程式碼和資原始檔是一樣的,伺服器地址是不一樣的。難道要把整個專案完整的拷貝一份,建一個新的專案?如果要修改共同的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.***才會編譯成功。

Build Variants

####2.資原始檔 不同的版本可能還會用到不同的圖片資源。src資料夾下面間對應Flavors的資原始檔,這裡的資原始檔可以是圖片或者java檔案。

AS
進入資原始檔夾建立介面。

建立介面

紅框裡就是對應的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,完成後直接執行!

相關文章