【轉】Android插件化從入門到放棄-最強合集

本文轉自:Android博客周刊專題之#插件化開發#

原文作者:陸鎮生_Jomeslu

本人最近研究插件化, 偶然發現此合集, 按照部分鏈接的文章實際簡單寫了些demo,受益良多, 覺得確實不錯,特轉載過來,給需要的人。

插件化涉及的東西很多,所以我們需要多個維度去學習。大概分為5個部分:預備知識、入門、進階、系列、類庫。一步一步深入了解插件的原理。

基礎
1.Java 類加載器
類加載器(class loader)是 Java中的一個很重要的概念。類加載器負責加載 Java 類的字節代碼到 Java 虛擬機中。本文首先詳細介紹了 Java 類加載器的基本概念,包括代理模式、加載類的具體過程和線程上下文類加載器等,接著介紹如何開發自己的類加載器,最后介紹了類加載器在 Web 容器和 OSGi中的應用。

2.反射原理
Java 提供的反射機制允許您於執行時期動態載入類別、檢視類別資訊、生成物件或操作生成的物件,要舉反射機制的一個應用實例,就是在整合式開發環境中所提供的方法提示或是類別檢視工具,另外像 JSP 中的 JavaBean 自動收集請求資訊也使用到反射,而一些軟體開發框架(Framework)也常見到反射機制的使用,以達到動態載入使用者自訂類別的目的。

3.代理模式及Java實現動態代理
定義:給某個對象提供一個代理對象,并由代理對象控制對于原對象的訪問,即客戶不直接操控原對象,而是通過代理對象間接地操控原對象。

入門
1.Android動態加載dex技術初探
Android使用Dalvik虛擬機加載可執行程序,所以不能直接加載基于class的jar,而是需要將class轉化為dex字節碼,從而執行代碼。優化后的字節碼文件可以存在一個.jar中,只要其內部存放的是.dex即可使用。

