如何將「插件化」接入到項目之中?

本期移動開發精英社羣討論的主題是「插件化」,上網查了一下,發現一篇 CSDN 博主寫的文章《Android 使用動態加載框架DL進行插件化開發》。此處引用原做者的話:android

隨着應用的不斷迭代,應用的體積不斷增大,項目愈來愈臃腫,冗餘增長。項目新功能的添加,沒法肯定與用戶匹配性,發生嚴重異常每每牽一髮而動全身,只能緊急發佈補丁版本,強制用戶進行更新。結果頻繁的更新,反而容易下降用戶使用黏性,或者是公司業務的不斷髮展,同系的應用愈來愈多,傳統方式須要經過用戶量最大的主項目進行引導下載並安裝。怎麼辦?這裏就能夠參考瀏覽器-插件開發模式。git

同時,筆者也在網絡上發現了一些開源的插件化框架,包括:github

(1) DynamicLoadApk算法

這個項目實現了一部分的動態加載,原理是 DexClassLoader 加 Activity 代理,能夠看看。即在容器中註冊幾個代理的 Activity,啓動插件的 Activity 時實際啓動的都是代理的 Activity,這樣就解決了 Activity 必須註冊的問題。數據庫

(2) AndroidDynamicLoader瀏覽器

這是點評一個工程師介紹的方式,和上面不一樣的是:它不是用代理 Activity 的方式實現而是用 Fragment 以及 schema 的方式實現 安全

(3) Android PluginManager網絡

這個項目的原理實際也是 DexClassLoader 加 Activity 代理,不一樣的是上面的 dynamic-load-apk 項目中,插件須要依賴框架的 lib,插件組件繼承框架 lib 的 Base 組件。而這個框架經過字節碼操做動態生成一個子類去繼承插件組件解決插件必須依賴框架的問題,從而達到插件無需作任何改動(理論上)便可加載的效果。 架構

但願,上述的資料和內容,可以對你們瞭解插件化有所幫助,本期討論的主題以下,文章系 ITOM 管理平臺 OneAPM 整理。框架

  • 什麼是插件化?

  • 爲何要插件化?

  • 插件化須要哪些技術支撐?

  • 插件化的坑都有哪些?

  • 如何將插件化接入到項目中?

什麼是插件化

主持人-龍偉: 你們是如何理解插件化的?

楊天飛-用友超客-android: 動態加載?

楊春-深圳傑爲-android開發: 插件化我以爲就是將一個apk改爲多個apk。

王嶽明:移動平臺插件化通常來講,經過後臺下發業務模塊到終端,實現業務系統的動態更新吧?

安琪: 多apk?

Struggle:不必定是apk。

追尋: dex jar。

小諾理財android-何思敏 : 目前的插件化,仍是爲了補充 C 端更新修復問題吧。好比熱修復、插件load、組件技術等等。

王嶽明: 另外插件化也是一種系統架構方式,下降各子系統的耦合性。

主持人-龍偉: 插件化主要是解耦合、熱更新、熱修復、分佈式團隊開發。

楊維傑: 主要是把業務邏輯拆分,在須要的時候加載,減小體積吧?依賴加載.

爲何須要插件化?

王嶽明:即插即用。

主持人-龍偉:這個相似 USB 接口。

安琪: 不必定是 apk,也許是特有的接口格式特有的壓縮包

陳昱:高效率。

劉光利:我用插件化最大出發點就是:模塊化,解耦,複用,至於熱更新要看業務場景的須要。

千里走單騎:業務驅使,易於團隊協做。

小可愛:跟搭積木同樣,能夠自由組裝,實現業務模塊化,方便開發和維護。

追尋:節省流量。

Sirius:隨時上線,靈活。

安琪:Lua 在 Cocos2dx 熱更新比較多。

小諾理財android-何思敏: 核心仍是模塊化,業務分離,組件設計。

安琪:增量更新。

主持人-龍偉: 這些都是插件化的緣由。你們看過市面上插件化框架的代碼了嗎? 好比 Droidplugin,插件化提及來就一句話,加載代碼,加載資源。

插件化須要哪些技術支撐?

主持人-龍偉: 插件化須要的技術,首插件化須要懂類加載機制,資源加載機制,你們對着兩種技術理解如何,說說本身的見解。

安琪:apk 包機制,assert。

追尋:沒超過就一個 dex 吧!

楊天飛-用友超客-android: DexclassLoader

主持人-龍偉:類加載有引導加載,擴展加載,系統加載,咱們平時安裝的 apk 使用的哪一個類加載來加載,你們能夠說說。

安琪:也有 cpp 寫的。

小可愛: PathClassloader。

主持人-龍偉:Dexclassloader,這個是咱們做爲插件化加載代碼的加載器之一。非 apk 代碼能夠用這個來加載,通常常見加載的包有 dex jar 插件化 apk 包。

小可愛:目前通常是作成 apk 文件吧,插件的?

劉光利:還能夠擴展其餘格式嗎?

主持人-龍偉:能夠,只要符合文件內容協議。

