怎樣將「插件化」接入到項目之中?

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

隨着應用的不斷迭代,應用的體積不斷增大,項目愈來愈臃腫,冗餘添加。項目新功能的加入,沒法肯定與用戶匹配性,發生嚴重異常每每牽一髮而動全身,僅僅能緊急公佈補丁版本號,強制用戶進行更新。結果頻繁的更新。反而easy減小用戶使用黏性,或者是公司業務的不斷髮展,同系的應用愈來愈多,傳統方式需要經過用戶量最大的主項目進行引導下載並安裝。git

怎麼辦?這裏就可以參考瀏覽器-插件開發模式。github

同一時候,筆者也在網絡上發現了一些開源的插件化框架。包含:算法

(1) DynamicLoadApk數據庫

這個項目實現了一部分的動態載入。原理是 DexClassLoader 加 Activity 代理。可以看看。即在容器中註冊幾個代理的 Activity,啓動插件的 Activity 時實際啓動的都是代理的 Activity。這樣就攻克了 Activity 必須註冊的問題。瀏覽器

(2) AndroidDynamicLoader安全

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

(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,類似容器,開發組都是各自的project。各自project之間有通訊。那麼咱們怎樣保證單獨開發了,各自project之間怎樣相互通訊了。

Fish-jenny:contentprovider。

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

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

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

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

安琪:eventbus 跨進程呢?

主持人-龍偉:不可以

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

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

Sirius:binder。

Willace:套接字,

非墨:共享內存? 管道,

安琪:aidl,

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

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

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

謝謝你們今天的主題會參與!

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

本文轉自 OneAPM 官方博客

相關文章
相關標籤/搜索