[2.Android插件化入門(鏈接失效)](http://104.236.134.90/2016/02/02/Android%E6%8F%92%E4%BB%B6%E5%8C%96%E5%9F%BA%E7%A1%80/)
開發者將插件代碼封裝成Jar或者APK。宿主下載或者從本地加載Jar或者APK到宿主中。將宿主調用插件中的算法或者Android特定的Class(如Activity)

3.插件化開發—動態加載技術加載已安裝和未安裝的apk
動態加載技術就是使用類加載器加載相應的apk、dex、jar(必須含有dex文件),再通過反射獲得該apk、dex、jar內部的資源(class、圖片、color等等)進而供宿主app使用。

4.Android動態加載技術三個關鍵問題詳解
動態加載技術(也叫插件化技術)在技術驅動型的公司中扮演著相當重要的角色,當項目越來越龐大的時候,需要通過插件化來減輕應用的內存和CPU占用,還可以實現熱插拔,即在不發布新版本的情況下更新某些模塊。

進階
1.攜程Android App插件化和動態加載實踐
攜程Android App的插件化和動態加載框架已上線半年,經歷了初期的探索和持續的打磨優化,新框架和工程配置經受住了生產實踐的考驗。本文將詳細介紹Android平臺插件式開發和動態加載技術的原理和實現細節,回顧攜程Android App的架構演化過程,期望我們的經驗能幫助到更多的Android工程師。

2.動態加載APK原理分享
被加載的apk稱之為插件,因為機制類似于生物學的"寄生",加載了插件的應用也被稱為宿主。 往往不是所有的apk都可作為插件被加載,往往需要遵循一定的"開發規范",還需要插件項目引入某種api類庫,業界通常都是這么做的。

3.Android插件化的一種實現
Android的插件化已經是老生常談的話題了,插件化的好處有很多:解除代碼耦合,插件支持熱插拔,靜默升級,從根本上解決65K屬性和方法的bug等等。下面給大家介紹一下我們正在用的差價化框架。本片主要以類圖的方式向大家介紹插件話框架的實現。

4.蘑菇街 App 的組件化之路
隨著我街業務的蓬勃發展,產品和運營隨時上新功能新活動的需求越來越強烈,經常可以聽到“有個功能我想周x上,行不行”。行么?當然是不行啦,上新功能得發新版本啊,到時候費時費力打亂開發節奏不說,覆蓋率也是個問題。

5.DynamicLoadApk 源碼解析
DynamicLoadApk 是一個開源的 Android 插件化框架。插件化的優點包括:(1) 模塊解耦,(2) 動態升級,(3) 高效并行開發(編譯速度更快) (4) 按需加載,內存占用更低等等DynamicLoadApk 提供了 3 種開發方式,讓開發者在無需理解其工作原理的情況下快速的集成插件化功能。

6.Android apk動態加載機制的研究
問題是這樣的:我們知道,apk必須安裝才能運行,如果不安裝要是也能運行該多好啊,事實上,這不是完全不可能的,盡管它比較難實現。在理論層面上,我們可以通過一個宿主程序來運行一些未安裝的apk,當然,實踐層面上也能實現,不過這對未安裝的apk有要求。我們的想法是這樣的,首先要明白apk未安裝是不能被直接調起來.

7.美團Android DEX自動拆包及動態加載簡介
作為一個android開發者,在開發應用時,隨著業務規模發展到一定程度,不斷地加入新功能、添加新的類庫,代碼在急劇的膨脹,相應的apk包的大小也急劇增加, 那么終有一天,你會不幸遇到這個錯誤.

8.途牛原創|途牛Android App的插件實現
途牛的插件化是基于dynamic-load-apk(github)實現的。定義了宿主和插件的通信方式,使得兩者能夠互起對方的頁面,調用彼此的功能。同時對activity的啟動方式singletask等進行了模式實現,并增加了對Service的支持等。總之使得插件開發最大限度的保持著原有的Android開發習慣。

9. Android apk資源加載和activity生命周期管理
博主分析了Android中apk的動態加載機制,并在文章的最后指出需要解決的兩個復雜問題:資源的訪問和activity生命周期的管理,而本文將會分析這兩個復雜問題的解決方法。

10.APK動態加載框架(DL)解析
首先要說的是動態加載技術(或者說插件化)在技術驅動型的公司中扮演這相當重要的角色,當項目越來越龐大的時候,需要通過插件化來減輕應用的內存和cpu占用,還可以實現熱插拔,即在不發布新版本的情況下更新某些模塊。

系列
1.Kaedea---Android動態加載技術 簡單易懂的介紹
我們很早開始就在Android項目中采用了動態加載技術,主要目的是為了達到讓用戶不用重新安裝APK就能升級應用的功能(特別是 SDK項目),這樣一來不但可以大大提高應用新版本的覆蓋率,也減少了服務器對舊版本接口兼容的壓力,同時如果也可以快速修復一些線上的BUG。

2.Kaedea---Android動態加載基礎 ClassLoader的工作機制
早期使用過Eclipse等Java編寫的軟件的同學可能比較熟悉,Eclipse可以加載許多第三方的插件(或者叫擴展),這就是動態加載。這些插件大多是一些Jar包,而使用插件其實就是動態加載Jar包里的Class進行工作。

3.Kaedea---Android動態加載補充 加載SD卡的SO庫
Android中JNI的使用其實就包含了動態加載,APP運行時動態加載.so庫并通過JNI調用其封裝好的方法。后者一般是使用NDK工具從C/C++代碼編譯而成,運行在Native層,效率會比執行在虛擬機的Java代碼高很多,所以Android中經常通過動態加載.so庫來完成一些對性能比較有需求的工作(比如T9搜索、或者Bitmap的解碼、圖片高斯模糊處理等)。

4.Kaedea---Android動態加載入門 簡單加載模式
Java程序中,JVM虛擬機是通過類加載器ClassLoader加載.jar文件里面的類的。Android也類似,不過Android用的是Dalvik/ART虛擬機,不是JVM,也不能直接加載.jar文件,而是加載dex文件。

5.Kaedea---Android動態加載進階 代理Activity模式
簡單模式中,使用ClassLoader加載外部的Dex或Apk文件,可以加載一些本地APP不存在的類,從而執行一些新的代碼邏輯。但是使用這種方法卻不能直接啟動插件里的Activity。

6.Kaedea---Android動態加載黑科技 動態創建Activity模式
還記得我們在代理Activity模式里談到啟動插件APK里的Activity的兩個難題嗎,由于插件里的Activity沒在主項目的Manifest里面注冊,所以無法經歷系統Framework層級的一系列初始化過程,最終導致獲得的Activity實例并沒有生命周期和無法使用res資源。

7.尼古拉斯---插件開發基礎篇:動態加載技術解讀
在目前的軟硬件環境下,Native App與Web App在用戶體驗上有著明顯的優勢,但在實際項目中有些會因為業務的頻繁變更而頻繁的升級客戶端,造成較差的用戶體驗,而這也恰恰是Web App的優勢。本文對網上Android動態加載jar的資料進行梳理和實踐在這里與大家一起分享,試圖改善頻繁升級這一弊病。

8.尼古拉斯---插件開發開篇:類加載器分析
這篇文章主要介紹了Android中主要的兩個類加載器:PathClassLoader和DexClassLoader,他們的區別,聯系,用法等問題,以及我們在制作插件的過程中會遇到哪些常見的問題。這篇文章也是后續兩篇文章的基礎,因為如果不了解這兩個類的話,我們將無法進行后續的操作。

9.尼古拉斯---插件開發中篇:資源加載問題(換膚原理解析)
這篇文章主要通過現在一些應用自帶的換膚技術的解讀來看看,在開發插件的過程中如何解決一些資源加載上的問題,這個問題為何要單獨拿出來解釋,就是因為他涉及的知識很多,也是后面一篇文章的基礎,我們在需要加載插件中的資源文件的時候。

10.尼古拉斯---插件開發終極篇:動態加載Activity(免安裝運行程序)
這篇文章主要是講解了如何加載插件中的Activity。從而實現免安裝運行程序,同時這篇文章也是對前三篇文章知識的綜合使用。下載很多應用都會使用到插件技術,因為包的大小和一些功能的優先級來決定哪些模塊可以制作成插件。

11.Weishu---Android插件化原理解析——概要
類的加載可以使用Java的ClassLoader機制,但是對于Android來說,并不是說類加載進來就可以用了,很多組件都是有“生命”的;因此對于這些有血有肉的類,必須給它們注入活力,也就是所謂的組件生命周期管理.

12.Weishu---Android插件化原理解析——Hook機制之動態代理
使用代理機制進行API Hook進而達到方法增強是框架的常用手段,比如J2EE框架Spring通過動態代理優雅地實現了AOP編程,極大地提升了Web開發效率;同樣,插件框架也廣泛使用了代理機制來增強系統API從而達到插件化的目的.

13.Weishu---Android插件化原理解析——Hook機制之Binder Hook
Android系統通過Binder機制給應用程序提供了一系列的系統服務,諸如ActivityManagerService,ClipboardManager, AudioManager等;這些廣泛存在系統服務給應用程序提供了諸如任務管理,音頻,視頻等異常強大的功能。

14.Weishu---Android 插件化原理解析——Hook機制之AMS&PMS
在前面的文章中我們介紹了DroidPlugin的Hook機制,也就是代理方式和Binder Hook;插件框架通過AOP實現了插件使用和開發的透明性。在講述DroidPlugin如何實現四大組件的插件化之前,有必要說明一下它對AMS以及PMS的Hook方式。

15.Weishu---Android 插件化原理解析——Activity生命周期管理
之前的 Android插件化原理解析 系列文章揭開了Hook機制的神秘面紗,現在我們手握倚天屠龍,那么如何通過這種技術完成插件化方案呢?具體來說,插件中的Activity,Service等組件如何在Android系統上運行起來?

16.Weishu---Android 插件化原理解析——插件加載機制
上文 Activity生命周期管理 中我們地完成了『啟動沒有在AndroidManifest.xml中顯式聲明的Activity』的任務;通過Hook AMS和攔截ActivityThread中H類對于組件調度我們成功地繞過了AndroidMAnifest.xml的限制。

17.Weishu---Android插件化原理解析——廣播的管理
在Activity生命周期管理 以及 插件加載機制 中我們詳細講述了插件化過程中對于Activity組件的處理方式,為了實現Activity的插件化我們付出了相當多的努力;那么Android系統的其他組件,比如BroadcastReceiver,Service還有ContentProvider,它們又該如何處理呢?

18.Weishu---Android 插件化原理解析——Service的插件化
在 Activity生命周期管理 以及 廣播的管理 中我們詳細探討了Android系統中的Activity、BroadcastReceiver組件的工作原理以及它們的插件化方案,相信讀者已經對Android Framework和插件化技術有了一定的了解;

類庫
1.DroidPlugin
是360手機助手在Android系統上實現了一種新的插件機制
2.Android-Plugin-Framework
此項目是Android插件開發框架完整源碼及示例。用來通過動態加載的方式在宿主程序中運行插件APK。
3.Small
世界那么大,組件那么小。Small,做最輕巧的跨平臺插件化框架。里面有很詳細的文檔
4.dynamic-load-apk
Android 使用動態加載框架DL進行插件化開發
5.AndroidDynamicLoader
Android 動態加載框架,他不是用代理 Activity 的方式實現而是用 Fragment 以及 Schema 的方式實現
6.DynamicAPK
實現Android App多apk插件化和動態加載,支持資源分包和熱修復.攜程App的插件化和動態加載框架.
7.ACDD
非代理Android動態部署框架
8.android-pluginmgr
不需要插件規范的apk動態加載框架。
9. VirtualAPK
VirtualAPK是滴滴出行自研的一款優秀的插件化框架。
10.android-pluginmgr
不需要插件規范的apk動態加載框架。
11.RePlugin
RePlugin是一套完整的、穩定的、適合全面使用的,占坑類插件化方案,由360手機衛士的RePlugin Team研發,也是業內首個提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。

參考視頻
1.DroidPlugin的實現原理及其應用
Droid Plugin是360手機助手在2015年初研發的一個全新的基于Android平臺的插件機制.
2.android插件化及動態部署
阿里技術沙龍第十六期《android插件化及動態部署》視頻

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,637評論 25 708
  • 是時候來一波Android插件化了 是時候來一波Android插件化了前言Android開發演進模塊化介紹插件化介...
    流水不腐小夏閱讀 4,805評論 3 51
  • 最近幾年移動開發業界興起了「 插件化技術 」的旋風,各個大廠都推出了自己的插件化框架,各種開源框架都評價自身功能優...
    斜杠時光閱讀 3,988評論 1 36
  • 記得當時年紀小 愛追蝴蝶愛摘草 最美時不過夕陽正西下 剛被收割過的麥地一片凌亂 耳后別著一根長長的狗尾巴草 從凌亂...
    毛栗子安閱讀 333評論 0 0