本人最近研究外掛化, 偶然發現此合集, 按照部分連結的文章實際簡單寫了些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外掛化入門
開發者將外掛程式碼封裝成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外掛化及動態部署》視訊