模板項(xiàng)目鏈接
如果大家覺得有什么問題或者建議,歡迎提issue,這個(gè)工程我也會(huì)不斷改進(jìn),雖然比不上大公司、大牛的那些NB架構(gòu),但自己不斷學(xué)習(xí)改進(jìn)也是一種進(jìn)步吧。
聲明一下:這個(gè)工程只是提供一種架構(gòu)設(shè)計(jì)思想,并不像能那些NB框架一樣開箱即用。
Android應(yīng)用模塊化開發(fā)說明
1. 組件化與模塊化
對(duì)于組件化和模塊化,我的理解是:
- 組件:指的是單一的功能組件,如地圖組件(MapSDK)、支付組件(AnjukePay)、路由組件(Router)等等;
- 模塊:指的是獨(dú)立的業(yè)務(wù)模塊,如新房模塊(NewHouseModule)、二手房模塊(SecondHouseModule)、即時(shí)通訊模塊(InstantMessagingModule)等等;模塊相對(duì)于組件來說粒度更大。
模塊化的好處:
- 多團(tuán)隊(duì)并行開發(fā)測(cè)試;
- 模塊間解耦、重用;
- 可單獨(dú)編譯打包某一模塊,提升開發(fā)效率。
本工程采用我認(rèn)為的"模塊化開發(fā)"
題外話:我看了很多Android模塊化和組件化的文章,還是感覺傻傻分不清楚,我覺得大多數(shù)author寫的都差不多是我文中這種結(jié)構(gòu),所以大多數(shù)技術(shù)博客上的模塊化和組件化之間并沒有什么界限。
2. 總體架構(gòu)圖

總體分為三層
- 最底層為BasicLibrary,職責(zé)是為上層提供基礎(chǔ)庫(kù)支持,基礎(chǔ)庫(kù)包含第三方開源庫(kù)、組件、自定義的庫(kù)和UI控件等。
- 中間層為Provider,職責(zé)是傳遞給上層基礎(chǔ)庫(kù)支持,也為上層的業(yè)務(wù)模塊提供路由參數(shù),公共常量等。
- 最頂層為Business Module,職責(zé)是App業(yè)務(wù)的具體實(shí)現(xiàn),可根據(jù)應(yīng)用的功能模塊拆分成若干業(yè)務(wù)Module。
3. 業(yè)務(wù)Module分層

每個(gè)業(yè)務(wù)Module采用MVP分層模式開發(fā),如果業(yè)務(wù)量小,也可以不采用,直接原始的MVC開發(fā)方式也可以。但我覺得如果BaseLibrary的基礎(chǔ)數(shù)據(jù)請(qǐng)求工具支持的話,每個(gè)業(yè)務(wù)Module隨便用MVC,MVP,MVVM都行,反正Module之間不影響,每個(gè)分工人員也可以保留自己的“偏愛”。
3.1 mvp分層具體實(shí)現(xiàn)模板
例UserCenterModule(用戶中心模塊)


4. 開發(fā)模式切換
例如當(dāng)前工程包含三個(gè)業(yè)務(wù)Module,即UserCenterModule、OneModule和TwoModule
4.1 debug模式
debug模式下,業(yè)務(wù)module可以單獨(dú)編譯為獨(dú)立app,相當(dāng)于一個(gè)子工程,與其它業(yè)務(wù)module解耦,便于專注于業(yè)務(wù)開發(fā),利于開發(fā)人員分工合作,大大加快調(diào)試時(shí)代碼編譯速度??稍诠こ谈夸浀膅radle.properties配置,debugXXX=true
org.gradle.jvmargs=-Xmx1536m
# UserCenterModule 是否為debug模式
debugUserCenterModule = true
#debugUserCenterModule = false
# ModuleOne 是否為debug模式
#debugModuleOne = true
debugModuleOne = false
# ModuleTwo 是否為debug模式
#debugModuleTwo = true
debugModuleTwo = false

此時(shí)OneModule,TwoModule和UserCenterModule都是獨(dú)立android application類型module
4.2 release模式
release模式下,業(yè)務(wù)module會(huì)成為library module,為app 殼module提供依賴,所以app殼Module會(huì)把需要的業(yè)務(wù)module集合起來編譯成一個(gè)完整的apk
可在工程根目錄的gradle.properties配置,debugXXX=false
org.gradle.jvmargs=-Xmx1536m
# UserCenterModule 是否為debug模式
#debugUserCenterModule = true
debugUserCenterModule = false
# Module1 是否為debug模式
#debugModule1 = true
debugModule1 = false
# Module2 是否為debug模式
#debugModule2 = true
debugModule2 = false

