大型移動(dòng)應(yīng)用解決之道 - 組件化

讀者在閱讀本篇文章時(shí)饲常,建議先看下“插件化”那邊文章介紹的研發(fā)痛點(diǎn)與研發(fā)流程蹲堂。

在插件化那篇文件中,我們介紹了插件化解決了很多痛點(diǎn)問(wèn)題贝淤,很完美的方案柒竞,不管是研發(fā)還是產(chǎn)品都愛(ài)不釋手,但是插件化的實(shí)現(xiàn)并不是這么容易就能應(yīng)用到產(chǎn)品中播聪,還是要折騰折騰的朽基,其次還要看團(tuán)隊(duì)中有沒(méi)有大神級(jí)人物能hold住。在replugin沒(méi)有開(kāi)源之前离陶,我一直沒(méi)有信心插件化可以落戶每個(gè)Android應(yīng)用稼虎,因?yàn)榉€(wěn)定性問(wèn)題是阻礙插件化的最大絆腳石,這么美的東西得不到手枕磁,實(shí)在是讓人懷疑人生渡蜻,隨著replugin的開(kāi)源,世界又變的如此的美好了计济。即便是這樣茸苇,插件化仍然也有一定的門檻,讓一些團(tuán)隊(duì)望而卻步沦寂。但是面臨如此多的問(wèn)題:方法數(shù)限制学密、安裝包體積、團(tuán)隊(duì)耦合嚴(yán)重传藏、編譯打包慢腻暮、靈活性差等等問(wèn)題,該如何解決毯侦? 答案就是組件化哭靖,組件化不能解決以上所有問(wèn)題,但是也能幫助我們解決一些燃眉之急侈离。

組件化不像插件化那樣強(qiáng)大试幽,解決眾多問(wèn)題,但是組件化同樣是一員猛將卦碾,也會(huì)讓人愛(ài)不釋手铺坞。

組件化可以解決以下問(wèn)題:

1.?團(tuán)隊(duì)耦合嚴(yán)重

2.?部分靈活性問(wèn)題

組件化不像插件化那樣解決靈活性問(wèn)題那么徹底起宽,比如:電商應(yīng)用中的不需要安裝即可上線的一些需求,組件化是無(wú)能無(wú)力的济榨。組件化和插件化一樣都具備模塊化的要求坯沪,即我們都會(huì)產(chǎn)生模塊化的倉(cāng)庫(kù),產(chǎn)品可隨意組裝拼接(安裝包體積可控)擒滑,像搭積木一樣靈活腐晾,各組件的實(shí)現(xiàn)在編譯階段任意替換。

3.?調(diào)試定位問(wèn)題慢

分析

與插件化分析思路相同橘忱,將應(yīng)用進(jìn)行拆分分解到不同的組件中赴魁,插件化與組件化在對(duì)業(yè)務(wù)的拆分原則上相同(可參照插件化的分析章節(jié)),各個(gè)插件與組件都盡量走可獨(dú)立運(yùn)行的路線钝诚,而在插件化的開(kāi)發(fā)中,插件化與組件化應(yīng)該是一種并存的狀態(tài)榄棵,并不是所有的業(yè)務(wù)需求都是一個(gè)可獨(dú)立運(yùn)行的單元凝颇,如果你的架構(gòu)足夠細(xì)化,一定會(huì)提煉出很多組件疹鳄,向各個(gè)插件提供支持拧略。通常這種組件不能獨(dú)立運(yùn)行,需要被集成瘪弓,擴(kuò)展或配置之后才可運(yùn)行垫蛆,這種組件可能是業(yè)務(wù)上的,也有可能是技術(shù)上的腺怯。另外袱饭,完成組件化的架構(gòu)之后后續(xù)轉(zhuǎn)移到插件化會(huì)相對(duì)容易很多。

通常組件的拆分呛占,大致見(jiàn)下圖:

什么是組件化虑乖?

個(gè)人總結(jié):組件化是基于模塊化基礎(chǔ)之上,旨在解決開(kāi)發(fā)階段導(dǎo)致團(tuán)隊(duì)耦合嚴(yán)重等問(wèn)題的一種開(kāi)發(fā)模式晾虑。

組件化與插件化的區(qū)別疹味?

我們先看下組件化的研發(fā)流程,組件化的研發(fā)流程可分為兩個(gè)部分:

1.?開(kāi)發(fā)階段

從上圖我們可以清晰的看到帜篇,與插件化的研發(fā)流程上基本相同糙捺,但是大家要注意這僅是“開(kāi)發(fā)階段”,這樣發(fā)布的版本僅是build版本笙隙,只供QA測(cè)試使用洪灯。這樣做的目的僅是為了減少上面提到的在開(kāi)發(fā)階段耦合嚴(yán)重,定位問(wèn)題慢等問(wèn)題逃沿。 由于將整個(gè)應(yīng)用拆分成了若干業(yè)務(wù)模塊婴渡,每個(gè)模塊在開(kāi)發(fā)階段獨(dú)立開(kāi)發(fā)幻锁,打包,測(cè)試边臼,各模塊間通過(guò)接口協(xié)議來(lái)進(jìn)行通信哄尔。當(dāng)某個(gè)模塊無(wú)法向另外一個(gè)模塊提供接口實(shí)現(xiàn)時(shí),則由當(dāng)前模塊團(tuán)隊(duì)提供模擬的接口實(shí)現(xiàn)來(lái)進(jìn)行測(cè)試實(shí)現(xiàn)柠并。