主持人-龍偉:資源的處理是比較麻煩的。首先要保證資源的正確加載,而後要解決不少坑。

劉光利:如何防止插件 apk 中的資源和宿主 apk 中的資源引用衝突?

王嶽明:你說的資源是什麼?

主持人-龍偉:圖片、文本、顏色等等,這些都是資源。

非默:不過你的插件 apk 如何引用宿主 apk 的資源,尤爲你的宿主 apk 作了主題以後?

主持人-龍偉:這個須要協商主與宿。

非默:這個我以爲纔是插件化相對困難的地方,要麼你就互相傳遞引用,但那樣可能會把你的耦合度提升。

劉光利: accd 就是定製 aapt 工具,我以爲不是太好。

非墨:我的以爲,目前沒有最優解。

主持人-龍偉:對,插件化是不斷髮現問題,埋坑!

插件化都有哪些坑?

主持人-龍偉:插件化的中的難點與坑。Android 組件代碼加載的特殊性,好比 Activity 的加載。

劉光利:由系統掌握生命週期的類。

非墨:fragment。

小可愛:瞞天過海,360 的框架思想,欺騙系統,把框架層弄於鼓掌之中。

主持人-龍偉:其實就是一個平臺,提供上下文。

非墨:這個其實說的有點抽象了,舉個例子就是 Android 系統平臺,全部的 apk 自己是插件,其實就是中間件的概念。

主持人-龍偉:上下文是一個操場,裏面不少活動的對象,這些對象就是 apk,你們這樣理解了嗎?

安琪:插件化安全嗎?會產生依賴病毒嗎?

非墨:沒有絕對的安全。

主持人-龍偉:既然是插件,那麼確定有缺陷。

王嶽明:請教個問題,Android 的插件涉及到簽名驗證嗎?

非墨:系統認證仍是代碼認證?

劉光利:認證很重要,通常是簽名認證吧,否則會有注入攻擊的分享。

主持人-龍偉:加載以前必須認證,認證經過才加載。

熊生-邁科技-android:如何認證呢?

王嶽明:宿主與主體採用相同的簽名方式能夠相互調用嗎?

主持人-龍偉:能夠的,雙向的。

非墨:這種方式須要安裝麼?

主持人-龍偉:插件無需安裝,能夠通訊,我說說代碼加載認證。

非墨:我主要沒理解,相互調用跟簽名相不相同有什麼關係?

主持人-龍偉:不要緊,看認證機制,無需安裝的,就沒有系統認證的說法了,其實 apk 安裝的時候纔會去認證,插件話是繞過去了。可是自己的代碼認證還須要。通常能夠用sha1算法認證。

Wallace:能夠自定義二進制。

主持人-龍偉:二進制難度有點大。

Wallace:不是要校驗下載包嗎?

主持人-龍偉:這個是比較差別。

Wallace:打包跟解包都靠本身的算法。

非墨:你若是自定義二進制文件不能 loader,load 除非你有一層解碼。

Wallace:別人解不了。

如何將插件化接入到項目中?

主持人-龍偉:插件化接入到項目中,你們的理解是什麼樣的?

Wallace:先說一個場景,而後怎麼處理用插件化解決的場景。

主持人-龍偉:首先咱們有3個團隊開發,有三個業務方向,有個主 APP,相似容器,開發組都是各自的工程,各自工程之間有通訊,那麼咱們如何保證單獨開發了,各自工程之間如何相互通訊了。

Fish-jenny:contentprovider。

主持人-龍偉:不能,這個是數據庫的吧?本質是binder,這裏可能實際到插件的運行環境。

安琪:遠程廣播做爲接口。

劉光利:廣播很耗性能啊?

非墨:廣播涉及到進程間調用,效率低,並且不安全。

安琪:eventbus 跨進程呢?

主持人-龍偉:不能夠

劉光利:插件與宿主共享數據,邏輯能夠定義接口,抽成公用庫。

主持人-龍偉:這個是通用解決方案,跨進程就不太方便了,你們對 android 系統跨進程的理解是什麼樣的?

Sirius:binder。

Willace:套接字,

非墨:共享內存? 管道,

安琪:aidl,

熊生-邁科技-android:共享 sp 文件算不算?

小可愛:直接寫 parcle 進行通訊吧?

主持人-龍偉:這個是本質,通常能夠插件包有個 plugincontext,這個是插件接口切入點。藉助這個接口能夠實現插件之間通訊。插件化通用平臺只是理想化的目標,實際場景很難。插件化確實難度大,一夜講透徹不太現實,下次有機會再和你們一塊兒探討。謝謝你們今天的主題會參與!

國內 ITOM 管理平臺 OneAPM 致力於幫助企業用戶提供全棧式的性能管理以及 IT 運維管理服務,經過一個探針就可以完成日誌分析、安全防禦、APM 基礎組件監控、集成報警以及大數據分析等功能。想閱讀更多優秀文章,請訪問 OneAPM 官方技術博客

本文轉自 OneAPM 官方博客

相關文章
相關標籤/搜索