Android組件化/模塊化開發(一)

上一篇文章發布之后又摸了小半年的魚,前段時間精神狀態確實很懶,寫的東西都帶有記流水賬的性質。所以這次決定寫點干貨。
換了新工作之后,到新公司接手了公司以前的老項目。整個項目都是用coordova、ionic混合開發完成的。啃了兩周的項目代碼之后,覺得之前留下的攤子確實不好收拾,和產品確認過眼神之后,果斷決定重啟爐灶。
具體過程就不多啰嗦了,雖然說的是混合開發,不過總體來說仍然是原生為主,部分頁面通過webview嵌入H5頁面的方式來做展示,并不是網上所謂的一站式混合開發。不過個人認為這種方式才是更符合當前需求的一種方式,至于所謂的ionic之類的,demo很美好,需求很殘酷。因為混合開發的緣故,從項目管理的角度和后期的維護性考慮,需要把H5相關的插件代碼和原生代碼分開,所以這里用到了模塊化開發的方式。雖然這個項目目前只有我一個人,不過也正好可以試驗一下自己以前想用而被上面無情pass掉的各種新技術。所以這篇文章主要介紹的是自己摸索并結合網上資料總結的一種組件化/模塊化開發方式。對于這兩種稱謂,我個人沒有太去糾結區別,所以下文可能會出現混用。本文的目的在于分享一種思路,大家就不要在意這些細節了。

  • 需求場景

    公司的老項目重構任務是要求把以前的ionic混合開發項目進行拆分,將大部分功能和主入口實現原生化,而商城這種業務變化較快的模塊仍然保持H5方式展示。在第一版本的時候因為時間關系,只做了基礎模塊和主入口的原生化,剩下的大部分模塊仍然是用老的coordova項目的代碼打了一個aar包進來加載。也是在這個時候,因為項目中嵌入了大量配合coordova的代碼,而這部分代碼下個版本是注定要扔掉的,作為一個有強迫癥的人,自然是不能容忍主項目里面有這些代碼的,所以模塊化的坑就這么挖起來了。

  • 模塊化開發的優勢

    一是結構清晰,各個模塊的代碼實現分離,不會攪在一起。在代碼review或者二次開發的時候一目了然,不會滿世界去找代碼。
    二是協同開發的時候更靈活,不用再等同組其他同事的模塊開發完成后才能運行app,自己負責的模塊稍加修改就可以當做主app直接跑起來。
    三是便于維護。每個模塊的代碼、布局文件、資源文件可以隨時從項目中通過gradle配置去除掉。

  • 基本思路

    公司接收的項目是一個貨運平臺app。按照功能劃分,有貨運模塊、交易模塊、貨源模塊、商城模塊和個人中心。其中后兩個是原項目的H5模塊中的老代碼,前三個是全部實現了原生化。所以基本結構就是原生入口,下分五個原生子頁面。后兩個原生子頁面加載webview進行H5頁面展示。
    這里先附上一張基本的項目結構圖。


    一個基本的項目結構

    下面來說說這個項目的結構是怎么一步步整個成這樣的。

    1.基本結構

    app模塊是每個項目初始都有的,實質上仍然是一個module。Android Stuido項目中,我們和代碼打交道的大部分時間都在module中。當然,具體的module機制我們不去深究,有時間可以另開一坑去研究。下面的三個module大家可以理解為java中的library,當然這樣說不準確。
    app作為主要的module,主要承擔了應用啟動以及最上層的通用邏輯。比如在這個例子中,應用啟動、首頁展示和模塊切換的業務邏輯都在這個模塊。
    而下屬的三個子模塊承擔了各自細分的業務,并且可以被app模塊或者其他模塊引用,每個模塊只負責和考慮自己的業務。以此達到業務邏輯和代碼分離的邏輯。

    按照之前的業務邏輯劃分,項目結構可以先大致分為如下的結構:
    其中的箭頭方向表示了引用關系
    2.系統層分離

    當然,僅僅這樣是不夠的。因為這樣有一個問題,在AS中,module的引用是單向的。如果A module引用了B module,那么對A來講,B是可見的,B的所有公開功方法理論上都可以在A中使用,但是對B來說,A是不可見的。所以,相面這樣的結構出現的問題就是我們有大量的底層通用方法都放在app模塊中,對于子模塊來講是不可見的,子模塊無法引用封裝好的底層方法,例如網絡請求,圖片加載,文件拷貝等,這肯定是不行的。所以這個結構還得再優化。

    按照module單向引用的原則,我們可以把公共底層通用方法單獨分出來作為一個moduleBase,同時這個moduleBase也是最底層的module,保證對于其他module來說它都是可見的。這樣還有一個好處就是這個moduleBase中的方法和配置大部分都是可以高度復用的。在新開其他項目的時候這個模塊可以直接遷移到新項目中,而不用在為代碼分離和剔除浪費時間。所以,項目的結構進一步細化成了如下的結構:

到這里,一個基本的結構就算完成了,但是這個結構仍然不完善。

3.公共層分離

上述的模塊如果在使用中,有很大概率會遇到一個問題,部分的實體類、自定義view、布局文件或者資源文件在各個模塊都需要用到,但是這些如果放在系統層的moduleBase里面,又會破壞系統層的通用性。所以,我們還需要一個公共層moduleCommon來專門提供上層業務邏輯模塊的公共資源。直接上圖:
4.細化與擴展

其實在第三步之后整個項目結構已經算是比較完整了,不過隨著項目的不斷擴大,模塊仍然還是需要不斷細分。這里說一下整個項目結構的一種規劃思路。
在上述的項目結構中,嚴格來說只有三層:系統層、業務邏輯和app層。
其中app層是相對簡單的,只要包含應用啟動和初始化的一些額外操作和邏輯。而業務層包含了所有劃分出來的子功能模塊,為了方便項目結構的顯示方便,我們可以把這些模塊放在統一的文件夾下

同一層的module可以放在用一個文件夾下
這里需要注意的是放在文件夾下的module在引用時要注意帶上相對路徑。比如這里的moduleUser在引用時就要從":moduleUser"變成":moduleCore:moduleUser",多級以次類推。
同樣,對中間層我們也可以采用類似的方式,因為中間層不僅會包含一些我們自定義的通用實體類等文件,還有可能會有我們常用的二次封裝過的三方庫和開源庫。這些庫有些本身就是一個module需要我們引入,有些則是我們經過二次封裝的module。這些module同樣不適合放在系統層,所以也可以歸到公共層里,例如在我的項目里就有支付寶SDK,高德地圖等通用moudle
最后在說一下系統層,雖然說這一層叫系統層,但是各個module之間實際上并不一定是平級關系的。比如在我的項目中我引入了greenDAO數據庫框架。這個我作為一個單獨的數據庫模塊放在了系統層,但是在層級上是最底層,被moduleBase引用。
最后,附上完整的設計思路和項目結構:
整體結構設計
這里需要說明一下各個模塊之間的引用關系。建議各個模塊在引用的時候都采用implementation的方式全部引用。例如app模塊需要在gradle配置文件中引入所有需要用到的模塊,這樣可以不用考慮api方式產生的子模塊繼承引入的問題。例如app模塊引入了moduleBill模塊,而moduleBill引入了muduleA模塊,那么app還需不需要引入這個模塊呢?使用implementation的方式雖然繁瑣了一點,但是也最大程度的保證了項目結構的清晰。
實際項目結構

到這里,一個基本的組件化項目結構就搭建完成了。這一部分主要是介紹了模塊劃分的邏輯和依據,偏向思想。實際開發過程中,因為各個module之間的引用關系還有很多的坑,這一部分我會在下一篇文章詳細說明。這里就不在贅述。
最后,這種組件化的結構只是自己在實際項目開發中自己結合網上的資料摸索出來的,并不一定是最好的或最合理的,如果各位有更好的方法或思路,歡迎大家留言交流。

Android組件化/模塊化開發(二)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 《邁向基地》是阿西莫夫基地系列中的前傳,講述了哈里·謝頓建立第一基地,第二基地的過程。在銀河帝國日漸沒落,川陀日漸...
    蘇佑仁閱讀 778評論 0 0
  • 紅紅的、沉甸甸的果實, 夏娃受到了你的誘惑, 你也曾挑起特洛伊的戰爭, 帕里斯說:阿芙洛狄忒最美。 牛頓坐在樹下思...
    釋迦干屎橛閱讀 443評論 1 2
  • 歷史總是驚人的相似,時隔一個月,我再次來到北京,而此次沒有了第一次的激動和亢奮,更多的是責任與使命。 此次北京行,...
    苛娃閱讀 786評論 6 5
  • 2017年6月27日,我畢業了。沒有想象中的依依不舍,抱頭痛哭,我只是淡定的走上講臺,從老師手里接過畢業證書...
    緋戀閱讀 219評論 0 0