個(gè)人自用總結(jié)的Android模塊化架構(gòu)模板

模板項(xiàng)目鏈接

ArchitectureSample

如果大家覺得有什么問題或者建議,歡迎提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)圖

架構(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分層

業(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(用戶中心模塊)

UserCenterModule
mvp

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
debug模式

此時(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
release模式

此時(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的使用者來說,很不方便。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容