從模塊化到組件化再到插件化
參考:
http://blog.xiaohansong.com/2015/10/21/IoC-and-DI/
http://blog.csdn.net/dd864140130/article/details/53645290
http://blog.csdn.net/smallspot/article/details/52221049
https://github.com/SpinyTech/ModularizationArchitecture
https://github.com/wutongke/ModularizationArchitecture
最近公司的項目從平臺開發(fā)專向了針對平臺開發(fā),對此眠砾,我們作為開發(fā)人員理應(yīng)當(dāng)開始設(shè)計新的思路去面對公司今后的戰(zhàn)略轉(zhuǎn)型玉雾。于是澎怒,我們就希望項目能定制化功能鸣个,通過后臺配置去加載相應(yīng)的模塊榛斯。為此看了一些相關(guān)內(nèi)容绊汹。
控制反轉(zhuǎn)磺箕,依賴注入:
耦合結(jié)構(gòu)和解耦結(jié)構(gòu)
目前我的項目的結(jié)構(gòu)如下圖所示奖慌,因為intent跳轉(zhuǎn)和一些數(shù)據(jù)共享的關(guān)系導(dǎo)致的。
解耦合之后的結(jié)構(gòu):
解耦思想
控制反轉(zhuǎn)是一種思想
依賴注入是一種設(shè)計模式
IoC框架使用依賴注入作為實現(xiàn)控制反轉(zhuǎn)的方式
模塊化開發(fā)
將一個程序按照其功能做拆分滞磺,分成相互獨(dú)立的模塊升薯,以便于每個模塊只包含與其功能相關(guān)的內(nèi)容。模塊我們相對熟悉,比如登錄功能可以是一個模塊,搜索功能可以是一個模塊,汽車的發(fā)送機(jī)也可是一個模塊击困。
組件式開發(fā)
基于可重用的目的涎劈,將一個大的軟件系統(tǒng)按照分離關(guān)注點(diǎn)的形式,拆分成多個獨(dú)立的組件阅茶,已較少耦合蛛枚。
將一個app分成多個模塊,每個模塊都是一個組件(Module)脸哀,開發(fā)的過程中我們可以讓這些組件相互依賴或者單獨(dú)調(diào)試部分組件等蹦浦,但是最終發(fā)布的時候是將這些組件合并統(tǒng)一成一個apk,這就是組件化開發(fā)撞蜂。
正常一個App中可以有多個module盲镶,但是一般只會有一個module是設(shè)置為application的,其他均設(shè)置為library蝌诡,組件化開發(fā)就是要每個module都可以運(yùn)行起來溉贿,因此在開發(fā)期間(Debug版本)每個module均設(shè)置為application,發(fā)布時(Release版本)設(shè)置為libs再進(jìn)行合并浦旱。
組件可以分為兩大類宇色,一類是application組件,一類是libs組件,application組件是一個可運(yùn)行的app宣蠕。libs組件可以作為application的依賴例隆,但是自身不可作為程序運(yùn)行的存在。
模塊化粒度更小,更側(cè)重于重用,而組件化粒度稍大于模塊,更側(cè)重于業(yè)務(wù)解耦抢蚀。
組件化想要解決的問題:
實際業(yè)務(wù)變化非扯撇悖快,但是工程之前的業(yè)務(wù)模塊耦合度太高,牽一發(fā)而動全身.
對工程所做的任何修改都必須要編譯整個工程
功能測試和系統(tǒng)測試每次都要進(jìn)行.
團(tuán)隊協(xié)同開發(fā)存在較多的沖突.不得不花費(fèi)更多的時間去溝通和協(xié)調(diào),并且在開發(fā)過程中,任何一位成員沒辦法專注于自己的功能點(diǎn),影響開發(fā)效率.
不能靈活的對工程進(jìn)行配置和組裝.比如今天產(chǎn)品經(jīng)理說加上這個功能,明天又說去掉,后天在加上.
組件開發(fā)比較常見的問題是業(yè)務(wù)組件的相互引用:
為此我們可以通過路由/總線的方式去處理:
掛載到組件總線上的業(yè)務(wù)組件,都可以實現(xiàn)雙向通信.而通信協(xié)議和HTTP通信協(xié)議類似,即基于URL的方式進(jìn)行.
插件化開發(fā)
Android應(yīng)用程序的.Java文件在編譯期會通過javac命令編譯成.class文件,最后再把所有的.class文件編譯成.dex文件放在.apk包里面皿曲。那么動態(tài)加載就是在運(yùn)行時把插件apk直接加載到classloader里面的技術(shù)鹿响。
關(guān)于代碼加載,系統(tǒng)提供了DexClassLoader來加載插件代碼谷饿。開發(fā)者可以對每一個插件分配一個DexClassLoader(這是目前最常見的一種方式),也可以動態(tài)得把插件加載到當(dāng)前運(yùn)行環(huán)境的classloader中妈倔。
相對于組件化開發(fā)主要要解決的問題:
宿主和插件分開編譯
并發(fā)開發(fā)
動態(tài)更新插件
按需下載模塊
方法數(shù)或變量數(shù)爆棚
這個坑有點(diǎn)多博投。
作者:huhanghao
來源:CSDN
原文:https://blog.csdn.net/u011486491/article/details/70216666
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接盯蝴!