android 插件化介紹

插件化是什么政敢?

說(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è)模塊中。

app架構(gòu)

崩潰隔離

某一插件的崩潰啄枕,影響僅局限當(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í)

DL 動(dòng)態(tài)加載框架

阿里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ì)

其他資料

包建強(qiáng):android插件化從入門到放棄

蘑菇街Android組件與插件化

使用DroidPlugin的示例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陕截,一起剝皮案震驚了整個(gè)濱河市驳棱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌农曲,老刑警劉巖社搅,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乳规,居然都是意外死亡形葬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門暮的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笙以,“玉大人,你說(shuō)我怎么就攤上這事青扔≡粗” “怎么了翩伪?”我有些...
    開(kāi)封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谈息。 經(jīng)常有香客問(wèn)我缘屹,道長(zhǎng),這世上最難降的妖魔是什么侠仇? 我笑而不...
    開(kāi)封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任轻姿,我火速辦了婚禮,結(jié)果婚禮上逻炊,老公的妹妹穿的比我還像新娘互亮。我一直安慰自己,他們只是感情好余素,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布豹休。 她就那樣靜靜地躺著,像睡著了一般桨吊。 火紅的嫁衣襯著肌膚如雪威根。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天视乐,我揣著相機(jī)與錄音洛搀,去河邊找鬼。 笑死佑淀,一個(gè)胖子當(dāng)著我的面吹牛留美,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伸刃,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谎砾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了奕枝?” 一聲冷哼從身側(cè)響起棺榔,我...
    開(kāi)封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隘道,沒(méi)想到半個(gè)月后症歇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谭梗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年忘晤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片激捏。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡设塔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出远舅,到底是詐尸還是另有隱情闰蛔,我是刑警寧澤痕钢,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站序六,受9級(jí)特大地震影響任连,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜例诀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一随抠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧繁涂,春花似錦拱她、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至矿酵,卻和暖如春氧猬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坏瘩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漠魏,地道東北人倔矾。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柱锹,于是被迫代替她去往敵國(guó)和親哪自。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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