組件化

感謝蒼王的組件化架構(gòu)锌蓄,借鑒了很多稠项。
很多內(nèi)容會慢慢細(xì)化總結(jié)涯雅。

簡介

為什么組件化

其實(shí)不是為什么,而是發(fā)展的必然趨勢皿渗。

先看下正常模塊化斩芭。

模塊化1.PNG

當(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ā)好處:

  1. 業(yè)務(wù)模塊解耦权谁,業(yè)務(wù)移植更加簡單扁凛。

  2. 多團(tuán)隊(duì)根據(jù)業(yè)務(wù)內(nèi)容并行開發(fā)和測試

  3. 單個(gè)業(yè)務(wù)可以單獨(dú)編譯打包,加快編譯速度

  4. 多個(gè)APP共用模塊闯传,降低研發(fā)和維護(hù)成本

組件化開發(fā)好處:

  1. 避免重復(fù)造輪子谨朝,合理的安排人力,降低研發(fā)和維護(hù)成本

  2. 不同項(xiàng)目共用一個(gè)組件或模塊甥绿,確保整體技術(shù)方案的統(tǒng)一性

  3. 為插件化共用同一套底層模型做準(zhǔn)備字币。 終極目標(biāo)插件化。

組件化的基礎(chǔ)

AndroidStudio的依賴是組件化的基礎(chǔ)

  1. 既可以依賴jar也可以是.arr(可以包含android特有資源)

  2. module依賴

    • 同一層級:表示

    • 自身目錄fileTree

  3. 本地庫和網(wǎng)絡(luò)庫
    后續(xù)會添加單獨(dú)的Gradle連接

分層

分層來源于多人合作開發(fā)共缕。模塊相互獨(dú)立洗出,獨(dú)立開發(fā),最終合成图谷。

模塊化分層
  1. 基礎(chǔ)層(BaseModule) 集成了工具和封裝框架翩活,例如數(shù)據(jù)庫、圖片等便贵,均為輕量級封裝

  2. 業(yè)務(wù)層 每個(gè)模塊相互獨(dú)立菠镇,因?yàn)轫撁孢壿嫼啙崳瑔为?dú)的頁面可以劃分為單一的功能模塊承璃,只需一個(gè)BaseModule就可以完成基礎(chǔ)工具庫的依賴

  3. 應(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)隘梨。

  1. 基礎(chǔ)庫層 更加基礎(chǔ)的庫類依賴,此層 非必須舷嗡,例如Rxjava轴猎、EventBus等一些代碼結(jié)構(gòu)優(yōu)化的庫,還有自己編寫的封裝類进萄。 基礎(chǔ)庫層可以轉(zhuǎn)移到基礎(chǔ)層和組件層中捻脖,這樣可以減少層級

  2. 組件層 將圖片加載烦秩、網(wǎng)絡(luò)HTTP、Socket等基礎(chǔ)功能劃分為一層郎仆。

  3. 基礎(chǔ)層 基礎(chǔ)組件的整合只祠,提供基礎(chǔ)組件能力給業(yè)務(wù)層使用。 基礎(chǔ)層可以只是一個(gè)空殼扰肌,起到隔離模塊層和組件層的入口作用抛寝;可以作為中轉(zhuǎn),封裝一些必須要使用的組件功能曙旭,隱蔽一些實(shí)現(xiàn)細(xì)節(jié)盗舰。

  4. 模塊層 每個(gè)模塊相當(dāng)于一個(gè)業(yè)務(wù),通過Module來分隔每個(gè)業(yè)務(wù)的邏輯桂躏,一個(gè)模塊由多個(gè)不同的頁面邏輯組成钻趋。

  5. 應(yīng)用層 生成App和加載初始化操作。
    componentized-1.png
多模板化

多模板化是融合了組件化分發(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è)方向
componentized-2.png
插件化

