一次組件化與Android Jetpack的實踐

前言

至今為止從事Android開發(fā)兩年多了影所,17年開始實習時赠制,恰逢APP剛剛立項不久,當時新項目沿用了舊項目古老的MVC架構(gòu)经柴。從那之后一直都是根據(jù)飄忽不定的需求狸窘,沒有規(guī)則的壘代碼。

直到18年中坯认,其他項目組開發(fā)的APP要求集成到了我們項目組的APP中翻擒,從這時開始項目的代碼氓涣、APP的功能,爆炸性增多陋气,代碼本身也開始變得極難維護劳吠,調(diào)試舊代碼經(jīng)常找不到位置,需要全局搜索有時還要連蒙帶猜恩伺,也就是從那時起赴背,我開始意識到一個好架構(gòu)以及規(guī)范的重要性!

目錄

  • 項目簡介
  • APP概覽
  • 項目結(jié)構(gòu)
  • 組件復用
  • 后續(xù)展望
  • 總結(jié)
  • 參考資料

正文

一晶渠、項目簡介

本次實踐的內(nèi)容是基于Android JetPack組件實現(xiàn)MVVM架構(gòu)凰荚,并結(jié)合當下較為流行的組件化開發(fā)方式,編寫的一個菜譜類型的小型應用褒脯。組件化的過程中結(jié)合了我把公司的APP組件化后便瑟,得到一些經(jīng)驗和教訓,做了一些優(yōu)化和調(diào)整番川。

需要強調(diào)的是到涂,實際使用了Data Binding后,不僅調(diào)試bug時想砸電腦颁督,后來在讀過nanchen大佬的文章《不一樣的角度談 DataBinding的坑》后決定践啄,在本次實踐暫不采用Data Binding,后續(xù)會單獨開設(shè)分支來實現(xiàn)DataBinding沉御。

項目當前的MVVM架構(gòu)設(shè)計的可能并不理想屿讽,而且界面優(yōu)化還存在一定的問題,不過沒關(guān)系吠裆,后續(xù)會以該項目為案例伐谈,系統(tǒng)性的實踐Android中常見的啟動優(yōu)化、內(nèi)存優(yōu)化以及布局優(yōu)化等等试疙,實踐過程也會完整的整理成文章記錄下來诵棵,方便日后學習、討論祝旷,如果感興趣話記得關(guān)注哦履澳。

數(shù)據(jù)來源聚合數(shù)據(jù)-菜譜大全Easy-Mock

后臺服務(wù)器Bmob(使用了bmob用戶管理的部分api怀跛,其他數(shù)據(jù)主要使用easy-mock產(chǎn)生模擬數(shù)據(jù))

開發(fā)語言:Kotlin(部分使用了Java)

主要使用的Jetpack組件
LiveData-Android Architecture Components探索(1)-LiveData
ViewModel-Android Architecture Components探索(2)-ViewModel
Navigation-Android Architecture Components探索(3)-Navigation
Room距贷、Lifecycle

使用到的第三方框架:App中使用了很多第三方框架,這里只列舉幾種敌完,Tinker(熱修復)储耐、ARouter、Glide滨溉、RxJava什湘、Retrofit长赞、BaseRecyclerViewAdapterHelper、X5WebView等等闽撤。

開源地址https://github.com/linux-link/Fan

二得哆、APP概覽

首頁
分類
發(fā)現(xiàn)
我的

三、項目結(jié)構(gòu)

本項目概念上的結(jié)構(gòu)如圖所示

結(jié)構(gòu)圖

實際結(jié)構(gòu)如圖所示

結(jié)構(gòu)圖