此時(shí)module1,module2和usercenter都是android library類型module,release模式一般在最后集成多業(yè)務(wù)時(shí)聯(lián)合調(diào)試時(shí)或者要發(fā)布應(yīng)用時(shí)用到。
5. 業(yè)務(wù)模塊間界面跳轉(zhuǎn)
由于業(yè)務(wù)模塊間已完全解耦,業(yè)務(wù)模塊可獨(dú)立開發(fā),所以模塊間的界面跳轉(zhuǎn)不能時(shí)直接引用界面類跳轉(zhuǎn),需要采用間接跳轉(zhuǎn)。
Android SDK中intent的間接跳轉(zhuǎn)API不好用,故采用alibaba的ARouter路由框架。Arouter用法請(qǐng)參考ARouter
這里所說的跳轉(zhuǎn)一般是Activity跳轉(zhuǎn),如果是業(yè)務(wù)Module里的界面類都是Fragment,那么可以這樣:
- 業(yè)務(wù)Module debug模式下,可用一個(gè)臨時(shí)的Activity用來顯示fragment
- 業(yè)務(wù)Module release模式,那么App Module肯定有裝業(yè)務(wù)Module Fragment的Activity殼,通過Arouter間接獲取到業(yè)務(wù)Module的Fragment,然后在動(dòng)態(tài)顯示在Activity殼里。
注意:從debug模式切換到release模式時(shí)編譯,ARouter的注解處理器可能一時(shí)不會(huì)生效(注冊(cè)不了路由),請(qǐng)clean一下工程,再編譯。
6. 業(yè)務(wù)模塊間事件通信
統(tǒng)一采用RxBus事件總線方案
7. 依賴庫(kù)版本統(tǒng)一處理
項(xiàng)目所用的所有庫(kù)及版本號(hào)(除測(cè)試庫(kù))統(tǒng)一在根目錄下的version.gradle中定義,各module按需對(duì)其引用。
例如:BaseLibrary里的
...
compileSdkVersion build_versions.target_sdk
buildToolsVersion build_versions.build_tools
defaultConfig {
minSdkVersion build_versions.min_sdk
targetSdkVersion build_versions.target_sdk
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
dependencies {
...
//rxJava
api deps.rxjava2
api deps.rx_android
api deps.rx_lifecycle
api deps.rx_lifecycle_components
api deps.rx_relay
// net
api deps.retrofit
api deps.okhttp3
api deps.okhttp3_interceptor
api deps.retrofit_converter_gson
api deps.retrofti_adapter_rxjava
...
一些版本號(hào)設(shè)置
build_versions.min_sdk = 19
build_versions.target_sdk = 28
build_versions.build_tools = "28.0.3"
8. 系統(tǒng)適配
暫時(shí)支持設(shè)定支持Android系統(tǒng)最低為19(Android4.4),目標(biāo)系統(tǒng)版本為28(Android 9.0)
還有很多方面的適配方案就不在這里介紹了。
9. 編碼規(guī)范
具體可以參考編碼規(guī)范,下面只是列了幾個(gè)重要的。
- 遵循Alibaba編碼規(guī)范(可配置阿里編碼規(guī)約插件檢查)
- 類注釋,方法注釋,成員注釋,都要寫上,注釋格式遵循javaDoc
- 編輯完 .java、.xml 等文件后一定要格式化
- 刪除多余的 import,減少警告出現(xiàn),可利用 AS 的 Optimize Imports(Settings -> Keymap -> Optimize Imports)快捷鍵;
命名規(guī)范:
- 代碼中的命名嚴(yán)禁使用拼音與英文混合的方式
- 包名全部小寫,連續(xù)的單詞只是簡(jiǎn)單地連接起來,不使用下劃線
- 類名都以
UpperCamelCase風(fēng)格編寫。 - 資源文件命名及里面的控件Id名為全部小寫,采用下劃線命名法。
10 其他
- 使用此模塊的開源項(xiàng)目:個(gè)人正在完善...
11 改進(jìn)計(jì)劃
- 1 目前業(yè)務(wù)層網(wǎng)絡(luò)請(qǐng)求方案是用的RxJava+Retrofit+RxLifeCycle+VP,后期想換個(gè)官方的LiveData+Retrofit+ViewModel試試。
12 目前的問題
- 移植不夠高:比如BaseLibrary這個(gè)Module,還不夠靈活,如果移植新項(xiàng)目,還是要導(dǎo)入Module源碼定制下一些配置后,才能打包成aar為好。
- aar包引入問題,library Module導(dǎo)了自己編譯的aar文件時(shí),對(duì)應(yīng)的application Module也要導(dǎo)改文件,除非aar換成遠(yuǎn)程依賴導(dǎo)application Module才不用導(dǎo)。對(duì)于沒有私人Nexus的使用者來說,很不方便。