2. 發(fā)布階段

從上圖可以看出岭接,在真正要發(fā)布版本時(shí),流程是不同的臼予,整個(gè)打包發(fā)布流程是串行的鸣戴,各個(gè)組件的負(fù)責(zé)人需要將正式的組件版本發(fā)布到Maven倉(cāng)庫(kù)中,由集成打包測(cè)試服務(wù)器來(lái)進(jìn)行集成打包粘拾,這樣一來(lái)真正發(fā)布的產(chǎn)品是對(duì)所有組件的集成(安裝包體積仍沒(méi)有改善窄锅,同時(shí)面臨升級(jí)轉(zhuǎn)化,流量缰雇,內(nèi)存等問(wèn)題)入偷,而在插件化中任何階段的打包發(fā)布流程都是并行的,并且發(fā)布的產(chǎn)品只包括核心的功能需求(安裝包體積行涤础)疏之,其余均按需下載支持。

通過(guò)上面的描述暇咆,相信讀者對(duì)插件化與組件化區(qū)別有了一定的了解锋爪。

組件化開(kāi)發(fā)中遇到的問(wèn)題?

組件化開(kāi)發(fā)中會(huì)面臨各種各樣的問(wèn)題爸业,相對(duì)插件化好解決一些其骄,我們來(lái)簡(jiǎn)單介紹下相關(guān)問(wèn)題:

1.?Context問(wèn)題

由于每個(gè)組件在開(kāi)發(fā)階段獨(dú)立開(kāi)發(fā),其他組件可能有自己的application沃呢,各自組件都通過(guò)自己的application去獲取context顯然是錯(cuò)誤的年栓,因?yàn)楫?dāng)被打包到一起時(shí),組件內(nèi)的application不會(huì)被做為主Application(不會(huì)被執(zhí)行attach)薄霜,即使組件內(nèi)的application對(duì)象可以創(chuàng)建某抓,但是組件的application不含LoadedApk等信息,不是一個(gè)真正的Context對(duì)象惰瓜。 在組件內(nèi)可通過(guò)ActivityThead#currentThread()#getApplication()來(lái)獲取否副。

2.?Activity跳轉(zhuǎn)問(wèn)題

組件間存在依賴,互相調(diào)用UI的情況是很常見(jiàn)的崎坊,如何調(diào)用备禀?

1)通過(guò)定義不同的action來(lái)實(shí)現(xiàn);

2)通過(guò)在activity中定義schema,host,path也就是uri來(lái)實(shí)現(xiàn)(推薦使用);

3.?View id的問(wèn)題

由于每個(gè)組件在開(kāi)發(fā)時(shí)是獨(dú)立的曲尸,而每個(gè)組件的layout文件中的view的id是通過(guò)@+id/xx來(lái)實(shí)現(xiàn)的赋续,那么在合并時(shí)組件作為lib,在編譯main時(shí)如果使用的是@+id會(huì)重新生成ID這樣會(huì)導(dǎo)致view找不到的問(wèn)題另患,所以需要強(qiáng)制view不能進(jìn)行編譯纽乱,需要在ids.xml和public.xml中進(jìn)行定義。而每個(gè)layout文件則需要使用@id/xx的方式使用昆箕,不要使用+號(hào)鸦列。

4.?資源名稱沖突

由于在最終打包時(shí)會(huì)將A組件中的資源合并到main中進(jìn)行編譯,那么A組件中的資源名稱不允許與main中的資源重名鹏倘,所以每個(gè)組件中的資源前綴需要添加自己組建的名稱薯嗤;

5.在各個(gè)組件開(kāi)發(fā)階段最好使用同uid來(lái)實(shí)現(xiàn)。

6.包重復(fù)加載問(wèn)題(如果我們各個(gè)組件均通過(guò)gradle從maven去獲取纤泵,這個(gè)問(wèn)題gradle會(huì)屏蔽掉)

寫到這里骆姐,不知道讀者是不是已經(jīng)對(duì)組件化有了一些了解。如果讀者在實(shí)現(xiàn)的過(guò)程中有任何問(wèn)題夕吻,我們可以一起討論诲锹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涉馅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黄虱,老刑警劉巖稚矿,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捻浦,居然都是意外死亡晤揣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門朱灿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昧识,“玉大人,你說(shuō)我怎么就攤上這事盗扒」蚶悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵侣灶,是天一觀的道長(zhǎng)甸祭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)褥影,這世上最難降的妖魔是什么池户? 我笑而不...
    開(kāi)封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上校焦,老公的妹妹穿的比我還像新娘赊抖。我一直安慰自己,他們只是感情好寨典,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布氛雪。 她就那樣靜靜地躺著,像睡著了一般凝赛。 火紅的嫁衣襯著肌膚如雪注暗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天墓猎,我揣著相機(jī)與錄音捆昏,去河邊找鬼。 笑死毙沾,一個(gè)胖子當(dāng)著我的面吹牛骗卜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播左胞,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寇仓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了烤宙?” 一聲冷哼從身側(cè)響起遍烦,我...
    開(kāi)封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躺枕,沒(méi)想到半個(gè)月后服猪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拐云,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年罢猪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叉瘩。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膳帕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薇缅,到底是詐尸還是另有隱情危彩,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布捅暴,位于F島的核電站恬砂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蓬痒。R本人自食惡果不足惜泻骤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一漆羔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狱掂,春花似錦演痒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至器虾,卻和暖如春讯嫂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兆沙。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工欧芽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葛圃。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓千扔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親库正。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曲楚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354