基於 MVP 的 Android 組件化開發框架實踐

一、背景

當我們的項目變得越來越大,代碼變得越來越臃腫,耦合會越來越多,編譯速度越來越慢,開發效率也會變得越來越低,怎麼辦?這個時候我們就需要對舊項目進行重構,即是模塊的拆分,官方的說法就是組件化。

聲明|作者:weixin_34138139
鏈接:https://blog.csdn.net/weixin_...

二、簡介

那什麼是組件化呢?其基本理念是:把常用的功能、控件、基礎類、第三方庫、權限等公共部分抽離封裝,我們稱之爲基礎組件(baselibs);把業務分成 N 個模塊進行獨立的管理,每一個模塊我們稱之爲業務組件;而所有的業務組件都需要依賴於封裝的基礎組件,業務組件之間不做依賴,這樣的目的是爲了讓每一個業務模塊都能單獨運行。而在 APP 層對整個項目的模塊進行封裝。

業務模塊之間的跳轉可以通過路由(Arouter)實現;業務模塊之間的通信可以通過消息(EventBus)來實現。

三、基礎搭建

1、組件框架圖

image

2、根據組件框架圖搭建的項目結構圖

image

3、接下來介紹每個模塊

項目中總共有五個 module ,包括 3 個業務模塊、一個基礎模塊和一個 APP 殼模塊。

在建好項目之後我們需要給 3 個 module 配置 “集成開發模式” 和 “組件開發模式” 的切換開關,可以在 gradle.properties 文件中定義變量 isModelisModel=false 代表是 “集成開發模式” , isModel=true 代表是 “組件開發模式” (注:每次修改isModel的值後一定要Sysn纔會生效)。

image

1)APP 殼模塊

主要就是集成每一個模塊,最終打包成一個完整的 apk ,其中 gradle 做了如下配置,根據配置文件中的 isModel 字段來依賴不同的業務組件;

image

2)baselibs 模塊

主要負責封裝公共部分,如 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)來實現。

1、Arouter 實現業務模塊之間的跳轉

我們在之前已經依賴了 Arouter (詳細用法參照:github.com/alibaba/ARo…),用它來實現跳轉只需要以下兩步:

第一步

  • gradle 配置

第二步

  • 需要指明目標頁面以及要帶的參數,然後在調用 navigation() 方法;

image

第三步

  • 首先在 onCreate 方法調用 ARouter.getInstance().inject(this) 注入;
  • 然後要用 @Route 註解標註頁面,並在 path 變量中給頁面定義一個路徑;
  • 最後對於傳送過來的變量我們直接定義一個同名的字段用 @Autowired 變量標註,Arouter 會對該字段自動賦值

image

2、EventBus 實現業務模塊之間的通訊

利用第三方如 EventBus 對消息進行管理。在 baselibs 組件中的 BaseActivityBaseFragment 類做了對消息的簡單封裝,子類只需要重寫 useEventBus() 返回 true 即可對事件的註冊。

五、搭建過程中遇到的問題

1、AndroidManifest

我們知道 APP 在打包的時候最後會把所有的 AndroidManifest 進行合併,所以每個業務組件的 Activity 只需要在各自的模塊中註冊即可。

如果業務組件要單獨運行,則需要單獨的一個 AndroidManifest ,在 gradlesourceSets 加載不同的 AndroidManifest 即可。

image

gradle 配置

注意:集成模式下的 AndroidManifest 不需要配置 Application ,組件模式下的 AndroidManifest 需要單獨配置 Application ,並且必須繼承 BaseApp 。

2、資源文件衝突的問題

不同業務組件裏的資源文件的名稱可能相同,所以就可能出現資源文件衝突的問題,我們可以通過設置資源的前綴來防止資源文件的衝突。

image

gradle 配置,以 module_news 模塊爲例

這樣配置以後,如果我們在命名資源文件沒有加前綴的時候,編譯器就會提示我們沒加前綴。

至此, Android 基本組件化框架已經搭建完成,如有錯誤之處還請指正。

五、最後

完整的項目地址:
https://github.com/iceCola7/A...

閱讀更多

一波Flutter酷炫特效來襲

金三銀四,2019最新面試實戰總結

從來不糾結算法,冒泡排序這樣優化?

動畫:一招學會TCP的三次握手和四次揮手

關於Gradle, 搞定Groovy閉包這一篇就夠了

歡迎關注我的微信技術號終端研發部,id:codeGoogler,一起交流和學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章