模塊化、插件化和組件化的關係
項目發展到一定程度,隨着人員的增多,代碼越來越臃腫,這時候就必須進行模塊化的拆分。
在我看來,模塊化是一種指導理念,其核心思想就是分而治之、降低耦合。
在技術開發領域,模塊化是指分拆代碼,即當我們的代碼特別臃腫的時候,用模塊化將代碼分而治之、解耦分層。
具體到 android 領域,模塊化的具體實施方法分爲插件化和組件化。
插件化和組件化的區別
一套完整的插件化或組件化都必須能夠實現單獨調試、集成編譯、數據傳輸、UI 跳轉、生命週期和代碼邊界這六大功能。插件化和組件化最重要而且是唯一的區別的就是:插件化可以動態增加和修改線上的模塊,組件化的動態能力相對較弱,只能對線上已有模塊進行動態的加載和卸載,不能新增和修改。
組件化和插件化的最大區別(應該也是唯一區別)就是組件化在運行時不具備動態添加和修改組件的功能,但是插件化是可以的;
與組件化的主要區別:
- 形式上的區別,組件化的單位是module,插件化的單位是apk
- 關注點不同,插件化更關注動態加載、熱更新、熱修復等‘插拔’技術。
如何實現組件化
要實現組件化,不論採用什麼樣的技術路徑,需要考慮的問題主要包括下面幾個:
- 代碼解耦。如何將一個龐大的工程拆分成有機的整體?
- 組件單獨運行。上面也講到了,每個組件都是一個完整的整體,如何讓其單獨運行和調試呢?
- 數據傳遞。因爲每個組件都會給其他組件提供的服務,那麼主項目(Host)與組件、組件與組件之間如何傳遞數據?
- UI跳轉。UI跳轉可以認爲是一種特殊的數據傳遞,在實現思路上有啥不同?
- 組件的生命週期。我們的目標是可以做到對組件可以按需、動態的使用,因此就會涉及到組件加載、卸載和降維的生命週期。
- 集成調試。在開發階段如何做到按需的編譯組件?一次調試中可能只有一兩個組件參與集成,這樣編譯的時間就會大大降低,提高開發效率。
- 代碼隔離。組件之間的交互如果還是直接引用的話,那麼組件之間根本沒有做到解耦,如何從根本上避免組件之間的直接引用呢?也就是如何從根本上杜絕耦合的產生呢?只有做到這一點纔是徹底的組件化。
- 因此在開發期間(Debug版本)每個module均設置爲application,發佈時(Release版本)設置爲libs再進行合併。
基本概念
使用IDE中的multiple module這個功能,我們很容易把代碼進行初步的拆分。在這裏我們對兩種module進行區分,
- 一種是基礎庫library,這些代碼被其他組件直接引用。比如網絡庫module可以認爲是一個library。
- 另一種我們稱之爲Component,這種module是一個完整的功能業務模塊。比如讀書或者分享module就是一個Component。
爲了方便,我們統一把library稱之爲依賴庫,而把Component稱之爲組件,我們所講的組件化也主要是針對Component這種類型。而負責拼裝這些組件以形成一個完成app的module,一般我們稱之爲主項目、主module或者Host,方便起見我們也統一稱爲主項目。