插件化的由來(lái)
方法數(shù)瓶頸 65535/64K個(gè)
插件化要解決的問(wèn)題
- 動(dòng)態(tài)加載apk
- 資源加載 AssetManager加載資源到resource
- 代碼加載
發(fā)展歷程及現(xiàn)狀
關(guān)于插件化技術(shù)的起源可以追溯到5年前
2012年的 AndroidDynamicLoader 蚜迅,他的原理是動(dòng)態(tài)加載不同的Fragment實(shí)現(xiàn)UI替換,可以說(shuō)是開(kāi)山鼻祖了旺入,但是這種方案可擴(kuò)展性不強(qiáng)苞氮。
再到后來(lái)出現(xiàn)了23Code,他可以直接下載一個(gè)自定義控件的demo,并且運(yùn)行起來(lái)旅挤。
-
2014年一個(gè)里程碑式的年份踢关,任玉剛(俗稱主席)發(fā)布了dynamic-load-apk,也叫做DL。在這個(gè)框架里提供了兩個(gè)很重要的思路:
- 如何管理插件內(nèi)Activity的生命周期: 使用 DLProxyActivity 采用靜態(tài)代理的方式去調(diào)用插件中Activity的生命周期方法粘茄。
- 如何加載插件內(nèi)的資源文件:通過(guò)反射調(diào)用AssetManager 中到的addAssetPath方法就可以將特定路徑的資源加載到系統(tǒng)內(nèi)存中使用签舞。
以上兩點(diǎn)秕脓,可以說(shuō)是非常有意義的,尤其是第二點(diǎn)關(guān)于插件資源的記載儒搭,是后期出現(xiàn)的許多框架的參考思路吠架。這個(gè)框架也有一些局限,不支持插件內(nèi)Service师妙、BroadcastReceiver等需要注冊(cè)才能使用的組件诵肛,同時(shí)插件apk也需要按照其開(kāi)發(fā)規(guī)范來(lái)實(shí)現(xiàn),總體來(lái)說(shuō)還是有一定的成本默穴,但無(wú)論怎樣都是一個(gè)很有價(jià)值的框架怔檩。(話說(shuō)這個(gè)框架貌似已經(jīng)不再維護(hù)了,最近一次關(guān)于代碼的更新都是2年前了蓄诽,o(╥﹏╥)o)薛训。
2015年 DroidPlugin
DroidPlugin 是Andy Zhang在Android系統(tǒng)上實(shí)現(xiàn)了一種新的 插件機(jī)制 :它可以在無(wú)需安裝、修改的情況下運(yùn)行APK文件,此機(jī)制對(duì)改進(jìn)大型APP的架構(gòu)仑氛,實(shí)現(xiàn)多團(tuán)隊(duì)協(xié)作開(kāi)發(fā)具有一定的好處乙埃。 這段話是DroidPlugin在Github README 文檔中的介紹。這款來(lái)自360的插件化框架.2015年 DynamicAPK 這個(gè)就……锯岖,貌似因?yàn)長(zhǎng)icense的原因已經(jīng)完全不更新了介袜。
2017 RePlugin 這是360 開(kāi)源的插件化框架,按照他自己的說(shuō)法出吹,相較于其他框架遇伞,他對(duì)系統(tǒng)的hook只有一處,那就是ClassLoader捶牢,這樣從理論來(lái)說(shuō)鸠珠,貌似會(huì)有更好的穩(wěn)定性。
2017年 atlas這個(gè)是阿里今年剛剛開(kāi)源的插件化開(kāi)發(fā)框架秋麸,可以說(shuō)是非常強(qiáng)大渐排;具體原理參考詳解 Atlas 框架原理;還沒(méi)有用過(guò)灸蟆。
Small 最后再說(shuō)一下Small驯耻,個(gè)人感覺(jué)Small 所提供了一種比插件化更高層次的概念,組件化次乓;把一個(gè)完整的APP看成是由許多可以復(fù)用模塊組件組成(這個(gè)有點(diǎn)像React Native的開(kāi)發(fā)理念)吓歇;開(kāi)發(fā)起來(lái)像是搭積木的感覺(jué)。有興趣的可以去Small官網(wǎng)了解一下票腰。