前言
至今為止從事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概覽
三、項目結(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下
-
在gradle.properties中配置maven倉庫地址,以及組件的其他屬性
-
執(zhí)行upload腳本嫂侍,將aar類庫上傳到maven倉庫中
控制臺出現(xiàn)successful儿捧,表示上傳成功
接下來就是如何在當前項目或其他項目中使用這個aar的類庫
2.使用aar類庫
-
在根部目錄的version.gradle中添加私有maven倉庫的地址
-
使用在gradle.properties配置的唯一項目標識,引入aar類庫
-
在setting.gradle中挑宠,把一些已經(jīng)編譯成aar類庫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。感謝您的閱讀旅择,歡迎下載體驗惭笑。