Android架構(gòu)分層演進(jìn)實(shí)踐

我們知道沼溜,軟件開(kāi)發(fā)項(xiàng)目是一個(gè)綜合平衡的過(guò)程丹喻,要平衡時(shí)間、成本俊性、范圍搪桂、質(zhì)量四個(gè)要素透敌,在單個(gè)項(xiàng)目中,這四要素是非此即彼的:時(shí)間緊迫就要壓縮需求范圍踢械,添加需求就要追加成本酗电,確保質(zhì)量就不能過(guò)于壓縮工期,相互之間無(wú)法調(diào)和内列。

但如果跳出單個(gè)項(xiàng)目撵术,在日常積累上面下功夫,我們卻有可能找到一種同時(shí)有利于項(xiàng)目四要素的途徑德绿,就是建立和使用通用的開(kāi)發(fā)架構(gòu)荷荤。

大部分公司不會(huì)僅研發(fā)一個(gè)App,而是會(huì)研發(fā)一系列App移稳,形成家族化蕴纳、品牌化,或互相依賴(lài)个粱,或入場(chǎng)試錯(cuò)古毛,這些App功能業(yè)務(wù)可能不盡相同,但一般都需要網(wǎng)絡(luò)模塊/日志模塊/圖像加載模塊,需要一些常見(jiàn)的簡(jiǎn)單函數(shù)稻薇,為建立品牌形象嫂冻,還需要統(tǒng)一的主題資源如色調(diào)/圖標(biāo)/提示語(yǔ)等。

這些低水平的重復(fù)開(kāi)發(fā)塞椎,是與業(yè)務(wù)沒(méi)有直接關(guān)系卻必須支付的“死重”桨仿,是可以通過(guò)模塊復(fù)用來(lái)提升效率的,這也是我們做Android架構(gòu)分層的初衷案狠,我們把開(kāi)發(fā)中常用的模塊抽象出來(lái)服傍,分組分層,形成結(jié)構(gòu)清晰骂铁,組裝靈活的通用組件庫(kù)吹零,支撐起了多個(gè)App的快速實(shí)現(xiàn)與迭代。

image

image

價(jià)值

在實(shí)際開(kāi)發(fā)過(guò)程中拉庵,我們發(fā)現(xiàn)通用組件庫(kù)對(duì)于開(kāi)發(fā)的效率和質(zhì)量灿椅,都有了顯著的提升:

節(jié)省時(shí)間,因?yàn)榻M件功能可以復(fù)用钞支,能降低團(tuán)隊(duì)成員熟悉項(xiàng)目的成本茫蛹,為新業(yè)務(wù)開(kāi)發(fā)提供基礎(chǔ),加快開(kāi)發(fā)迭代速度伸辟,有利于更快地發(fā)布版本麻惶。

降低成本,把穩(wěn)定的公共模塊抽象為通用組件庫(kù)信夫,提供給各個(gè)業(yè)務(wù)線(xiàn)協(xié)作使用窃蹋,能在全公司范圍內(nèi)減少重復(fù)開(kāi)發(fā)和升級(jí)維護(hù)的工作量

提升質(zhì)量,頻繁使用的功能/業(yè)務(wù)模塊采用組件復(fù)用方式静稻,更有利于暴露缺陷警没,一處修改,多處受益振湾,提高產(chǎn)品質(zhì)量杀迹。

image

具體設(shè)計(jì)

對(duì)于App來(lái)說(shuō),選用組件應(yīng)該按需取用押搪,僅選用自己需要的那些組件树酪,這就需要把組件分離為多個(gè),形成一個(gè)結(jié)構(gòu)化的組件庫(kù)大州,我們最終形成的組件庫(kù)大概是這樣的:

image

在上圖的結(jié)構(gòu)中续语,通用組件是與業(yè)務(wù)無(wú)關(guān)的基礎(chǔ)功能,共享組件是與業(yè)務(wù)有緊密聯(lián)系的厦画,共享組件可能需要引用通用組件疮茄。

image

在具體實(shí)現(xiàn)中滥朱,我們處理過(guò)這樣幾個(gè)問(wèn)題:

引用形式:在引用形式上,我們有aar和module代碼兩種方式力试,其中aar適合函數(shù)已經(jīng)固定徙邻,不允許擴(kuò)展修改的情況;module適合類(lèi)型已經(jīng)分開(kāi)畸裳,但是函數(shù)并未固定缰犁,可以增加新函數(shù)的情況。

依賴(lài)倒置:在引用第三方庫(kù)時(shí)躯畴,我們禁止直接引用民鼓,App可以直接引用第三方庫(kù),但是組件必須使用自己的接口蓬抄,這樣在第三方庫(kù)升級(jí)或者更換時(shí),不會(huì)影響頂層的app夯到。例如網(wǎng)絡(luò)層必須使用網(wǎng)絡(luò)組件自己定義的callback接口嚷缭,實(shí)際上就是都要依賴(lài)于抽象,不能依賴(lài)具體耍贾。

接口隔離:組件庫(kù)大量使用接口為App服務(wù)阅爽,這要求接口保持互相隔離,盡量把功能拆分到多個(gè)接口里荐开,不能出現(xiàn)大而全的接口付翁。

單一職責(zé):每個(gè)組件僅負(fù)責(zé)一類(lèi)功能,互相之間可以有調(diào)用晃听,但不能出現(xiàn)一個(gè)大而全的組件百侧。

開(kāi)放封閉:組件中的函數(shù)是嚴(yán)禁修改的,可以增加新函數(shù)能扒,但嚴(yán)禁修改已有函數(shù)佣渴,除非是為了消除缺陷。

