Android 使用動態加載框架DL進行插件化開發

http://blog.csdn.net/t12x3456/article/details/39958755/


Android 插件化 動態升級

不少朋友私信問到這個問題,這裏簡單介紹下我的瞭解

1、作用

大多數朋友開始接觸這個問題是因爲 App 爆棚了,方法數超過了一個 Dex 最大方法數 65535 的上限,因而便有了插件化的概念,將一個 App 劃分爲多個插件(Apk 或相關格式)

 

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

 

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

 

2、概念

Android 插件化 —— 指將一個程序劃分爲不同的部分,比如一般 App 的皮膚樣式就可以看成一個插件

 

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

 

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

 

3、相關資料

插件化的原理實際是 Java ClassLoader 的原理,看其他資料前請先看:Java ClassLoader基礎  

 

Android 也有自己的 ClassLoader,分爲 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader,區別在於 PathClassLoader 不能直接從 zip 包中得到 dex,因此只支持直接操作 dex 文件或者已經安裝過的 apk(因爲安裝過的 apk 在 cache 中存在緩存的 dex 文件)。而 DexClassLoader 可以加載外部的 apk、jar 或 dex文件,並且會在指定的 outpath 路徑存放其 dex 文件。  

 

目前開源的插件化框架有:
(1) DynamicLoadApk
GitHub:https://github.com/singwhatiwanna/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) 其他資料
淘寶伯奎:Android插件化及動態部署—ATLAS http://v.youku.com/v_show/id_XNTMzMjYzMzM2.html

 
最近的:
淘寶的 Atlas
360 的 DroidPlugin


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章