下面分別解釋各個module的作用:

  • Library-Base

    整個項目的基類哟旗,所有的第三方框架和自定義View框架都在這里添加依賴贩据,以方便統(tǒng)一管理。

  • View_Xxx

    通用的自定義View框架闸餐。一些APP特有的view效果可以抽出獨立成一個Module饱亮。例如:本項目使用了一個仿紅板報的3D翻頁效果庫,就可以把它獨立成一個module舍沙。

  • General_Xxx

    通用的自定義工具框架近上。一些所有項目可以公用的框架,為了方便日后在其他項目中使用拂铡,可以抽出獨立成一個module壹无,不能與項目的業(yè)務(wù)邏輯有關(guān)聯(lián)。例如:本項目中網(wǎng)絡(luò)框架就被單獨封裝成一個module感帅。

  • Library-Architecture

    通用框架庫斗锭。一般包含BaseApplication、常用的工具類以及架構(gòu)層的封裝例如BaseMvvmActivity等等失球。

    這個module在封裝時需要考慮一定的通用性岖是,最理想的情況的是,在重新開一個新的項目時她倘,可以直接拷貝使用璧微。

  • Library-Component

    服務(wù)于組件化的module作箍。與業(yè)務(wù)邏輯相關(guān)硬梁,主要包含一些組件化的封裝,一些子組件需要抽出的公共類也會放在這里胞得。需要注意的是荧止,Library-Component是其他所有子組件必需依賴的庫。

  • Component_Xxx

    子組件阶剑。APP中各個業(yè)務(wù)邏輯的具體實現(xiàn)跃巡,既可以編譯為library,用作其他組件的類庫牧愁,也可以編譯為application素邪,可以獨立運行調(diào)試。

    在項目根目錄的build.gradle可以通過xxx_isSingleCompile的值來控制各個module是否需要獨立運行猪半。

  • app

    整個項目的入口兔朦,又被成為APP殼偷线,在這里面將所有的子組件全部打包進apk中,為了加快編譯速度沽甥,主要使用runtimeOnly声邦。

需要單獨說明的是,每一個子組件中還包含了一個gradle.properties文件摆舟,里面設(shè)定了該組件被編譯成AAR庫時一些屬性亥曹,以及私有maven倉庫的地址和用戶名與密碼。

四恨诱、組件復用(2019-08-22 更新)

組件化的一個重要目的就是能夠在另一個項目中復用當前APP的一些組件媳瞪,就像我們在項目中使用implementation引入一些第三方庫一樣,這些第三方庫也可以當作一個組件照宝。不過為了隱私的需要材失,我們多數(shù)時候是在公司的內(nèi)網(wǎng)使用nexus搭建一個私有的maven倉庫。

關(guān)于如何搭建maven倉庫就不再介紹了硫豆,請自行百度龙巨,這里我在華為云服務(wù)器上搭建了一個公用的maven倉庫(自行搭建maven倉庫時,盡量使用內(nèi)存大于2GB的主機)熊响,公網(wǎng)地址:http://119.3.215.243:9882旨别,用戶名:public,密碼:123456@qq.com汗茄。

有了maven倉庫秸弛,接下來我們就可以嘗試將組件打包并上傳到maven倉庫中,給別項目使用洪碳。

1.編譯aar類庫并上傳maven倉庫

  • 選擇一個module递览,執(zhí)行build命令,將這個module編譯成一個aar類庫瞳腌。編譯好的aar文件绞铃,一般在對應module的build->outputs->aar下

    執(zhí)行腳本

  • 在gradle.properties中配置maven倉庫地址,以及組件的其他屬性

    配置屬性

  • 執(zhí)行upload腳本嫂侍,將aar類庫上傳到maven倉庫中

    上傳到maven倉庫

控制臺出現(xiàn)successful儿捧,表示上傳成功


上傳成功
maven倉庫

接下來就是如何在當前項目或其他項目中使用這個aar的類庫

2.使用aar類庫

  • 在根部目錄的version.gradle中添加私有maven倉庫的地址
    引入私有maven倉庫的地址
  • 使用在gradle.properties配置的唯一項目標識,引入aar類庫
    統(tǒng)一配置aar類庫的地址

    修改引入類庫的地址
  • 在setting.gradle中挑宠,把一些已經(jīng)編譯成aar類庫module注釋掉
    注釋掉源碼形式的module

通過以上這些步驟菲盾,我們實現(xiàn)了組件的本地復用以及不同項目間的復用,而且因為大量的組件被編譯成了aar類庫各淀,項目全編譯時懒鉴,這部分組件就不需要再進行編譯,大幅提高了項目的編譯效率碎浇。

五临谱、后續(xù)展望

當前的APP依然十分簡單咆畏,或者說簡陋,當前正在學習如何部署吴裤、開發(fā)一個簡單的后臺旧找,后面會逐漸放棄bmob,同時增加APP的復雜度麦牺,引入更多的開發(fā)技術(shù)钮蛛,比如我最感興趣的插件化、NDK剖膳、React Native或者Flutter等等魏颓。
最終目的還是希望能在一個APP中實踐當下的主流開發(fā)技術(shù),然后從中選擇一個方向深入研究吱晒,不過這都是后話了甸饱。畢竟理想很豐滿,現(xiàn)實很骨干=_=仑濒。

