本期專欄目討論插件化開發(fā)碌识。插件化涉及的東西很多,所以我們需要多個維度去學(xué)習(xí)虱而。大概分為5個部分:預(yù)備知識筏餐、入門、進(jìn)階牡拇、系列魁瞪、類庫。一步一步深入了解插件的原理惠呼。本專欄會不定時更新相關(guān)內(nèi)容导俘,請留意更新的消息。請加入QQ群:149581646.會統(tǒng)一通知最新的文章罢杉。
基礎(chǔ)
1.Java 類加載器
類加載器(class loader)是 Java?中的一個很重要的概念趟畏。類加載器負(fù)責(zé)加載 Java 類的字節(jié)代碼到 Java 虛擬機中。本文首先詳細(xì)介紹了 Java 類加載器的基本概念滩租,包括代理模式赋秀、加載類的具體過程和線程上下文類加載器等,接著介紹如何開發(fā)自己的類加載器律想,最后介紹了類加載器在 Web 容器和 OSGi?中的應(yīng)用猎莲。
2.反射原理
Java 提供的反射機制允許您於執(zhí)行時期動態(tài)載入類別、檢視類別資訊技即、生成物件或操作生成的物件著洼,要舉反射機制的一個應(yīng)用實例,就是在整合式開發(fā)環(huán)境中所提供的方法提示或是類別檢視工具而叼,另外像 JSP 中的 JavaBean 自動收集請求資訊也使用到反射身笤,而一些軟體開發(fā)框架(Framework)也常見到反射機制的使用,以達(dá)到動態(tài)載入使用者自訂類別的目的葵陵。
3.代理模式及Java實現(xiàn)動態(tài)代理
定義:給某個對象提供一個代理對象液荸,并由代理對象控制對于原對象的訪問,即客戶不直接操控原對象脱篙,而是通過代理對象間接地操控原對象娇钱。
入門
1.Android動態(tài)加載dex技術(shù)初探
Android使用Dalvik虛擬機加載可執(zhí)行程序,所以不能直接加載基于class的jar绊困,而是需要將class轉(zhuǎn)化為dex字節(jié)碼文搂,從而執(zhí)行代碼。優(yōu)化后的字節(jié)碼文件可以存在一個.jar中秤朗,只要其內(nèi)部存放的是.dex即可使用煤蹭。
2.Android插件化入門
開發(fā)者將插件代碼封裝成Jar或者APK。宿主下載或者從本地加載Jar或者APK到宿主中。將宿主調(diào)用插件中的算法或者Android特定的Class(如Activity)
3.插件化開發(fā)—動態(tài)加載技術(shù)加載已安裝和未安裝的apk
動態(tài)加載技術(shù)就是使用類加載器加載相應(yīng)的apk疯兼、dex然遏、jar(必須含有dex文件),再通過反射獲得該apk吧彪、dex待侵、jar內(nèi)部的資源(class、圖片姨裸、color等等)進(jìn)而供宿主app使用秧倾。
4.Android動態(tài)加載技術(shù)三個關(guān)鍵問題詳解
動態(tài)加載技術(shù)(也叫插件化技術(shù))在技術(shù)驅(qū)動型的公司中扮演著相當(dāng)重要的角色,當(dāng)項目越來越龐大的時候傀缩,需要通過插件化來減輕應(yīng)用的內(nèi)存和CPU占用那先,還可以實現(xiàn)熱插拔,即在不發(fā)布新版本的情況下更新某些模塊赡艰。
進(jìn)階
1.攜程Android App插件化和動態(tài)加載實踐
攜程Android App的插件化和動態(tài)加載框架已上線半年售淡,經(jīng)歷了初期的探索和持續(xù)的打磨優(yōu)化,新框架和工程配置經(jīng)受住了生產(chǎn)實踐的考驗慷垮。本文將詳細(xì)介紹Android平臺插件式開發(fā)和動態(tài)加載技術(shù)的原理和實現(xiàn)細(xì)節(jié)揖闸,回顧攜程Android App的架構(gòu)演化過程,期望我們的經(jīng)驗?zāi)軒椭礁嗟腁ndroid工程師料身。
2.動態(tài)加載APK原理分享
被加載的apk稱之為插件汤纸,因為機制類似于生物學(xué)的"寄生",加載了插件的應(yīng)用也被稱為宿主芹血。 往往不是所有的apk都可作為插件被加載贮泞,往往需要遵循一定的"開發(fā)規(guī)范",還需要插件項目引入某種api類庫幔烛,業(yè)界通常都是這么做的啃擦。
3.Android插件化的一種實現(xiàn)
Android的插件化已經(jīng)是老生常談的話題了,插件化的好處有很多:解除代碼耦合饿悬,插件支持熱插拔议惰,靜默升級,從根本上解決65K屬性和方法的bug等等乡恕。下面給大家介紹一下我們正在用的差價化框架。本片主要以類圖的方式向大家介紹插件話框架的實現(xiàn)俯萎。
4.蘑菇街 App 的組件化之路
隨著我街業(yè)務(wù)的蓬勃發(fā)展傲宜,產(chǎn)品和運營隨時上新功能新活動的需求越來越強烈,經(jīng)撤虬。可以聽到“有個功能我想周x上函卒,行不行”。行么撇眯?當(dāng)然是不行啦报嵌,上新功能得發(fā)新版本啊虱咧,到時候費時費力打亂開發(fā)節(jié)奏不說,覆蓋率也是個問題锚国。
5.DynamicLoadApk 源碼解析
DynamicLoadApk 是一個開源的 Android 插件化框架腕巡。插件化的優(yōu)點包括:(1) 模塊解耦,(2) 動態(tài)升級血筑,(3) 高效并行開發(fā)(編譯速度更快) (4) 按需加載绘沉,內(nèi)存占用更低等等DynamicLoadApk 提供了 3 種開發(fā)方式,讓開發(fā)者在無需理解其工作原理的情況下快速的集成插件化功能豺总。
6.Android apk動態(tài)加載機制的研究
問題是這樣的:我們知道车伞,apk必須安裝才能運行,如果不安裝要是也能運行該多好啊喻喳,事實上另玖,這不是完全不可能的,盡管它比較難實現(xiàn)表伦。在理論層面上谦去,我們可以通過一個宿主程序來運行一些未安裝的apk,當(dāng)然绑榴,實踐層面上也能實現(xiàn)哪轿,不過這對未安裝的apk有要求。我們的想法是這樣的翔怎,首先要明白apk未安裝是不能被直接調(diào)起來.
7.美團(tuán)Android DEX自動拆包及動態(tài)加載簡介
作為一個android開發(fā)者窃诉,在開發(fā)應(yīng)用時,隨著業(yè)務(wù)規(guī)模發(fā)展到一定程度赤套,不斷地加入新功能飘痛、添加新的類庫,代碼在急劇的膨脹容握,相應(yīng)的apk包的大小也急劇增加宣脉, 那么終有一天,你會不幸遇到這個錯誤.
8.途牛原創(chuàng)|途牛Android App的插件實現(xiàn)
途牛的插件化是基于dynamic-load-apk(github)實現(xiàn)的剔氏。定義了宿主和插件的通信方式塑猖,使得兩者能夠互起對方的頁面,調(diào)用彼此的功能谈跛。同時對activity的啟動方式singletask等進(jìn)行了模式實現(xiàn)羊苟,并增加了對Service的支持等「泻叮總之使得插件開發(fā)最大限度的保持著原有的Android開發(fā)習(xí)慣蜡励。
9. Android apk資源加載和activity生命周期管理
博主分析了Android中apk的動態(tài)加載機制,并在文章的最后指出需要解決的兩個復(fù)雜問題:資源的訪問和activity生命周期的管理,而本文將會分析這兩個復(fù)雜問題的解決方法凉倚。
10.APK動態(tài)加載框架(DL)解析
首先要說的是動態(tài)加載技術(shù)(或者說插件化)在技術(shù)驅(qū)動型的公司中扮演這相當(dāng)重要的角色兼都,當(dāng)項目越來越龐大的時候,需要通過插件化來減輕應(yīng)用的內(nèi)存和cpu占用稽寒,還可以實現(xiàn)熱插拔扮碧,即在不發(fā)布新版本的情況下更新某些模塊。
系列
1.Kaedea---Android動態(tài)加載技術(shù) 簡單易懂的介紹
我們很早開始就在Android項目中采用了動態(tài)加載技術(shù)瓦胎,主要目的是為了達(dá)到讓用戶不用重新安裝APK就能升級應(yīng)用的功能(特別是 SDK項目)芬萍,這樣一來不但可以大大提高應(yīng)用新版本的覆蓋率,也減少了服務(wù)器對舊版本接口兼容的壓力搔啊,同時如果也可以快速修復(fù)一些線上的BUG柬祠。
2.Kaedea---Android動態(tài)加載基礎(chǔ) ClassLoader的工作機制
早期使用過Eclipse等Java編寫的軟件的同學(xué)可能比較熟悉,Eclipse可以加載許多第三方的插件(或者叫擴展)负芋,這就是動態(tài)加載漫蛔。這些插件大多是一些Jar包,而使用插件其實就是動態(tài)加載Jar包里的Class進(jìn)行工作旧蛾。
3.Kaedea---Android動態(tài)加載補充 加載SD卡的SO庫
Android中JNI的使用其實就包含了動態(tài)加載莽龟,APP運行時動態(tài)加載.so庫并通過JNI調(diào)用其封裝好的方法。后者一般是使用NDK工具從C/C++代碼編譯而成锨天,運行在Native層毯盈,效率會比執(zhí)行在虛擬機的Java代碼高很多,所以Android中經(jīng)常通過動態(tài)加載.so庫來完成一些對性能比較有需求的工作(比如T9搜索病袄、或者Bitmap的解碼搂赋、圖片高斯模糊處理等)。
4.Kaedea---Android動態(tài)加載入門 簡單加載模式
Java程序中益缠,JVM虛擬機是通過類加載器ClassLoader加載.jar文件里面的類的脑奠。Android也類似,不過Android用的是Dalvik/ART虛擬機幅慌,不是JVM宋欺,也不能直接加載.jar文件,而是加載dex文件胰伍。
5.Kaedea---Android動態(tài)加載進(jìn)階 代理Activity模式
簡單模式中齿诞,使用ClassLoader加載外部的Dex或Apk文件,可以加載一些本地APP不存在的類骂租,從而執(zhí)行一些新的代碼邏輯掌挚。但是使用這種方法卻不能直接啟動插件里的Activity。
6.Kaedea---Android動態(tài)加載黑科技 動態(tài)創(chuàng)建Activity模式
還記得我們在代理Activity模式里談到啟動插件APK里的Activity的兩個難題嗎菩咨,由于插件里的Activity沒在主項目的Manifest里面注冊,所以無法經(jīng)歷系統(tǒng)Framework層級的一系列初始化過程,最終導(dǎo)致獲得的Activity實例并沒有生命周期和無法使用res資源抽米。
7.尼古拉斯---插件開發(fā)基礎(chǔ)篇:動態(tài)加載技術(shù)解讀
在目前的軟硬件環(huán)境下特占,Native App與Web App在用戶體驗上有著明顯的優(yōu)勢,但在實際項目中有些會因為業(yè)務(wù)的頻繁變更而頻繁的升級客戶端云茸,造成較差的用戶體驗是目,而這也恰恰是Web App的優(yōu)勢。本文對網(wǎng)上Android動態(tài)加載jar的資料進(jìn)行梳理和實踐在這里與大家一起分享标捺,試圖改善頻繁升級這一弊病懊纳。
8.尼古拉斯---插件開發(fā)開篇:類加載器分析
這篇文章主要介紹了Android中主要的兩個類加載器:PathClassLoader和DexClassLoader,他們的區(qū)別,聯(lián)系亡容,用法等問題嗤疯,以及我們在制作插件的過程中會遇到哪些常見的問題。這篇文章也是后續(xù)兩篇文章的基礎(chǔ)闺兢,因為如果不了解這兩個類的話茂缚,我們將無法進(jìn)行后續(xù)的操作。
9.尼古拉斯---插件開發(fā)中篇:資源加載問題(換膚原理解析)
這篇文章主要通過現(xiàn)在一些應(yīng)用自帶的換膚技術(shù)的解讀來看看屋谭,在開發(fā)插件的過程中如何解決一些資源加載上的問題脚囊,這個問題為何要單獨拿出來解釋,就是因為他涉及的知識很多桐磁,也是后面一篇文章的基礎(chǔ)悔耘,我們在需要加載插件中的資源文件的時候。
10.尼古拉斯---插件開發(fā)終極篇:動態(tài)加載Activity(免安裝運行程序)
這篇文章主要是講解了如何加載插件中的Activity我擂。從而實現(xiàn)免安裝運行程序衬以,同時這篇文章也是對前三篇文章知識的綜合使用。下載很多應(yīng)用都會使用到插件技術(shù)扶踊,因為包的大小和一些功能的優(yōu)先級來決定哪些模塊可以制作成插件泄鹏。
11.Weishu---Android插件化原理解析——概要
類的加載可以使用Java的ClassLoader機制,但是對于Android來說秧耗,并不是說類加載進(jìn)來就可以用了备籽,很多組件都是有“生命”的;因此對于這些有血有肉的類分井,必須給它們注入活力车猬,也就是所謂的組件生命周期管理.
12.Weishu---Android插件化原理解析——Hook機制之動態(tài)代理
使用代理機制進(jìn)行API Hook進(jìn)而達(dá)到方法增強是框架的常用手段,比如J2EE框架Spring通過動態(tài)代理優(yōu)雅地實現(xiàn)了AOP編程尺锚,極大地提升了Web開發(fā)效率珠闰;同樣,插件框架也廣泛使用了代理機制來增強系統(tǒng)API從而達(dá)到插件化的目的.
13.Weishu---Android插件化原理解析——Hook機制之Binder Hook
Android系統(tǒng)通過Binder機制給應(yīng)用程序提供了一系列的系統(tǒng)服務(wù)瘫辩,諸如ActivityManagerService伏嗜,ClipboardManager坛悉, AudioManager等;這些廣泛存在系統(tǒng)服務(wù)給應(yīng)用程序提供了諸如任務(wù)管理承绸,音頻裸影,視頻等異常強大的功能。
14.Weishu---Android 插件化原理解析——Hook機制之AMS&PMS
在前面的文章中我們介紹了DroidPlugin的Hook機制军熏,也就是代理方式和Binder Hook轩猩;插件框架通過AOP實現(xiàn)了插件使用和開發(fā)的透明性。在講述DroidPlugin如何實現(xiàn)四大組件的插件化之前荡澎,有必要說明一下它對AMS以及PMS的Hook方式均践。
15.Weishu---Android 插件化原理解析——Activity生命周期管理
之前的 Android插件化原理解析 系列文章揭開了Hook機制的神秘面紗,現(xiàn)在我們手握倚天屠龍摩幔,那么如何通過這種技術(shù)完成插件化方案呢彤委?具體來說,插件中的Activity热鞍,Service等組件如何在Android系統(tǒng)上運行起來葫慎?
16.Weishu---Android 插件化原理解析——插件加載機制
上文 Activity生命周期管理 中我們地完成了『啟動沒有在AndroidManifest.xml中顯式聲明的Activity』的任務(wù);通過Hook AMS和攔截ActivityThread中H類對于組件調(diào)度我們成功地繞過了AndroidMAnifest.xml的限制薇宠。
17.Weishu---Android插件化原理解析——廣播的管理
在Activity生命周期管理 以及 插件加載機制 中我們詳細(xì)講述了插件化過程中對于Activity組件的處理方式偷办,為了實現(xiàn)Activity的插件化我們付出了相當(dāng)多的努力;那么Android系統(tǒng)的其他組件澄港,比如BroadcastReceiver椒涯,Service還有ContentProvider,它們又該如何處理呢回梧?
18.Weishu---Android 插件化原理解析——Service的插件化
在 Activity生命周期管理 以及 廣播的管理 中我們詳細(xì)探討了Android系統(tǒng)中的Activity废岂、BroadcastReceiver組件的工作原理以及它們的插件化方案,相信讀者已經(jīng)對Android Framework和插件化技術(shù)有了一定的了解狱意;
類庫
1.DroidPlugin
是360手機助手在Android系統(tǒng)上實現(xiàn)了一種新的插件機制
2.Android-Plugin-Framework
此項目是Android插件開發(fā)框架完整源碼及示例湖苞。用來通過動態(tài)加載的方式在宿主程序中運行插件APK。
3.Small
世界那么大详囤,組件那么小财骨。Small,做最輕巧的跨平臺插件化框架藏姐。里面有很詳細(xì)的文檔
4.dynamic-load-apk
Android 使用動態(tài)加載框架DL進(jìn)行插件化開發(fā)
5.AndroidDynamicLoader
Android 動態(tài)加載框架隆箩,他不是用代理 Activity 的方式實現(xiàn)而是用 Fragment 以及 Schema 的方式實現(xiàn)
6.DynamicAPK
實現(xiàn)Android App多apk插件化和動態(tài)加載,支持資源分包和熱修復(fù).攜程App的插件化和動態(tài)加載框架.
7.ACDD
非代理Android動態(tài)部署框架
8.android-pluginmgr
不需要插件規(guī)范的apk動態(tài)加載框架羔杨。
參考視頻
1.DroidPlugin的實現(xiàn)原理及其應(yīng)用
Droid Plugin是360手機助手在2015年初研發(fā)的一個全新的基于Android平臺的插件機制.
2.android插件化及動態(tài)部署
阿里技術(shù)沙龍第十六期《android插件化及動態(tài)部署》視頻
微信公眾號:Android博客周刊