當咱們的項目變得愈來愈大,代碼變得愈來愈臃腫,耦合會愈來愈多,編譯速度愈來愈慢,開發效率也會變得愈來愈低,怎麼辦?這個時候咱們就須要對舊項目進行重構,便是模塊的拆分,官方的說法就是組件化。git
聲明|做者:weixin_34138139 連接:blog.csdn.net/weixin_3413…github
那什麼是組件化呢?其基本理念是:把經常使用的功能、控件、基礎類、第三方庫、權限等公共部分抽離封裝,咱們稱之爲基礎組件(baselibs);把業務分紅 N 個模塊進行獨立的管理,每個模塊咱們稱之爲業務組件;而全部的業務組件都須要依賴於封裝的基礎組件,業務組件之間不作依賴,這樣的目的是爲了讓每個業務模塊都能單獨運行。而在 APP 層對整個項目的模塊進行封裝。面試
業務模塊之間的跳轉能夠經過路由(Arouter)實現;業務模塊之間的通訊能夠經過消息(EventBus)來實現。算法
項目中總共有五個 module ,包括 3 個業務模塊、一個基礎模塊和一個 APP 殼模塊。微信
在建好項目以後咱們須要給 3 個 module 配置 「集成開發模式」 和 「組件開發模式」 的切換開關,能夠在 gradle.properties 文件中定義變量 isModel ,isModel=false 表明是 「集成開發模式」 , isModel=true 表明是 「組件開發模式」 (注:每次修改isModel的值後必定要Sysn纔會生效)。網絡
1)APP 殼模塊閉包
主要就是集成每個模塊,最終打包成一個完整的 apk ,其中 gradle 作了以下配置,根據配置文件中的 isModel 字段來依賴不一樣的業務組件;架構
2)baselibs 模塊app
主要負責封裝公共部分,如 MVP 架構、 BaseView 的封裝、網絡請求庫、圖片加載庫、工具類以及自定義控件等;框架
爲了防止重複依賴,全部的第三方庫都放在這個模塊,業務模塊不作任何第三方依賴,只依賴於 baselibs 模塊。
baselibs 模塊的結構以下:
在 baselibs 模塊的 gradle 中引入的庫
3)業務模塊(module_news、module_video、module_me)
每個業務模塊在 「集成開發模式」 下以 library 的形式存在;在 「組件開發模式」 下以 application 的形式存在,能夠單獨運行。
因爲每一個業務模塊的配置文件都差很少,下面就以 module_news 模塊爲例;
如下是 module_news 模塊的 gradle 配置文件:
4)配置文件 config.gradle ,對項目中的第三庫、 app 的版本等配置
最後別忘記在工程的中 build.gradle 引入該配置文件
業務模塊之間的跳轉能夠經過路由(Arouter)實現;業務模塊之間的通訊能夠經過消息(EventBus)來實現。
咱們在以前已經依賴了 Arouter (詳細用法參照:github.com/alibaba/ARo…),用它來實現跳轉只須要如下兩步:
第一步
第二步
第三步
利用第三方如 EventBus 對消息進行管理。在 baselibs 組件中的 BaseActivity 、 BaseFragment 類作了對消息的簡單封裝,子類只須要重寫 useEventBus() 返回 true 便可對事件的註冊。
咱們知道 APP 在打包的時候最後會把全部的 AndroidManifest 進行合併,因此每一個業務組件的 Activity 只須要在各自的模塊中註冊便可。
若是業務組件要單獨運行,則須要單獨的一個 AndroidManifest ,在 gradle 的 sourceSets 加載不一樣的 AndroidManifest 便可。
gradle 配置
注意:集成模式下的 AndroidManifest 不須要配置 Application ,組件模式下的 AndroidManifest 須要單獨配置 Application ,而且必須繼承 BaseApp 。
不一樣業務組件裏的資源文件的名稱可能相同,因此就可能出現資源文件衝突的問題,咱們能夠經過設置資源的前綴來防止資源文件的衝突。
gradle 配置,以 module_news 模塊爲例
這樣配置之後,若是咱們在命名資源文件沒有加前綴的時候,編譯器就會提示咱們沒加前綴。
至此, Android 基本組件化框架已經搭建完成,若有錯誤之處還請指正。
完整的項目地址: github.com/iceCola7/An…
歡迎關注個人微信技術號終端研發部,id:codeGoogler,一塊兒交流和學習!