Android 項(xiàng)目組件化實(shí)踐(入門)筆記

在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ǔ)言切換。

interfaces.jpg

抽取/復(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)圖

comp.png

利用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)作 ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痛垛,一起剝皮案震驚了整個(gè)濱河市草慧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匙头,老刑警劉巖漫谷,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乾胶,居然都是意外死亡抖剿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門识窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斩郎,“玉大人,你說(shuō)我怎么就攤上這事喻频∷跻耍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵甥温,是天一觀的道長(zhǎng)锻煌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)姻蚓,這世上最難降的妖魔是什么宋梧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮狰挡,結(jié)果婚禮上捂龄,老公的妹妹穿的比我還像新娘释涛。我一直安慰自己,他們只是感情好倦沧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布唇撬。 她就那樣靜靜地躺著,像睡著了一般展融。 火紅的嫁衣襯著肌膚如雪窖认。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天告希,我揣著相機(jī)與錄音扑浸,去河邊找鬼。 笑死燕偶,一個(gè)胖子當(dāng)著我的面吹牛首装,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杭跪,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仙逻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涧尿?” 一聲冷哼從身側(cè)響起系奉,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姑廉,沒(méi)想到半個(gè)月后缺亮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桥言,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年萌踱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片号阿。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡并鸵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扔涧,到底是詐尸還是另有隱情园担,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布枯夜,位于F島的核電站弯汰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏湖雹。R本人自食惡果不足惜咏闪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摔吏。 院中可真熱鬧鸽嫂,春花似錦织鲸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稳诚。三九已至哗脖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扳还,已是汗流浹背才避。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氨距,地道東北人桑逝。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像俏让,于是被迫代替她去往敵國(guó)和親楞遏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容