Android 插件化 動態升級

最新內容請見原文:Android 插件化 動態升級

 

不少朋友私信以及 Android開源交流幾個 QQ 羣 中都問到這個問題,這裏簡單介紹下

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

 

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

 

透露下:
如果時間允許的話,國慶前會把我上半年對於插件化分享的 PPT 放出來,至於整體的實現源碼的開源因爲還有不少小 Bug,還得等一段時間
中秋後會放出上半年一個關於 Java 註解以及幾個常用開源項目註解原理的分析,歡迎圍觀

發佈了48 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章