Android 外掛化 動態升級
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 實現起來很簡單,但整體以及細節的考慮很多,還是很費時間的,大家有其他不錯的資料也歡迎評論中告訴我
相關文章
- Android外掛化原理(一)Activity外掛化Android
- apisix~升級原始外掛的方法API
- Android外掛化開篇Android
- 淺析Android外掛化Android
- Flutter啟動流程分析之外掛化升級探索Flutter
- [外掛擴充套件]三級聯動外掛!!!!!!!!套件
- [Android]AAB外掛化架構Android架構
- 活動外掛功能新玩法,系統升級新體驗
- [Android元件化]AAB外掛化架構Android元件化架構
- Pro Motion Blur Mac(動態模外掛fcpx外掛)Mac
- Visual Studio 整合了.NET 升級助手外掛
- 升級vue專案中的外掛版本Vue
- Android外掛化的一種方案Android
- Android外掛化技術之旅 1 開篇 - 實現啟動外掛與呼叫外掛中的Activity和ServiceAndroid
- [Android] 元件化 & 模組化 & 外掛化演進Android元件化
- Android外掛化研究代ACTIVITY註冊Android
- Android 外掛化框架 DynamicLoadApk 原始碼分析Android框架APK原始碼
- Android 外掛化原理入門筆記Android筆記
- Flutter 新聞客戶端 - 11 APP升級、android動態授權Flutter客戶端APPAndroid
- Android每週一輪子:android-pluginmgr(外掛化)AndroidPlugin
- Android Gradle外掛AndroidGradle
- 記一次uniapp安卓原生外掛升級APP安卓
- 專案的升級-給RemoveButterKnife外掛增加新功能REM
- 構建api gateway之 動態外掛APIGateway
- android 基於dex的外掛化開發Android
- Android外掛化原理分析(基於Neptune框架)Android框架
- 我的Android重構之旅:外掛化篇Android
- vue 省市區三級聯動外掛Vue
- Android-動態載入外掛資源,皮膚包的實現原理Android
- Bootstrap4動態模態視窗jquery外掛bootjQuery
- Flutter動態化-Android(一)FlutterAndroid
- Notepad++無法升級外掛管理器Plugin managerPlugin
- Jenkins 自動化安裝外掛Jenkins
- AE/PR動態模糊外掛ReelSmart MotionBlur Pro
- Android外掛化的相容性(上):Android O的適配Android
- Android外掛化的相容性(中):Android P的適配Android
- Android進階(九)Activity外掛化和VirtualApk分析AndroidAPK
- 從ClassLoader到Android外掛化以及熱更新原理Android
- FCPX外掛:超級慢動作變速外掛Twixtor Pro 7 mac版Mac