Android 插件化
1、作用
大多數朋友開始接觸這個問題是因為 App 爆棚了,方法數超過了一個 Dex 最大方法數 65535 的上限,從這個介紹中也知道可以通過多個 Dex 來解決這個問題,因而便有了插件化的概念,將一個 App 劃分為多個插件(Dex或相關格式)
常用的其他解決方法還包括:刪無用代碼,用 H5 代替部分邏輯,買付費版的 Proguard
插件化的其他作用包括:(1) 模塊解耦,(2) 單個dex函數不能超過 65535,(3) 動態升級,(4) 高效開發(編譯速度更快)
2、概念
Android 插件化 —— 是指將一個程序劃分為不同的部分,比如一般 App 的皮膚樣式就可以看成一個插件
Android 組件化 —— 這個概念實際跟上面相差不那么明顯,組件和插件較大的區別就是:組件是指通用及復用性較高的構件,比如圖片緩存就可以看成一個組件被多個 App 共用
Android 動態加載 —— 這個實際是更高層次的概念,也有叫法是熱加載或 Android 動態部署,指容器(App)在運?狀態下動態加載某個模塊,從而新增功能或改變某?部分行為
3、相關資料
插件化的原理實際是 Java ClassLoader 的原理,看其他資料前請先看:Java ClassLoader基礎及加載不同依賴 Jar 中的公共類
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
來自:http://www.trinea.cn/android/android-plugin/