Android模塊解耦之組件化 ? ?
引言:在移動開發(fā)中,我想大部分開發(fā)人員都會面臨一個問題琼了,隨著項目的開發(fā)與不斷的迭代幽污,業(yè)務也會隨之不斷壯大菇怀,也就意味著業(yè)務模塊越來越多,這個時候就會出現(xiàn)一個問題哟楷,各個模塊之間的相互引用,導致模塊之間的耦合越來越嚴重否灾,最終迭代會牽一發(fā)而動全身卖擅,項目的迭代和維護都特別困難;一些門戶型的APP還伴隨著子應用單獨包裝推廣墨技,影子應用單獨發(fā)布等等需求惩阶,那么一個合適的應用框架的需求是必不可少的,那么這篇文章就通過組件化來分析Android模塊解耦的實現(xiàn)扣汪,實現(xiàn)多人真正的協(xié)同開發(fā)断楷,每一個模塊實現(xiàn)單獨的版本控制、單獨編譯崭别、單獨運行冬筒;
一、組件化概述
組件化開發(fā)就是將一個APP分成多個模塊茅主,每個模塊我們都可以看成是一個組件舞痰,也就是在IDE中所創(chuàng)建的(Module),在開發(fā)的過程中我們可以對這些組件進行單獨調試诀姚,編譯和運行以及進行單獨的版本控制等响牛,但是最終發(fā)布的時候是將這些組件合并統(tǒng)一成一個apk,這就是組件化開發(fā)赫段。
二娃善、組件化的優(yōu)勢
1.提升編譯速度
做Android開發(fā)人員都知道,在項目達到一定的規(guī)模的時候瑞佩,編譯是一件十分痛苦的事情聚磺,短則幾分鐘,長則十幾分鐘炬丸。我們在修改了很小一塊代碼就要去編譯整個項目瘫寝,這樣會導致開發(fā)效率降低蜒蕾;那么由于通過組件化我們可以實現(xiàn)單獨編譯,就會極大的改善這個問題焕阿;
2.適應并行開發(fā)
通過組件化可以更好的去適應并行開發(fā)咪啡,因為我們可以為每一個模塊進行單獨的版本控制,甚至每一個模塊的負責人可以選擇自己的設計架構而不影響其他模塊的開發(fā)暮屡,與此同時組件化還可以避免模塊之間的交叉依賴撤摸,每一個模塊的開發(fā)人員可以對自己的模塊進行獨立測試,獨立編譯和運行褒纲,甚至可以實現(xiàn)單獨的部署准夷。從而極大的提高了并行開發(fā)效率。
三莺掠、組件化與插件化的區(qū)別
近幾年插件化與熱修復可謂是十分火熱的話題衫嵌,其實部分開發(fā)者對組件化與插件化區(qū)分并不明確,特別是熱修復與插件化之間的關系彻秆;所謂插件化就是將整個APP拆分成很多模塊楔绞,這些模塊包括一個宿主和多個插件,每個模塊都是一個APK(而組件化的每個模塊在打包為一個APK的時候是個Lib唇兑,在開發(fā)過程中我們可以設置當前的Lib為Application來實現(xiàn)單獨運行編譯)酒朵,最終打包的時候將宿主APK和插件APK分開或者聯(lián)合打包。而熱修復是動態(tài)修復線上項目的BUG扎附,而不用重新發(fā)布版本耻讽,達到快速修復BUG的目的,其實我們可以看做是插件化的一個分支帕棉,它們底層運用到的技術都是差不多针肥,通過DexClassLoader來實現(xiàn)動態(tài)加載,也有一些其他的方案香伴,比如說從native層hook來實現(xiàn)方法的替換慰枕,但是這種方式限制比較大;
四即纲、組件化的具體實現(xiàn)注意點
4.1第三方庫依賴沖突和依賴統(tǒng)一管理
在組件化的具體實施過程中具帮,我們創(chuàng)建的每一個module都有可能會去依賴相同的一些第三方庫,例如jar低斋,aar等文件蜂厅,那么在運行的時期就會可能報錯而導致無法運行,針對這個問題有以下幾種方式可以解決:
1.創(chuàng)建commonSDK這樣一個module膊畴,在module里面可以用來放置我們每一個module都會用到的工具類和一些基類掘猿,然后讓每一個module都依賴這個commonSDK的module,整個項目所有的第三方依賴庫都可以直接寫在commonSDK的配置文件build.gradle當中即可唇跨,這樣就可以實現(xiàn)依賴的統(tǒng)一管理稠通,而且解決了module之間“部分”的重復依賴的問題衬衬,如圖4-1所示;
2.上面為什么說只解決了部分依賴的問題呢改橘,因為有一些第三方的庫滋尉,例如dagger2依賴注入,阿里的路由ARouter需要在編譯時期注入代碼生成對應的類飞主,那么這個時候就必須要將對應的依賴放入到每一個使用到這個庫的module中去狮惜,如圖4-2,那么此時就存在一個第三方庫版本統(tǒng)一的問題碌识,為了實現(xiàn)不同module版本的統(tǒng)一管理碾篡,我們可以在項目的根目錄下面創(chuàng)建一個config.gradle,子模塊直接引用對應的版本號即可丸冕,修改的時候就可以實現(xiàn)統(tǒng)一修改,而不用每一個子module都去修改了薛窥,如圖4-2胖烛,圖4-3;
4.2資源沖突的解決
同樣的多個module之間也可能存在資源文件沖突的問題诅迷,那么這個時候只需要在每一個子模塊的build.gradle中加上對應的資源文件標識符resourcePrefix即可佩番,如圖4-4
4.3Module單獨編譯和打包編譯的設置
我們使用組件化的架構,在實際的開發(fā)過程中每一個模塊是可以單獨編譯運行的罢杉,那么這個時候對應的配置文件趟畏,Application的調用都會有所不同,所以這個時候就需要進行一些設置滩租,主要的設置步驟如下:
1.在主項目根目錄下的gradle.properties中設置一個boolean值的標志赋秀,通過改變標志位的boolean取值,來判斷當前的module是編譯成lib還是Application律想,配置如圖4-5:
2.依賴的設置猎莲,由于有部分的類需要在每個子模塊下面進行依賴,為了解決重復依賴技即,需要根據(jù)標志符采用不同的引入方式著洼,如圖4-6:
3.配置文件的設置,我們的四大組件等等都需要在AndroidManifest中進行配置而叼,那么子模塊在不同狀態(tài)的時候也需要進行不同的配置身笤,所以這個時候需要在main文件夾下面分別創(chuàng)建一個debug和release文件來分別存放子模塊編譯為不同狀態(tài)時所依賴的配置文件,如圖4-7所示:
4.4如何實現(xiàn)模塊之間組件的通信
組件當中葵陵,實現(xiàn)模塊之間的通信是最重要的問題了液荸,其實采用隱式意圖可以啟動不同組件之間的一些Activity,Service等脱篙,可以用來實現(xiàn)組件化模塊之間的通信莹弊,但是不方便擴展和統(tǒng)一管理涤久,同時也會導致配置文件比較混亂,這個時候我們就可以通過路由機制來實現(xiàn)模塊之間的通信忍弛,目前已經(jīng)有對應的開源項目响迂,例如阿里的ARouter就是用來實現(xiàn)組件化模塊間互相通信的一個開源項目,它支持直接解析URL進行跳轉细疚、參數(shù)按類型解析到Bundle蔗彤,支持Java基本的數(shù)據(jù)類型,那么具體的實現(xiàn)方式可以參照github上面的說明文檔來進行實現(xiàn)疯兼,其實相似的開源項目還是比較多的然遏,我們也可以根據(jù)自己公司的需求來實現(xiàn)自己的路由;
五吧彪、總結
本文涉及到組件化的具體實施過程待侵,以及在使用過程遇到問題的解決方式。主要涉及到配置文件的一些設置和依賴沖突姨裸,依賴統(tǒng)一管理的解決秧倾,以及采用ARouter來實現(xiàn)組件間的URL跳轉等等,由于篇幅原因傀缩,本文并未講解路由的具體實現(xiàn)原理那先,那么下一篇文章我將給大家來講解如何來實現(xiàn)一個路由,達到組件之間的通信赡艰;