當(dāng)分層已經(jīng)非常穩(wěn)定后冒签,熱修復(fù)、熱更新技術(shù)催生出了插件化開發(fā)片部。 適合多個(gè)業(yè)務(wù)模塊動態(tài)迭代镣衡。一個(gè)小組可以負(fù)責(zé)一個(gè)業(yè)務(wù)工程,脫了原來宿主工的研發(fā)档悠。

  1. 組件層中需要添加插件框架,如Small望浩、Atlas辖所、RePlugin等,根據(jù)項(xiàng)目情況作出選型磨德,選型調(diào)研尤為重要缘回。

  2. 模塊層的每個(gè)模塊是以業(yè)務(wù)是否獨(dú)立作為劃分條件吆视,例如,地圖酥宴、直播間啦吧、活動、第三方嵌入拙寡,做為單獨(dú)的研發(fā)分支(SVN授滓、Git工程)。每個(gè)模塊作為基礎(chǔ)項(xiàng)目研發(fā)肆糕,模塊之間相互獨(dú)立般堆,項(xiàng)目達(dá)到最大程度解耦。

  3. 應(yīng)用層對應(yīng)插件化宿主App诚啃,一些非郴此ぃ基礎(chǔ)的業(yè)務(wù)如登錄、支付等需要賬號的模塊基礎(chǔ)到這來始赎。

    如果公司對這些模塊有很好的插件化加載方案和解耦能力和橙,可以選擇使用這些分離技術(shù)。

    宿主App只是一個(gè)殼造垛,用于初始化插件化框架胃碾,并加載不同的模塊。

插件化問題:

  1. 解決資源冗余筋搏,包括對Base Module的依賴和庫依賴

  2. 資源混淆和資源沖突

  3. 插件加載方式

  4. 通信依賴仆百、數(shù)據(jù)交互、事件機(jī)制奔脐。

    舉個(gè)模塊間通信機(jī)制的例子俄周,假如用RxBus進(jìn)行通信,每次都需要添加一個(gè)新的類髓迎,每個(gè)事件類都需要添加到Base module中峦朗。通信機(jī)制的架構(gòu)非常不穩(wěn)定,功能疊加后模塊越來越多排龄,會造成類爆炸波势。需要設(shè)計(jì)接口向前兼容,就得接口不能進(jìn)行過多的修改橄维,不能刪除和更改參數(shù)尺铣,只能增加。


    componentized-3.png
進(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)存的模塊泳姐。

好處:

  1. 使APP獲得更多內(nèi)存,運(yùn)行更加流暢暂吉,避免單進(jìn)程內(nèi)存過大而不斷回收內(nèi)存導(dǎo)致的卡頓問題胖秒,避免內(nèi)存過低被系統(tǒng)殺死。(一些播放視頻慕的、播放音樂阎肝、拍攝、游覽網(wǎng)頁等非常耗費(fèi)資源的操作放在其他進(jìn)程)

  2. 有效避免OOM問題肮街,單進(jìn)程崩潰不影響應(yīng)用的使用(如果濫用內(nèi)存還是沒辦法避免)

問題:

  1. 跨進(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)
  2. 靜態(tài)成員和單例模式失效惑淳。

  3. 線程同步機(jī)制完全失效

  4. SharedPreferences的可靠性下降额港,因?yàn)闆]有對多進(jìn)程支持。

  5. 文件讀寫的時(shí)候歧焦,需要考慮并發(fā)訪問文件的問題移斩。

  6. SQLite很容易被鎖,其他進(jìn)程訪問時(shí)就會報(bào)出異常绢馍。

  7. Application多次創(chuàng)建向瓷。(多次onCreate,只能通過進(jìn)程名來區(qū)分)
    componentized-4.png
componentized-5.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舰涌,一起剝皮案震驚了整個(gè)濱河市猖任,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓷耙,老刑警劉巖朱躺,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搁痛,居然都是意外死亡长搀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門鸡典,熙熙樓的掌柜王于貴愁眉苦臉地迎上來源请,“玉大人,你說我怎么就攤上這事彻况∷” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵疗垛,是天一觀的道長症汹。 經(jīng)常有香客問我,道長贷腕,這世上最難降的妖魔是什么背镇? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮泽裳,結(jié)果婚禮上瞒斩,老公的妹妹穿的比我還像新娘。我一直安慰自己涮总,他們只是感情好胸囱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瀑梗,像睡著了一般烹笔。 火紅的嫁衣襯著肌膚如雪裳扯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天谤职,我揣著相機(jī)與錄音饰豺,去河邊找鬼。 笑死允蜈,一個(gè)胖子當(dāng)著我的面吹牛冤吨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饶套,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漩蟆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妓蛮?” 一聲冷哼從身側(cè)響起怠李,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仔引,沒想到半個(gè)月后扔仓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咖耘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年翘簇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儿倒。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡版保,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夫否,到底是詐尸還是另有隱情彻犁,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布凰慈,位于F島的核電站汞幢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏微谓。R本人自食惡果不足惜森篷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豺型。 院中可真熱鬧仲智,春花似錦、人聲如沸姻氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至前联,卻和暖如春功戚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛀恩。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工疫铜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茂浮,地道東北人双谆。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像席揽,于是被迫代替她去往敵國和親顽馋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容