Android 插件化

jopen 10年前發布 | 44K 次閱讀 Android 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/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!