????為了解相關資料时捌,在網(wǎng)上找了很久才找到相關資料定铜。記錄一下伪冰,防止忘記怠缸。
????參考資料:http://blog.csdn.net/zhaoyanjun6/article/details/77678577
背景
????由于同一個項目需要提供給不同的客戶,同時不同的客戶又有各自定制的功能嗅义。即一個項目屏歹,多個不同的定制版本的模式。因此引發(fā)了多個版本管理的問題之碗。如果每個定制版本都一份代碼蝙眶,對于代碼的維護將會非常困難,因此共用一份代碼是必須的褪那。
????最開始幽纷,由于定制版本不多,差異也不大武通,所以通過設定一個靜態(tài)值來表示不同的定制版霹崎,再由運行時決定功能邏輯。后來冶忱,隨著定制版本增多尾菇、各版本之間的邏輯差異加大,導致版本判斷的代碼越來越多囚枪,邏輯越來越復雜派诬。由于冗余代碼的增加,維護也越來越困難链沼。因此默赂,代碼的管理方案也需要相應的改變。首先想到的是通過SVN等版本管理工具進行管理括勺,將基礎版本作為主干缆八,各定制版本在分支上開發(fā)曲掰。在一個分支上添加了公共功能或者是修復了公共功能部分的BUG時,再將代碼合并到主干奈辰,其它分支再到主干上同步栏妖。這是一個優(yōu)秀的解決方案,但是在公共部分的代碼更新頻繁的情況下奖恰,這個方案會導致頻繁的分支同步與合并吊趾。雖然在改動量小的時候,及時更新同步可以有效解決合并困難的問題瑟啃。不過對于開發(fā)人員并不集中且無法利用網(wǎng)絡的情況下论泛,需要有一種新的代碼管理方案來解決。
????新的方案就是利用Gradle的差異化構建來進行管理蛹屿。這個方案將差異化的代碼屁奏,即各定制版本不同邏輯的部分分布到各版本中,而將共同的部分集中在一起错负,所以不需要同步了袁,也不需要在運行時進行邏輯判斷,因為在編譯時已經(jīng)進行過了統(tǒng)一的判斷了湿颅。但是在各定制功能存在組合時,這個方案的問題也非常大粥诫,這里暫時不討論油航。
使用步驟
第一步 創(chuàng)建一個編譯版本
????創(chuàng)建一個命名為custom1的Build Type。根據(jù)需要改變其它的配置怀浆。第二步 指定編譯版本
????打開Build Variants谊囚,并將目標Module的Build Variant選擇剛才創(chuàng)建的編譯版本。然后運行执赡。????結果镰踏,如圖所示,無法運行沙合。提示 Error : the apk for your currently selected variant(app-custom1-unsigned.apk)is not signed.Please specity a signing configuration for this variant(custom1)奠伪。(這是故意留著的,因為在發(fā)現(xiàn)這個問題后首懈,上網(wǎng)找绊率,發(fā)現(xiàn)資料不多)。
????問題原因是沒有指定簽名文件究履,所以無法生成簽名的安裝包滤否,而生成的未簽名的安裝包是無法運行的。解決方案是:點擊Fix最仑,然后創(chuàng)建簽名配置????如上圖所示藐俺,這里創(chuàng)建了一個名為normal的配置炊甲,Normal.jks簽名文件是前面已經(jīng)創(chuàng)建好的。然后在custom1中指定Signing Config為剛剛創(chuàng)建的normal欲芹。至此卿啡,就已經(jīng)完成了定制版本的配置。接下來將添加定制版本的代碼耀石。
第三步 添加定制版本代碼
????在Project結構下牵囤,在src目錄下創(chuàng)建一個與步驟一創(chuàng)建的build type同名的文件夾custom1,并在文件夾下創(chuàng)建名為java的文件夾滞伟,與名為res的文件夾揭鳞,分別用于存放代碼與資源文件。????可以看到現(xiàn)在custom1的目錄結構與main的目錄結構一致了梆奈。main目錄表示的是各build type共用的代碼野崇,custom1目錄表示的是當build variant設置為custom1時使用的代碼。
第四步 定制邏輯
????重復第一到第三步亩钟,再創(chuàng)建一個定制版custom2乓梨。然后再在兩個定制版本中添加相同的包名以及類文件。以供main目錄下的公共代碼使用清酥,公共代碼沒有使用到的可以自由定義扶镀。完成代碼后就可以通過更改build variant的設置選擇不同的定制邏輯了。????從以上兩圖可以清晰的看出焰轻,當且僅當build variant選定的build type對應的代碼會回到編譯中去臭觉。
????如果沒有時間從實踐一遍,或者對實際效果不了解辱志,可以直接下載源代碼:https://gitee.com/IndoorsNum31/GradleDifferentiatedBuild