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

本期移動開發(fā)精英社群討論的主題是「插件化」,上網(wǎng)查了一下,發(fā)現(xiàn)一篇 CSDN 博主寫的文章《Android 使用動態(tài)加載框架DL進行插件化開發(fā)》。此處引用原作者的話:

隨著應(yīng)用的不斷迭代,應(yīng)用的體積不斷增大,項目越來越臃腫,冗余增加。項目新功能的添加,無法確定與用戶匹配性,發(fā)生嚴重異常往往牽一發(fā)而動全身,只能緊急發(fā)布補丁版本,強制用戶進行更新。結(jié)果頻繁的更新,反而容易降低用戶使用黏性,或者是公司業(yè)務(wù)的不斷發(fā)展,同系的應(yīng)用越來越多,傳統(tǒng)方式需要通過用戶量最大的主項目進行引導下載并安裝。怎么辦?這里就可以參考瀏覽器-插件開發(fā)模式。

同時,筆者也在網(wǎng)絡(luò)上發(fā)現(xiàn)了一些開源的插件化框架,包括:

(1) DynamicLoadApk

這個項目實現(xiàn)了一部分的動態(tài)加載,原理是 DexClassLoader 加 Activity 代理,可以看看。即在容器中注冊幾個代理的 Activity,啟動插件的 Activity 時實際啟動的都是代理的 Activity,這樣就解決了 Activity 必須注冊的問題。

(2) AndroidDynamicLoader

這是點評一個工程師介紹的方式,和上面不同的是:它不是用代理 Activity 的方式實現(xiàn)而是用 Fragment 以及 schema 的方式實現(xiàn)

(3) Android PluginManager

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

希望,上述的資料和內(nèi)容,能夠?qū)Υ蠹伊私獠寮兴鶐椭酒谟懻摰闹黝}如下,文章系 ITOM 管理平臺 OneAPM 整理。

  • 什么是插件化?
  • 為什么要插件化?
  • 插件化需要哪些技術(shù)支撐?
  • 插件化的坑都有哪些?
  • 如何將插件化接入到項目中?

什么是插件化

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

楊天飛-用友超客-android: 動態(tài)加載?

楊春-深圳杰為-android開發(fā): 插件化我覺得就是將一個apk改成多個apk。

王岳明:移動平臺插件化一般來說,通過后臺下發(fā)業(yè)務(wù)模塊到終端,實現(xiàn)業(yè)務(wù)系統(tǒng)的動態(tài)更新吧?

安琪: 多apk?

Struggle:不一定是apk。

追尋: dex jar。

小諾理財android-何思敏 : 目前的插件化,還是為了補充 C 端更新修復問題吧。比如熱修復、插件load、組件技術(shù)等等。

王岳明: 另外插件化也是一種系統(tǒng)架構(gòu)方式,降低各子系統(tǒng)的耦合性。

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

楊維杰: 主要是把業(yè)務(wù)邏輯拆分,在需要的時候加載,減少體積吧?依賴加載.

為什么需要插件化?

<p>王岳明:即插即用。

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

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

陳昱:高效率。

劉光利:我用插件化最大出發(fā)點就是:模塊化,解耦,復用,至于熱更新要看業(yè)務(wù)場景的需要。

千里走單騎:業(yè)務(wù)驅(qū)使,易于團隊協(xié)作。

小可愛:跟搭積木一樣,可以自由組裝,實現(xiàn)業(yè)務(wù)模塊化,方便開發(fā)和維護。

追尋:節(jié)省流量。

Sirius:隨時上線,靈活。

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

小諾理財android-何思敏: 核心還是模塊化,業(yè)務(wù)分離,組件設(shè)計。

安琪:增量更新。

主持人-龍偉: 這些都是插件化的原因。大家看過市面上插件化框架的代碼了嗎? 比如 Droidplugin,插件化說起來就一句話,加載代碼,加載資源。

插件化需要哪些技術(shù)支撐?

主持人-龍偉: 插件化需要的技術(shù),首插件化需要懂類加載機制,資源加載機制,大家對著兩種技術(shù)理解如何,說說自己的看法。

安琪:apk 包機制,assert。

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

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

主持人-龍偉:類加載有引導加載,擴展加載,系統(tǒng)加載,我們平時安裝的 apk 使用的哪個類加載來加載,大家可以說說。

安琪:也有 cpp 寫的。

小可愛: PathClassloader。

