Android的Proxy/Delegate Application框架 (主要介紹插件化開發)

1. 插件化的原理html

是 Java ClassLoader 的原理:Java ClassLoader基礎  java

經常使用的其餘解決方法還包括:Google Multidex,用 H5 代替部分邏輯,刪無用代碼,買付費版的 Proguardandroid

當插件化做用包括:(1) 模塊解耦,(2) 動態升級,(3) 高效並行開發(編譯速度更快) (4) 按需加載,內存佔用更低 (5) 節省升級流量  git

2. 插件化github

Android 插件化 —— 指將一個程序劃分爲不一樣的部分,好比通常 App 的皮膚樣式就能夠當作一個插件緩存

Android 組件化 —— 這個概念實際跟上面相差不那麼明顯,組件和插件較大的區別就是:組件是指通用及複用性較高的構件,好比圖片緩存就能夠當作一個組件被多個 App 共用app

Android 動態加載 —— 這個實際是更高層次的概念,也有叫法是熱加載或 Android 動態部署,指容器(App)在運⾏狀態下動態加載某個模塊,從而新增功能或改變某⼀部分行爲  框架

3. 開源的插件化框架有:ide

(1) DynamicLoadApk
GitHub:https://github.com/singwhatiwanna/dynamic-load-apk組件化

原理整理:DYNAMIC-LOAD-APK插件原理整理

項目描述:這個項目實現了一部分的動態加載,原理是 DexClassLoader 加 Activity 代理,能夠看看。即在容器中註冊幾個代理的 Activity,啓動插件的 Activity 時實際啓動的都是代理的 Activity,這樣就解決了 Activity 必須註冊的問題。

(2) AndroidDynamicLoader

GitHub:https://github.com/mmin18/AndroidDynamicLoader
這是點評一個工程師介紹的方式,和上面不一樣的是:他不是用代理 Activity 的方式實現而是用 Fragment 以及 schema 的方式實現  

(3) Android PluginManager

GitHub:https://github.com/houkx/android-pluginmgr
項目描述:這個項目的原理實際也是 DexClassLoader 加 Activity 代理,不一樣的是上面的 dynamic-load-apk 項目中,插件須要依賴框架的 lib,插件組件繼承框架 lib 的 Base 組件。而這個框架經過字節碼操做動態生成一個子類去繼承插件組件解決插件必須依賴框架的問題,從而達到插件無需作任何改動(理論上)便可加載的效果。

(4) DroidPlugin

GitHub: https://github.com/Qihoo360/DroidPlugin

 

項目描述:這是360手機助手在Android系統上實現了一種新的插件機制:它能夠在無需安裝、修改的狀況下運行APK文件.(支持Androd 2.3以上系統

(5) DynamicAPK

GitHub: https://github.com/CtripMobile/DynamicAPK

項目描述:http://www.open-open.com/lib/view/open1446714684951.html

 

淘寶伯奎:Android插件化及動態部署—ATLAS http://v.youku.com/v_show/id_XNTMzMjYzMzM2.html  

 

360技術團隊地址:http://blogs.360.cn/blog/proxydelegate-application/

Android 插件開發,作成動態加載  美團Android DEX自動拆包及動態加載簡介 

實現一些特殊需求,如界面換膚、插件化等,咱們但願改變應用的運行環境(surrounding)。例如,咱們但願某個應用在運行時,全部Class(包括自定義Application,下面假設它叫MyApplication)都被一個自定義的ClassLoader加載。

要實現這個需求,須要在MyApplication被加載以前,先替換掉API層的默認ClassLoader,不然MyApplication就會被默認ClassLoader加載。但這會產生一個悖論,MyApplication被加載以前,沒有任何應用代碼能夠運行,替換ClassLoader沒法辦到。Proxy/Delegate Application框架就是用來解決這類問題的。

在Proxy/Delegate Application框架裏,應用一共有兩個Application對象,一個稱爲ProxyApplication,另外一個稱爲DelegateApplication:

(1) ProxyApplication:框架會提供一個ProxyApplication抽象基類(abstract class),使用者須要繼承這個類,並重載其initProxyApplication()方法,在其中改變surrounding,如替換ClassLoader等。

(2) DelegateApplication:即應用原有的Application,應用從getApplicationContext()等方法中取到的都是DelegateApplication。注意DelegateApplication只是一個稱謂,並無一個叫DelegateApplication的基類存在。

相關文章
相關標籤/搜索