更新內(nèi)容

2019-08-22更新

  • 1.0.3版開始叹话,在APP中集成了一個獨立進程的簡易商城,商城使用H5開發(fā)墩瞳,支付功能使用Native開發(fā)驼壶,商城本質(zhì)上是一個多進程Hybird架構(gòu)的組件。

H5部分是根據(jù)慕課網(wǎng)的一個vue.js課程中使用的源碼改造的喉酌,所以源代碼無法公開热凹。不過我同樣架設(shè)了一個可以在公網(wǎng)訪問的地址:http://118.24.197.176,因為數(shù)據(jù)需要使用APP的內(nèi)置網(wǎng)絡(luò)服務(wù)獲取泪电,所以在瀏覽器中訪問這個地址是缺失部分數(shù)據(jù)的般妙。

2019-08-23更新

  • 1.0.4版集成了美團walle多渠道打包,實際開發(fā)中打出不同的渠道包相速,網(wǎng)絡(luò)請求時帶上渠道標識碟渺,這可以方便后臺對于APP的統(tǒng)計。

在需要渠道等信息時可以通過下面代碼進行獲取
String channel = WalleChannelReader.getChannel(this.getApplicationContext());

使用./gradlew clean assembleReleaseChannels指令生成渠道包和蚪,渠道包的生成目錄默認存放在 build/outputs/apk/止状,也可以通過walle閉包中的apkOutputFolder參數(shù)來指定輸出目錄烹棉。

2019-08-27更新

  • 新增一個以glide為基礎(chǔ)攒霹,運用策略、單例浆洗、建造模式封裝的一個可以在使用時靈活切換(例如從glide切換為picasso)的圖片載入框架general_picture催束,目前依然在優(yōu)化中,暫時可以正常使用伏社。

實際開發(fā)中方圖片載入框架需要足夠的靈活抠刺,否則一但需要切換圖片加載框架塔淤,絕對會非常麻煩。

六速妖、總結(jié)

以上就是本項目的大致概覽高蜂,總得來說,你既可以用它來學習組件化開發(fā)罕容,也可以用它來學習Android Jetpack組件的實際運用备恤,還可以用來學習如何優(yōu)化一個APP,不過這等我后續(xù)的更新了锦秒,當前已經(jīng)更新的有

如有任何問題露泊、建議請給我留言或者在github中提交issue。感謝您的閱讀旅择,歡迎下載體驗惭笑。


下載二維碼.png

參考資料

《如何構(gòu)建Android MVVM 應用框架》

《Android 組件化最佳實踐》

《來自一位阿里朋友的組件化架構(gòu)實踐》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市生真,隨后出現(xiàn)的幾起案子沉噩,更是在濱河造成了極大的恐慌,老刑警劉巖柱蟀,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屁擅,死亡現(xiàn)場離奇詭異,居然都是意外死亡产弹,警方通過查閱死者的電腦和手機派歌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痰哨,“玉大人胶果,你說我怎么就攤上這事〗锔” “怎么了早抠?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撬讽。 經(jīng)常有香客問我蕊连,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任瞧栗,我火速辦了婚禮痴荐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘载庭。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布囚聚。 她就那樣靜靜地躺著靖榕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顽铸。 梳的紋絲不亂的頭發(fā)上茁计,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音谓松,去河邊找鬼簸淀。 笑死,一個胖子當著我的面吹牛毒返,可吹牛的內(nèi)容都是我干的租幕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼拧簸,長吁一口氣:“原來是場噩夢啊……” “哼劲绪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盆赤,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贾富,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牺六,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颤枪,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年淑际,在試婚紗的時候發(fā)現(xiàn)自己被綠了畏纲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡春缕,死狀恐怖盗胀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锄贼,我是刑警寧澤票灰,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站宅荤,受9級特大地震影響屑迂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冯键,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一惹盼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琼了,春花似錦逻锐、人聲如沸夫晌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至所袁,卻和暖如春盏档,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燥爷。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工蜈亩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人前翎。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓稚配,卻偏偏與公主長得像,于是被迫代替她去往敵國和親港华。 傳聞我的和親對象是個殘疾皇子道川,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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