最新內容請見原文:Android 插件化 動態升級html
很多朋友私信以及 Android開源交流幾個 QQ 羣 中都問到這個問題,這裏簡單介紹下java
大多數朋友開始接觸這個問題是由於 App 爆棚了,方法數超過了一個 Dex 最大方法數 65535 的上限,從這個介紹中也知道能夠經過多個 Dex 來解決這個問題,於是便有了插件化的概念,將一個 App 劃分爲多個插件(Dex或相關格式)
經常使用的其餘解決方法還包括:刪無用代碼,用 H5 代替部分邏輯,買付費版的 Proguard
插件化的其餘做用包括:(1) 模塊解耦,(2) 單個dex函數不能超過 65535,(3) 動態升級,(4) 高效開發(編譯速度更快)android
Android 插件化 —— 是指將一個程序劃分爲不一樣的部分,好比通常 App 的皮膚樣式就能夠當作一個插件
Android 組件化 —— 這個概念實際跟上面相差不那麼明顯,組件和插件較大的區別就是:組件是指通用及複用性較高的構件,好比圖片緩存就能夠當作一個組件被多個 App 共用
Android 動態加載 —— 這個實際是更高層次的概念,也有叫法是熱加載或 Android 動態部署,指容器(App)在運⾏狀態下動態加載某個模塊,從而新增功能或改變某⼀部分行爲git
插件化的原理實際是 Java ClassLoader 的原理,看其餘資料前請先看:Java ClassLoader基礎及加載不一樣依賴 Jar 中的公共類github
Android 也有本身的 ClassLoader,分爲 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader,區別在於 PathClassLoader 不能直接從 zip 包中獲得 dex,所以只支持直接操做 dex 文件或者已經安裝過的 apk(由於安裝過的 apk 在 cache 中存在緩存的 dex 文件)。而 DexClassLoader 能夠加載外部的 apk、jar 或 dex文件,而且會在指定的 outpath 路徑存放其 dex 文件緩存
(1) 開源項目
https://github.com/singwhatiwanna/dynamic-load-apk
這個項目實現了一部分的動態加載,原理是 DexClassLoader 加 Activity 代理,能夠看看。
這個項目裏有幾個問題沒解決,一個是 FragmentActivity 或是 ActionBarActiviy 的代理方式不行,由於存在 ClassLoader 隔離問題,可用打包方式去掉相同依賴包只保留一份來解決。that 指針可經過複寫大部分接口從而改成 this 指針調用便可,另外 Activity 的建立過程有缺失性能優化
https://github.com/mmin18/AndroidDynamicLoader
這是點評一個工程師介紹的方式,和上面不一樣的是:他不是用代理 Activity 的方式實現而是用 Fragment 以及 schema 的方式實現函數
(2) 其餘資料
淘寶伯奎:Android插件化及動態部署—ATLAS http://v.youku.com/v_show/id_XNTMzMjYzMzM2.html工具
最後:Demo 實現起來很簡單,但總體以及細節的考慮不少,仍是很費時間的,你們有其餘不錯的資料也歡迎評論中告訴我組件化
透露下:
若是時間容許的話,國慶前會把我上半年對於插件化分享的 PPT 放出來,至於總體的實現源碼的開源由於還有很多小 Bug,還得等一段時間
中秋後會放出上半年一個關於 Java 註解以及幾個經常使用開源項目註解原理的分析,歡迎圍觀