感謝蒼王的組件化架構(gòu)锌蓄,借鑒了很多稠项。
很多內(nèi)容會慢慢細(xì)化總結(jié)涯雅。
簡介
為什么組件化
其實(shí)不是為什么,而是發(fā)展的必然趨勢皿渗。
先看下正常模塊化斩芭。
當(dāng)我們頁面越來越多轻腺,業(yè)務(wù)模塊耦合越來越嚴(yán)重乐疆,代碼非常難以維護(hù),更難測試贬养,擴(kuò)展性非常差挤土。 一旦一個(gè)模塊入口變更,很多模塊需要修改误算,關(guān)聯(lián)業(yè)務(wù)都需要測試仰美,兩個(gè)不同的APP很難公用模塊。 打個(gè)比方京東商城和京東金融儿礼,支付模塊和登錄模塊從頁面角度來講無法公用咖杂,其實(shí)業(yè)務(wù)邏輯上來講公用性很強(qiáng)。所以組件化就此誕生蚊夫。
模塊化:多module劃分業(yè)務(wù)和基礎(chǔ)功能
模塊:是獨(dú)立的業(yè)務(wù)模塊诉字,如直播模塊(LiveModule)、首頁模塊(HomeModule)、即時(shí)通訊模塊(IMModule)等壤圃。
組件:單一的功能組件陵霉,如:視頻組件(VideoSDK)、支付組件(PaySDK)伍绳、路由組件(Router)等踊挠,每個(gè)組件都能單獨(dú)抽出來制作成SDK。
模塊化和組件化的區(qū)別:模塊化是業(yè)務(wù)導(dǎo)向冲杀,組件化是功能導(dǎo)向效床。
組件化和模塊化缺點(diǎn):舊項(xiàng)目重新適配組件化的開發(fā)需要相應(yīng)的人力和時(shí)間成本。
模塊化開發(fā)好處:
業(yè)務(wù)模塊解耦权谁,業(yè)務(wù)移植更加簡單扁凛。
多團(tuán)隊(duì)根據(jù)業(yè)務(wù)內(nèi)容并行開發(fā)和測試
單個(gè)業(yè)務(wù)可以單獨(dú)編譯打包,加快編譯速度
多個(gè)APP共用模塊闯传,降低研發(fā)和維護(hù)成本
組件化開發(fā)好處:
避免重復(fù)造輪子谨朝,合理的安排人力,降低研發(fā)和維護(hù)成本
不同項(xiàng)目共用一個(gè)組件或模塊甥绿,確保整體技術(shù)方案的統(tǒng)一性
為插件化共用同一套底層模型做準(zhǔn)備字币。 終極目標(biāo)插件化。
組件化的基礎(chǔ)
AndroidStudio的依賴是組件化的基礎(chǔ)
既可以依賴jar也可以是.arr(可以包含android特有資源)
-
module依賴
同一層級:表示
自身目錄fileTree
本地庫和網(wǎng)絡(luò)庫
后續(xù)會添加單獨(dú)的Gradle連接
分層
分層來源于多人合作開發(fā)共缕。模塊相互獨(dú)立洗出,獨(dú)立開發(fā),最終合成图谷。
模塊化分層
基礎(chǔ)層(BaseModule) 集成了工具和封裝框架翩活,例如數(shù)據(jù)庫、圖片等便贵,均為輕量級封裝
業(yè)務(wù)層 每個(gè)模塊相互獨(dú)立菠镇,因?yàn)轫撁孢壿嫼啙崳瑔为?dú)的頁面可以劃分為單一的功能模塊承璃,只需一個(gè)BaseModule就可以完成基礎(chǔ)工具庫的依賴
應(yīng)用層AppModule 統(tǒng)籌整個(gè)APP的集成層利耍,最終被編譯打包成App
組件化分層
這種架構(gòu)要求組件獨(dú)立復(fù)用,模塊能夠不依賴其他模塊實(shí)現(xiàn)盔粹。 模塊層的業(yè)務(wù)邏輯需要考慮業(yè)務(wù)之間的信息交互和轉(zhuǎn)發(fā)的實(shí)現(xiàn)隘梨。
基礎(chǔ)庫層 更加基礎(chǔ)的庫類依賴,此層 非必須舷嗡,例如Rxjava轴猎、EventBus等一些代碼結(jié)構(gòu)優(yōu)化的庫,還有自己編寫的封裝類进萄。 基礎(chǔ)庫層可以轉(zhuǎn)移到基礎(chǔ)層和組件層中捻脖,這樣可以減少層級
組件層 將圖片加載烦秩、網(wǎng)絡(luò)HTTP、Socket等基礎(chǔ)功能劃分為一層郎仆。
基礎(chǔ)層 基礎(chǔ)組件的整合只祠,提供基礎(chǔ)組件能力給業(yè)務(wù)層使用。 基礎(chǔ)層可以只是一個(gè)空殼扰肌,起到隔離模塊層和組件層的入口作用抛寝;可以作為中轉(zhuǎn),封裝一些必須要使用的組件功能曙旭,隱蔽一些實(shí)現(xiàn)細(xì)節(jié)盗舰。
模塊層 每個(gè)模塊相當(dāng)于一個(gè)業(yè)務(wù),通過Module來分隔每個(gè)業(yè)務(wù)的邏輯桂躏,一個(gè)模塊由多個(gè)不同的頁面邏輯組成钻趋。
-
應(yīng)用層 生成App和加載初始化操作。
多模板化
多模板化是融合了組件化分發(fā)后演化而來的架構(gòu)剂习。
在模塊化的前提蛮位,使用組件化分發(fā),單頁面中分發(fā)出多個(gè)獨(dú)立的業(yè)務(wù)鳞绕。 模板層服務(wù)于多個(gè)分發(fā)業(yè)務(wù)的組裝失仁。 在模板層中,一個(gè)模板包含多種業(yè)務(wù)们何,一個(gè)頁面可以使用多個(gè)模板的邏輯萄焦。 例如,直播間和QQ聊天室冤竹,當(dāng)有多個(gè)特別模板的布局組裝和位置變更時(shí)拂封,就需要配置模板。 多模板化的產(chǎn)品要求樣式多變鹦蠕,其衍生架構(gòu)演變是模塊化進(jìn)化的一個(gè)方向插件化
當(dāng)分層已經(jīng)非常穩(wěn)定后冒签,熱修復(fù)、熱更新技術(shù)催生出了插件化開發(fā)片部。 適合多個(gè)業(yè)務(wù)模塊動態(tài)迭代镣衡。一個(gè)小組可以負(fù)責(zé)一個(gè)業(yè)務(wù)工程,脫了原來宿主工的研發(fā)档悠。
組件層中需要添加插件框架,如Small望浩、Atlas辖所、RePlugin等,根據(jù)項(xiàng)目情況作出選型磨德,選型調(diào)研尤為重要缘回。
模塊層的每個(gè)模塊是以業(yè)務(wù)是否獨(dú)立作為劃分條件吆视,例如,地圖酥宴、直播間啦吧、活動、第三方嵌入拙寡,做為單獨(dú)的研發(fā)分支(SVN授滓、Git工程)。每個(gè)模塊作為基礎(chǔ)項(xiàng)目研發(fā)肆糕,模塊之間相互獨(dú)立般堆,項(xiàng)目達(dá)到最大程度解耦。
-
應(yīng)用層對應(yīng)插件化宿主App诚啃,一些非郴此ぃ基礎(chǔ)的業(yè)務(wù)如登錄、支付等需要賬號的模塊基礎(chǔ)到這來始赎。
如果公司對這些模塊有很好的插件化加載方案和解耦能力和橙,可以選擇使用這些分離技術(shù)。
宿主App只是一個(gè)殼造垛,用于初始化插件化框架胃碾,并加載不同的模塊。
插件化問題:
解決資源冗余筋搏,包括對Base Module的依賴和庫依賴
資源混淆和資源沖突
插件加載方式
-
通信依賴仆百、數(shù)據(jù)交互、事件機(jī)制奔脐。
舉個(gè)模塊間通信機(jī)制的例子俄周,假如用RxBus進(jìn)行通信,每次都需要添加一個(gè)新的類髓迎,每個(gè)事件類都需要添加到Base module中峦朗。通信機(jī)制的架構(gòu)非常不穩(wěn)定,功能疊加后模塊越來越多排龄,會造成類爆炸波势。需要設(shè)計(jì)接口向前兼容,就得接口不能進(jìn)行過多的修改橄维,不能刪除和更改參數(shù)尺铣,只能增加。
進(jìn)程化
當(dāng)App越來越大時(shí)争舞,比如已經(jīng)達(dá)到了支付寶凛忿、微信、商城這種超大型級別竞川,一個(gè)App占用幾百M(fèi)B以上空間時(shí)店溢,幾乎需要使用Android開發(fā)的全部功能叁熔。
為了讓系統(tǒng)給App分配更大的內(nèi)存,更加流暢的運(yùn)行床牧,就開始進(jìn)程化荣回。 因?yàn)锳dnroid系統(tǒng)是以進(jìn)程為單位限制內(nèi)存和資源分配不是APP。
進(jìn)程定義需要以四大組件為入口戈咳,四大組件在AndroidManifest.xml中使用process字段來聲明額外的進(jìn)程心软。
分層說明:
- 進(jìn)程層是以非常大的功能業(yè)務(wù)為劃分條件,例如:播放視頻除秀、拍照糯累、播放音樂、地圖導(dǎo)航册踩、游覽web等非常消耗內(nèi)存的模塊泳姐。
好處:
使APP獲得更多內(nèi)存,運(yùn)行更加流暢暂吉,避免單進(jìn)程內(nèi)存過大而不斷回收內(nèi)存導(dǎo)致的卡頓問題胖秒,避免內(nèi)存過低被系統(tǒng)殺死。(一些播放視頻慕的、播放音樂阎肝、拍攝、游覽網(wǎng)頁等非常耗費(fèi)資源的操作放在其他進(jìn)程)
有效避免OOM問題肮街,單進(jìn)程崩潰不影響應(yīng)用的使用(如果濫用內(nèi)存還是沒辦法避免)
問題:
-
跨進(jìn)程的通信和交互比組件化风题、模塊化更加復(fù)雜。 多進(jìn)程通信方式:
通信方式 優(yōu)點(diǎn) 缺點(diǎn) Bundle 簡單易用 只能傳輸基礎(chǔ)數(shù)據(jù)類型和實(shí)現(xiàn)P 四大組件間通信 文件共享 簡單易用 不適用高并發(fā)場景嫉父,并且無法做到進(jìn)程間的及時(shí)通信 無并發(fā)訪問的情形沛硅,交互簡單的數(shù)據(jù)實(shí)時(shí)性不高的場景 AIDL 功能強(qiáng)大,支持一對多并發(fā)通信绕辖,支持實(shí)時(shí)通信 使用稍微復(fù)雜摇肌,需要處理好線程同步 一對多通信且有RPC需求 Messenger 功能一般,支持一對多串行通信仪际,支持實(shí)時(shí)通信 不能很好處理高并發(fā)情形围小,不支持RPC,數(shù)據(jù)通過Message進(jìn)行傳輸树碱,因此只能傳輸Bundle支持的數(shù)據(jù)類型 低并發(fā)的一對多即時(shí)通信肯适,無RPC需求,或者無需要返回結(jié)果的RPC需求 socket 功能強(qiáng)大赴恨,支持一對多的并發(fā)數(shù)據(jù)共享疹娶,可以通過call方法擴(kuò)展其他操作 可以理解為受約束的AIDL,主要提供數(shù)據(jù)源的CURD操作 一對多的進(jìn)程間的數(shù)據(jù)共享 ContentProvider 功能強(qiáng)大伦连,可以通過網(wǎng)絡(luò)傳輸字節(jié)流雨饺,支持一對多并發(fā)實(shí)時(shí)通信 實(shí)現(xiàn)細(xì)節(jié)稍微有點(diǎn)繁瑣,不支持直接的RPC 網(wǎng)絡(luò)數(shù)據(jù)交互(Android系統(tǒng)內(nèi)部也有很多地方用的socket) 靜態(tài)成員和單例模式失效惑淳。
線程同步機(jī)制完全失效
SharedPreferences的可靠性下降额港,因?yàn)闆]有對多進(jìn)程支持。
文件讀寫的時(shí)候歧焦,需要考慮并發(fā)訪問文件的問題移斩。
SQLite很容易被鎖,其他進(jìn)程訪問時(shí)就會報(bào)出異常绢馍。
-
Application多次創(chuàng)建向瓷。(多次onCreate,只能通過進(jìn)程名來區(qū)分)