異常拋出:底層組件有時(shí)候必須做異常捕獲初斑,無(wú)論是Exception還是Error都需要拋出辛润,也就是說(shuō)所有的Throwable都需要向上層拋出,避免應(yīng)用層莫名其妙的發(fā)現(xiàn)流程被打斷见秤,無(wú)法查知底層組件出現(xiàn)的異常砂竖。

質(zhì)量控制:底層組件的場(chǎng)景比較抽象也比較固定,實(shí)際上容易做單元測(cè)試和自動(dòng)化測(cè)試鹃答,為組件開(kāi)發(fā)專(zhuān)門(mén)的自動(dòng)測(cè)試模塊乎澄,甚至出一個(gè)自動(dòng)測(cè)試demo,都是性?xún)r(jià)比很高的投入挣跋。

代碼追溯:對(duì)于module形式共享的組件三圆,實(shí)際上允許開(kāi)發(fā)團(tuán)隊(duì)進(jìn)行擴(kuò)展和修改,但是所有的變更都隱藏著缺陷,所以在組件庫(kù)的代碼提交中舟肉,必須進(jìn)行代碼審查修噪,并注釋代碼修改的時(shí)間、事由路媚、操作人等黄琼,以便在出現(xiàn)缺陷時(shí)進(jìn)行追溯 。

jar包沖突:長(zhǎng)期維護(hù)下來(lái)整慎,必然可能引用多個(gè)版本的第三方庫(kù)脏款,這就會(huì)產(chǎn)生jar包沖突的問(wèn)題,所以有必要在底層建立一個(gè)整合第三方庫(kù)的module裤园,各App共同引用這個(gè)庫(kù)module撤师。

版本分支:有些情況下,某些第三方庫(kù)發(fā)生了大版本的迭代更新拧揽,更新前后的功能變化極大剃盾,導(dǎo)致app無(wú)法完美兼容,這就需要建立版本分支淤袜,使用特定版本的組件庫(kù)痒谴,維持app的研發(fā)需求,直至app重構(gòu)铡羡,或app消亡积蔚。

路由解耦:有些業(yè)務(wù)組件是有Activity的,這些組件之間跳轉(zhuǎn)時(shí)烦周,為了解耦合尽爆,應(yīng)該避免通過(guò)包名和類(lèi)名去跳轉(zhuǎn),可以參考Android的Intent思想论矾,允許通過(guò)action和category一起過(guò)濾教翩,找到跳轉(zhuǎn)目標(biāo),實(shí)際開(kāi)發(fā)中可以做一個(gè)Router贪壳,例如阿里開(kāi)源的ARouter

image

最終饱亿,App選用組件庫(kù)的結(jié)構(gòu),大概是這樣的:

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闰靴,一起剝皮案震驚了整個(gè)濱河市彪笼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚂且,老刑警劉巖配猫,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杏死,居然都是意外死亡泵肄,警方通過(guò)查閱死者的電腦和手機(jī)捆交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腐巢,“玉大人品追,你說(shuō)我怎么就攤上這事》氡” “怎么了肉瓦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胃惜。 經(jīng)常有香客問(wèn)我泞莉,道長(zhǎng),這世上最難降的妖魔是什么船殉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任鲫趁,我火速辦了婚禮,結(jié)果婚禮上利虫,老公的妹妹穿的比我還像新娘饮寞。我一直安慰自己,他們只是感情好列吼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著苦始,像睡著了一般寞钥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陌选,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天理郑,我揣著相機(jī)與錄音,去河邊找鬼咨油。 笑死您炉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的役电。 我是一名探鬼主播赚爵,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼法瑟!你這毒婦竟也來(lái)了冀膝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霎挟,失蹤者是張志新(化名)和其女友劉穎窝剖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酥夭,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赐纱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年脊奋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疙描。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诚隙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淫痰,到底是詐尸還是另有隱情最楷,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布待错,位于F島的核電站籽孙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏火俄。R本人自食惡果不足惜犯建,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓜客。 院中可真熱鬧适瓦,春花似錦、人聲如沸谱仪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疯攒。三九已至嗦随,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敬尺,已是汗流浹背枚尼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砂吞,地道東北人署恍。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜻直,于是被迫代替她去往敵國(guó)和親盯质。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 起源 我們知道袭蝗,軟件開(kāi)發(fā)項(xiàng)目是一個(gè)綜合平衡的過(guò)程唤殴,要平衡時(shí)間、成本到腥、范圍朵逝、質(zhì)量四個(gè)要素,在單個(gè)項(xiàng)目中乡范,這四要素是非...
    藍(lán)灰_q閱讀 1,615評(píng)論 0 3
  • 作者介紹馮宇飛 配名,現(xiàn)任人人車(chē)Android客戶(hù)端架構(gòu)師啤咽。 本文回顧總結(jié)了人人車(chē)公司Android客戶(hù)端的架構(gòu)演進(jìn)歷...
    passiontim閱讀 1,545評(píng)論 0 9
  • Android組件化項(xiàng)目地址:Android組件化項(xiàng)目AndroidModulePattern Android組件...
    半灬邊灬天閱讀 2,922評(píng)論 4 37
  • 本文系總結(jié)作業(yè),部分參考內(nèi)容在這里 在 JavaScript 規(guī)范中渠脉,共定義了6+1宇整,七種數(shù)據(jù)類(lèi)型,分為6種原始類(lèi)...
    竹鼠不要中暑閱讀 357評(píng)論 0 0
  • 很奇怪芋膘,在資本市場(chǎng)中經(jīng)常有人在教導(dǎo)別人要理性鳞青。而所有理性模式后面,都毫無(wú)例外地對(duì) 應(yīng)著一套價(jià)值系統(tǒng)為依據(jù)为朋,企圖通過(guò)...
    lexluseyan閱讀 503評(píng)論 0 1