在2019的9月份组题,我參與了公司內(nèi)部將多個(gè)app整合成為一個(gè)app的項(xiàng)目改造葫男,并負(fù)責(zé)整個(gè)的實(shí)施過(guò)程。期間碰到一些問(wèn)題崔列,偶爾有些心得梢褐,特記錄如下。
直接來(lái)看赵讯,這 N個(gè)項(xiàng)目的共同點(diǎn)在于都有統(tǒng)一的登錄流程盈咳,之后有各自差異化的初始化流程和對(duì)應(yīng)的feature。另外底層的infrastructure也有共有的部分边翼,如EventBus鱼响,網(wǎng)絡(luò)層組件,下載組件等组底。最初的設(shè)想是將所有現(xiàn)存的app都變?yōu)閙odule丈积,然而初期評(píng)估下來(lái),核心app部分的改動(dòng)可能過(guò)大债鸡,于是圍繞它江滨,準(zhǔn)備將其它(N-1)個(gè)app集成進(jìn)去⊙峋總體上的步驟可分為以下幾點(diǎn):
先統(tǒng)一登錄模塊唬滑,初始化邏輯獨(dú)立遷移
底層通用業(yè)務(wù)模塊中獨(dú)立定義 IAuthenticationService
接口,然后在其它模塊中實(shí)現(xiàn)棺弊。使用SPI (Service Provider Interface)
的機(jī)制來(lái)查找實(shí)現(xiàn)晶密,并添加到公共的服務(wù)管理類 ServiceManager
中。這一步在Android上可以使用 AutoService
來(lái)實(shí)現(xiàn)镊屎。
建立底層基礎(chǔ)模塊 (BaseComponent)
Deeplink
對(duì)于模塊間的deeplink跳轉(zhuǎn)邏輯, 暫時(shí)統(tǒng)一定義在此處(后續(xù)看來(lái)更好的辦法惹挟,或可以嘗試引入ARoute)茄螃。App內(nèi)部語(yǔ)言切換
按IAuthenticationService
相似的實(shí)現(xiàn)策略缝驳,可以對(duì)ILanguageService
也做出相似的實(shí)現(xiàn),以便全局管理app中的語(yǔ)言切換。
抽取/復(fù)用通用的 infrastructure libraries
包括 Downloader
用狱,NetworkMonitor
运怖,StorageMonitor
,出于性能因素夏伊,復(fù)用 4.x
版本以后的 OkHttpClient
等等摇展。
模塊化后,編譯配置的變更
- 為了防止資源重復(fù)溺忧,將library中的資源增加前綴(prefix)以防止命名沖突
android {
resourcePrefix 'lib_a_'
// ...
}
- 當(dāng)編譯時(shí)出現(xiàn)依賴的dependency重復(fù)相關(guān)的錯(cuò)誤時(shí) ? 咏连,可以使用
compileOnly (...)
, 或
implementation(a_lib) {
exclude module: 'duplicate_module'
}
或是自定義多版本沖突后的解決策略:
configurations.all {
resolutionStrategy {
forcedModules = [
"com.google.code.gson:gson:$gsonVersion",
// ...
]
}
}
各個(gè)module中 proguard 的聲明變化
apply plugin: 'com.android.library'
android {
defaultConfig {
consumerProguardFiles 'your-proguard file'
}
}
【可選】支持單獨(dú)的module作為獨(dú)立可運(yùn)行的app
在module的build.gradle
中更改配置
if (isStandalone()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
以上區(qū)分了App 或 library 的配置,還要應(yīng)用于dependencies
, defaultConfig
, ProguardFiles
等鲁森。
改造后的模塊結(jié)構(gòu)圖
利用WMRouter 解耦Service的定義與實(shí)現(xiàn)
按上圖將各個(gè)通用的Service 接口定義在BaseComponent
中祟滴,而實(shí)現(xiàn)可以放在上層的Component
或獨(dú)立的模塊。在其它模塊中可以經(jīng)由ServiceManager
通過(guò)統(tǒng)一的 Router.getService(XService.class)
調(diào)用方式歌溉,查找并使用對(duì)應(yīng)的服務(wù)垄懂。
TODO
- 新增功能可配置化
P.S. 組件圖是由在線繪圖工具 diagrams 繪制。
?? 贊賞支持
請(qǐng)支持我進(jìn)行更好地創(chuàng)作 ??