主持人-龍偉:Dexclassloader,這個是我們作為插件化加載代碼的加載器之一。非 apk 代碼可以用這個來加載,一般常見加載的包有 dex jar 插件化 apk 包。

小可愛:目前一般是做成 apk 文件吧,插件的?

劉光利:還可以擴展其他格式嗎?

主持人-龍偉:可以,只要符合文件內(nèi)容協(xié)議。

主持人-龍偉:資源的處理是比較麻煩的。首先要保證資源的正確加載,然后要解決很多坑。

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

王岳明:你說的資源是什么?

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

非默:不過你的插件 apk 如何引用宿主 apk 的資源,尤其你的宿主 apk 做了主題之后?

主持人-龍偉:這個需要協(xié)商主與宿。

非默:這個我覺得才是插件化相對困難的地方,要么你就互相傳遞引用,但那樣可能會把你的耦合度提高。

劉光利: accd 就是定制 aapt 工具,我覺得不是太好。

非墨:個人覺得,目前沒有最優(yōu)解。

主持人-龍偉:對,插件化是不斷發(fā)現(xiàn)問題,埋坑!

插件化都有哪些坑?

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

劉光利:由系統(tǒng)掌握生命周期的類。

非墨:fragment。

小可愛:瞞天過海,360 的框架思想,欺騙系統(tǒng),把框架層弄于鼓掌之中。

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

非墨:這個其實說的有點抽象了,舉個例子就是 Android 系統(tǒng)平臺,所有的 apk 本身是插件,其實就是中間件的概念。

主持人-龍偉:上下文是一個操場,里面很多活動的對象,這些對象就是 apk,大家這樣理解了嗎?

安琪:插件化安全嗎?會產(chǎn)生依賴病毒嗎?

非墨:沒有絕對的安全。

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

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

非墨:系統(tǒng)認證還是代碼認證?

劉光利:認證很重要,一般是簽名認證吧,不然會有注入攻擊的分享。

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

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

王岳明:宿主與主體采用相同的簽名方式可以相互調(diào)用嗎?

主持人-龍偉:可以的,雙向的。

非墨:這種方式需要安裝么?

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

非墨:我主要沒理解,相互調(diào)用跟簽名相不相同有什么關(guān)系?

主持人-龍偉:沒關(guān)系,看認證機制,無需安裝的,就沒有系統(tǒng)認證的說法了,其實 apk 安裝的時候才會去認證,插件話是繞過去了。但是本身的代碼認證還需要。一般可以用sha1算法認證。

Wallace:可以自定義二進制。

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

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

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

Wallace:打包跟解包都靠自己的算法。

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

Wallace:別人解不了。

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

<p>主持人-龍偉:插件化接入到項目中,大家的理解是什么樣的?

Wallace:先說一個場景,然后怎么處理用插件化解決的場景。

主持人-龍偉:首先我們有3個團隊開發(fā),有三個業(yè)務(wù)方向,有個主 APP,類似容器,開發(fā)組都是各自的工程,各自工程之間有通信,那么我們?nèi)绾伪WC單獨開發(fā)了,各自工程之間如何相互通信了。

Fish-jenny:contentprovider。

主持人-龍偉:不能,這個是數(shù)據(jù)庫的吧?本質(zhì)是binder,這里可能實際到插件的運行環(huán)境。

安琪:遠程廣播作為接口。

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

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

安琪:eventbus 跨進程呢?

主持人-龍偉:不可以

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

主持人-龍偉:這個是通用解決方案,跨進程就不太方便了,大家對 android 系統(tǒng)跨進程的理解是什么樣的?

Sirius:binder。

Willace:套接字,

非墨:共享內(nèi)存? 管道,

安琪:aidl,

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

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

主持人-龍偉:這個是本質(zhì),一般可以插件包有個 plugincontext,這個是插件接口切入點。借助這個接口可以實現(xiàn)插件之間通信。插件化通用平臺只是理想化的目標,實際場景很難。插件化確實難度大,一晚上講透徹不太現(xiàn)實,下次有機會再和大家一起探討。謝謝大家今天的主題會參與!

國內(nèi) ITOM 管理平臺 OneAPM 致力于幫助企業(yè)用戶提供全棧式的性能管理以及 IT 運維管理服務(wù),通過一個探針就能夠完成日志分析、安全防護、APM 基礎(chǔ)組件監(jiān)控、集成報警以及大數(shù)據(jù)分析等功能。想閱讀更多優(yōu)秀文章,請訪問 OneAPM 官方技術(shù)博客

本文轉(zhuǎn)自 OneAPM 官方博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容