插件化是什么政敢?
說(shuō)到插件化,其實(shí)在我們生活是很常見(jiàn)胚迫,比如u盤喷户,用的時(shí)候插上,不用的時(shí)候拔下访锻,任何品牌的u盤都可以插在電腦上褪尝,無(wú)線鼠標(biāo)闹获,無(wú)線鍵盤,外界屏幕等等恼五,這些都是插件化的例子昌罩。
那么android中的插件化技術(shù),目前已經(jīng)比較成熟灾馒,比如微信,淘寶遣总,攜程睬罗,360手機(jī)助手中都應(yīng)用到了插件化。他的特點(diǎn)是無(wú)需單獨(dú)安裝apk旭斥,即可運(yùn)行容达,即插即用,無(wú)需升級(jí)宿主應(yīng)用垂券,減少app的更新頻率花盐,除此之外他還可以降低模塊耦合,按需加載菇爪,節(jié)省流量等特點(diǎn)算芯。
拿我們自己的考試app舉例,我們的app主要做英語(yǔ)考試凳宙,那么英語(yǔ)考試分很多種熙揍,sat、toefl氏涩、ielts考試題目呈現(xiàn)方式都不相同届囚,有的學(xué)生需要sat,有的學(xué)生需要sat是尖、toefl意系,目前的解決方案是每個(gè)考試都是一個(gè)單獨(dú)app成了很多功能的耦合。
為了解決這種問(wèn)題饺汹,考慮引入插件化技術(shù)蛔添,按需引入所需考試類型的安裝包。
介紹名詞
插件化 – apk 分為宿主和插件部分首繁,插件在需要的時(shí)候才加載進(jìn)來(lái)
熱修復(fù) – 更新的類或者插件粒度較小的時(shí)候作郭,我們會(huì)稱之為熱修復(fù),一般用于修復(fù)bug
熱更新 – 2016 Google 的 Android Studio 推出了Instant Run 功能 同時(shí)提出了3個(gè)名詞
“熱部署” – 方法內(nèi)的簡(jiǎn)單修改弦疮,無(wú)需重啟app和Activity夹攒。 “暖部署” – app無(wú)需重啟,但是activity需要重啟胁塞,比如資源的修改咏尝。 “冷部署” – app需要重啟压语,比如繼承關(guān)系的改變或方法的簽名變化等。
所以站在app開(kāi)發(fā)者角度的“熱”是指在不發(fā)版的情況來(lái)實(shí)現(xiàn)更新编检,而Google提出的“熱”是指值是否需要重新啟動(dòng)胎食。 同時(shí)在開(kāi)發(fā)插件化的時(shí)候也有兩種情景,一種是插件與宿主apk沒(méi)有交互允懂,只是在用戶使用到的時(shí)候進(jìn)行一次吊起厕怜,還有一種是與宿主有很多的交互。
基本原理
插件化的原理實(shí)際是 Java ClassLoader 的原理蕾总,看其他資料前請(qǐng)先看:Java ClassLoader基礎(chǔ)
Java類加載器
Android應(yīng)用程序的.java文件在編譯期會(huì)通過(guò)javac命令編譯成.class文件粥航,最后再把所有的.class文件編譯成.dex文件放在.apk包里面。那么動(dòng)態(tài)加載就是在運(yùn)行時(shí)vm把插件apk直接加載到classloader里面的技術(shù)
反射原理
主要是指程序可以訪問(wèn)生百,檢測(cè)和修改它本身狀態(tài)或行為的一種能力递雀,并能根據(jù)自身行為的狀態(tài)和結(jié)果,調(diào)整或修改應(yīng)用所描述行為的狀態(tài)和相關(guān)的語(yǔ)義
代理模式及Java實(shí)現(xiàn)動(dòng)態(tài)代理
定義:給某個(gè)對(duì)象提供一個(gè)代理對(duì)象蚀浆,并由代理對(duì)象控制對(duì)于原對(duì)象的訪問(wèn)缀程,即客戶不直接操控原對(duì)象,而是通過(guò)代理對(duì)象間接地操控原對(duì)象市俊。
為什么用杨凑?
65535方法數(shù)天花板
隨著業(yè)務(wù)的不斷發(fā)展,外部庫(kù)的引入,導(dǎo)致方法數(shù)的增加,應(yīng)用中的Dex 文件方法數(shù)超過(guò)了最大值65536的上限奸焙,就會(huì)引爆android系統(tǒng)刀荒。這種情況可以通過(guò)削減重復(fù)方法數(shù)來(lái)治標(biāo),也有谷歌官方在API 21中提供了通用的解決方案,那就是android-support-multidex.jar. 這個(gè)jar包最低可以支持到API 4的版本(Android L及以上版本會(huì)默認(rèn)支持mutidex),同時(shí)插件化也是解決方案的一種。
減少主包大小
編譯提速
可選模塊按需下載
?例如模塊可以在需要時(shí)進(jìn)行加載曼追,減少App Size,如只用到sat就只下載sat汉规,只用toefl就只下載toefl的插件
并行開(kāi)發(fā)礼殊,獨(dú)立Testing
可以獨(dú)立開(kāi)發(fā)A、B版本的模塊针史,而不是將A晶伦、B版本代碼寫在同一個(gè)模塊中。
崩潰隔離
某一插件的崩潰啄枕,影響僅局限當(dāng)前插件婚陪,不會(huì)導(dǎo)致其他插件以及宿主的崩潰
有什么限制?
通知欄限制
無(wú)法在插件中發(fā)送具有自定義資源的Notification频祝,例如: a. 帶自定義RemoteLayout的Notification b. 圖標(biāo)通過(guò)R.drawable.XXX指定的通知(插件系統(tǒng)會(huì)自動(dòng)將其轉(zhuǎn)化為Bitmap)
系統(tǒng)適配
Dex的加載與系統(tǒng)版本依賴嚴(yán)重泌参,可能會(huì)導(dǎo)致新版SDK不支持等問(wèn)題
需要預(yù)先注冊(cè)權(quán)限
宿主的權(quán)限要多于插件的權(quán)限, 否則會(huì)權(quán)限不足脆淹,無(wú)法在插件中注冊(cè)一些具有特殊Intent Filter的Service、Activity沽一、BroadcastReceiver盖溺、ContentProvider等組件以供Android系統(tǒng)、已經(jīng)安裝的其他APP調(diào)用铣缠。
國(guó)外資料少的原因
國(guó)外andrid以及所有app應(yīng)用都上傳google play store或apple store,這兩個(gè)市場(chǎng)的審核較為嚴(yán)格烘嘱,不經(jīng)審核的熱更新的應(yīng)用很容易被下架
限制解決辦法
占坑
對(duì)于service,ContentProvider需要提前在宿主注冊(cè)
自己實(shí)現(xiàn)包管理服務(wù)PMS
使用方法與原生方式差異大
寫一個(gè)“正橙敛校”的模塊和寫一個(gè)動(dòng)態(tài)加載模塊拙友,寫法是不一樣的,插件內(nèi)部對(duì)資源的訪問(wèn)只能通過(guò)自己定義的方式歼郭,包括對(duì)layout文件的inflate等,使用getResouces的方式辐棒,分分鐘crash給你看病曾,而且內(nèi)部實(shí)現(xiàn)有些復(fù)雜,容易出現(xiàn)莫名其妙的
已有插件化框架對(duì)比
360 DroidPlugin
是360手機(jī)助手在Android系統(tǒng)上實(shí)現(xiàn)了一種新的插件機(jī)制漾根,多進(jìn)程實(shí)現(xiàn)泰涂,更新插件時(shí),真正熱更新. 后面會(huì)針對(duì)DroidPlugin詳細(xì)學(xué)習(xí)
阿里ACCD(原OpenAtlas)
非代理Android動(dòng)態(tài)部署框架
攜程 DynamicAPK
實(shí)現(xiàn)Android App多apk插件化和動(dòng)態(tài)加載辐怕,支持資源分包和熱修復(fù).攜程App的插件化和動(dòng)態(tài)加載框架.
未來(lái)趨勢(shì)
插件化作為近幾年比較火的技術(shù)逼蒙,有他的適用場(chǎng)景,但是有很大的局限性寄疏,在擴(kuò)展性是牢,適應(yīng)性方面都趕不上react-native,未來(lái)的趨勢(shì)還是移動(dòng)web化更占優(yōu)勢(shì)