Android模塊解耦之組件化實現(xiàn)之踩坑

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所示;

圖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
圖 4-3

4.2資源沖突的解決

同樣的多個module之間也可能存在資源文件沖突的問題诅迷,那么這個時候只需要在每一個子模塊的build.gradle中加上對應的資源文件標識符resourcePrefix即可佩番,如圖4-4

圖4-4

4.3Module單獨編譯和打包編譯的設置

我們使用組件化的架構,在實際的開發(fā)過程中每一個模塊是可以單獨編譯運行的罢杉,那么這個時候對應的配置文件趟畏,Application的調用都會有所不同,所以這個時候就需要進行一些設置滩租,主要的設置步驟如下:

1.在主項目根目錄下的gradle.properties中設置一個boolean值的標志赋秀,通過改變標志位的boolean取值,來判斷當前的module是編譯成lib還是Application律想,配置如圖4-5:

圖4-5

2.依賴的設置猎莲,由于有部分的類需要在每個子模塊下面進行依賴,為了解決重復依賴技即,需要根據(jù)標志符采用不同的引入方式著洼,如圖4-6:

圖4-6

3.配置文件的設置,我們的四大組件等等都需要在AndroidManifest中進行配置而叼,那么子模塊在不同狀態(tài)的時候也需要進行不同的配置身笤,所以這個時候需要在main文件夾下面分別創(chuàng)建一個debug和release文件來分別存放子模塊編譯為不同狀態(tài)時所依賴的配置文件,如圖4-7所示:


圖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)一個路由,達到組件之間的通信赡艰;


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末售淡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慷垮,更是在濱河造成了極大的恐慌揖闸,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件料身,死亡現(xiàn)場離奇詭異楔壤,居然都是意外死亡,警方通過查閱死者的電腦和手機惯驼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門蹲嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祟牲,你說我怎么就攤上這事隙畜。” “怎么了说贝?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵议惰,是天一觀的道長。 經(jīng)常有香客問我乡恕,道長言询,這世上最難降的妖魔是什么俯萎? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮运杭,結果婚禮上夫啊,老公的妹妹穿的比我還像新娘。我一直安慰自己辆憔,他們只是感情好撇眯,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虱咧,像睡著了一般熊榛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腕巡,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天玄坦,我揣著相機與錄音,去河邊找鬼绘沉。 笑死煎楣,一個胖子當著我的面吹牛,可吹牛的內容都是我干的梆砸。 我是一名探鬼主播转质,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼园欣,長吁一口氣:“原來是場噩夢啊……” “哼帖世!你這毒婦竟也來了?” 一聲冷哼從身側響起沸枯,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤日矫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绑榴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哪轿,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年翔怎,在試婚紗的時候發(fā)現(xiàn)自己被綠了窃诉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡赤套,死狀恐怖飘痛,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情容握,我是刑警寧澤宣脉,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站剔氏,受9級特大地震影響塑猖,放射性物質發(fā)生泄漏竹祷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一羊苟、第九天 我趴在偏房一處隱蔽的房頂上張望塑陵。 院中可真熱鬧,春花似錦践险、人聲如沸猿妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彭则。三九已至,卻和暖如春占遥,著一層夾襖步出監(jiān)牢的瞬間俯抖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工瓦胎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芬萍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓搔啊,卻偏偏與公主長得像柬祠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子负芋,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,525評論 25 707
  • 今天來回味下組件化和模塊化漫蛔,這2種說法時一回事,當然還是有區(qū)別的旧蛾,下面再詳細說莽龟,其實很簡單,只是設計范圍的不同锨天,也...
    前行的烏龜閱讀 48,482評論 6 94
  • 我不是什么毯盈,我也成不了什么。 面對赤裸裸的現(xiàn)實病袄、生吞活剝被揉擠的生命搂赋,我得說:“丫頭,不要輕言放棄益缠,珍惜自己擁有的...
    小草_d5ad閱讀 1,871評論 23 17
  • 木心公益書屋共同成長之《我讀我心》 第二十八天打卡(2017.5.15) 姓名:向日葵 分享內容:小窗幽記第一章(...
    簡溪_向日葵閱讀 154評論 0 0
  • 數(shù)據(jù)結構與算法--最小生成樹之Prim算法 加權圖是一種為每條邊關聯(lián)一個權值或稱為成本的圖模型脑奠。所謂生成樹,是某圖...
    sunhaiyu閱讀 2,065評論 0 7