Android博客周刊專題之#插件化開發(fā)#

本期專欄目討論插件化開發(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博客周刊


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捌臊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兜材,更是在濱河造成了極大的恐慌理澎,老刑警劉巖逞力,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矾端,居然都是意外死亡掏击,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門秩铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灯变,你說我怎么就攤上這事殴玛。” “怎么了添祸?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵滚粟,是天一觀的道長。 經(jīng)常有香客問我刃泌,道長凡壤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任耙替,我火速辦了婚禮亚侠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俗扇。我一直安慰自己硝烂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布铜幽。 她就那樣靜靜地躺著滞谢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪除抛。 梳的紋絲不亂的頭發(fā)上狮杨,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音到忽,去河邊找鬼橄教。 笑死,一個胖子當(dāng)著我的面吹牛绘趋,可吹牛的內(nèi)容都是我干的颤陶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼陷遮,長吁一口氣:“原來是場噩夢啊……” “哼滓走!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帽馋,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奋隶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劲藐,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年叠赦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡赏表,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匈仗,到底是詐尸還是另有隱情瓢剿,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布悠轩,位于F島的核電站间狂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏火架。R本人自食惡果不足惜鉴象,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望何鸡。 院中可真熱鬧纺弊,春花似錦、人聲如沸音比。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洞翩。三九已至稽犁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骚亿,已是汗流浹背已亥。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留来屠,地道東北人虑椎。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像俱笛,于是被迫代替她去往敵國和親捆姜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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