Android 外掛化 動態升級

yangxi_001發表於2016-01-07

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) 最近的:
淘寶的 Atlas
360 的 DroidPlugin

 

(5) 其他資料
淘寶伯奎:Android外掛化及動態部署—ATLAS http://v.youku.com/v_show/id_XNTMzMjYzMzM2.html  
更多外掛化開源專案可見:外掛化開源專案收集

對你有幫助的話,去知乎點個贊讓更多人瞭解:怎麼將 Android 程式做成外掛化的形式  

 

最後:外掛化 Demo 實現起來很簡單,但整體以及細節的考慮很多,還是很費時間的,大家有其他不錯的資料也歡迎評論中告訴我  

相關文章