途牛原创|途牛Android App的插件实现
生活随笔
收集整理的這篇文章主要介紹了
途牛原创|途牛Android App的插件实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android插件化進行得如火如荼,各大名企相繼開源其開發框架。不得不說,無數的技術大牛讓我們敬仰。途牛的APP插件化到目前發布了多個版本,已經相對穩定,這里就敘述下途牛的APP插件化。
途牛的Android App插件化 途牛的插件化是基于dynamic-load-apk(github)實現的。定義了宿主和插件的通信方式,使得兩者能夠互起對方的頁面,調用彼此的功能。同時對activity的啟動方式singletask等進行了模式實現,并增加了對Service的支持等。總之使得插件開發最大限度的保持著原有的Android開發習慣。然后,我們看下引入插件化后,途牛的組織架構,代碼管理及版本發布方式:
從圖中可以看出,部門獨立出后,代碼也隨之獨立出,再無強依賴,部門可以根據自己的需求快速響應,獨立發版,再也不用依賴于宿主app的版本周期。這樣帶來的好處,我想大家都是懂的。 技術實現 我們來看下技術實現:
關于代理Activity的概念這里就不再贅述,詳細請參閱dynamic-load-apk(github) [參見本文最后]。這里給一個代理Activity和插件activity的關系圖。
下面主要描述下對其進行的擴展支持。先上圖,如下: 1. 插件框架對于原生功能支持的實現a)宿主App和插件的通訊方式定義宿主App和插件的通訊方式定義使用橋接模式,分別為宿主和插件定義 了接口(HostInterface,PluginInterface),各自對接口進行實現。宿主app在啟動時將其接口實現set到DLlib中。插件將接口實現發布在其AndroidMainfest.xml中,并在宿主app初始化插件包時,通過反射獲取該實現set到DLlib中。這樣以來,兩者可實現相互的界面跳轉,及功能函數的調用。
b) Activity啟動方式的模擬支持Activity啟動方式的模擬支持通過對代理Activity原理的了解,我們都會發現啟動的插件頁面實際上都是DLProxyActivity,插件activity只是這個代理Activity的一個成員對象,基于這個一對一的映射關系,我們為插件activity建立獨立的task管理,通過監控DLProxyActivity的生命周期,來模擬實現插件activity的singletask,singleinstance的實現。
c) Service支持Service支持參照代理Activity思想,同樣設置代理Service。這個代理Service中維護著一個插件service的列表。每次向插件Service發送請求,實際上仍然是通過反射方式向代理Service發送請求,代理Service再進行分發。
d) 通過對代理Activity的監控,增加插件頁面在被回收后,能夠由系統自動恢復的支持。
e)其它細節不再贅述。
2. 宿主App和插件app的打包和發布方式a) 宿主App打包時,compile依賴Lib庫并一起打包成apk。b) 插件打包時,provide依賴Lib庫,打包出的apk中不包含Lib庫的內容。
3. 插件app的開發調測a) 插件app可更改Lib庫的依賴為compile,打包生成可安裝運行apk,進行開發調測。b) 插件app依賴宿主app進行開發調測。更改宿主app加載插件路徑為自己方便拷貝的路徑,然后插件app打包進行替換。需要debug時,可直接添加斷點,進入debug模式。
4.關于插件管理平臺a) 插件管理以宿主app的版本為key,進行管理。每個宿主app有其對應支持的插件列表。b) 插件的更新采用增量更新模式。 c)對于下載的插件包或增量包進行簽名校驗
對比 最后來 做個對比,說下不足: 1. DynamicAPK(攜程)a) 看到插件的Activity需要注冊在宿主app的AndroidMainfest.xml里,我就不喜歡了。需求上不希望插件增加一個界面,主app要跟著發版。
b) 打包要改aapt,插件編譯要依賴宿主app,主app發版要合并R文件,這還是要捆綁發版,不喜歡。
c) Hook系統Instrumentation,這個很厲害,值得借鑒,看能否在此層面完成插件activity啟動模式的支持。
d)遷移成本極其小,值得贊揚。
2.DroidPlugin(奇虎360)這個不滿足需求,途牛app需要宿主app和插件件進行頻繁復雜的交互。直接pass。 優勢與不足 不足:a) that的存在,導致遷移時要進行適當培訓。b) 不支持插件自定義scheme應用到插件activity上。c) 不支持宿主FragmentActivity + 宿主Fragement + 插件Fragement這樣的混合使用。d) 不支持插件ContentProvider。e) 不支持插件靜態廣播。f)不支持對Lib和宿主app中的資源訪問.
優勢:
再次說下優勢,做個宣傳。最大的優勢:插件增加或減少頁面,宿主app不需要做任何修改,而且插件可獨立發布。綜上,算是選擇了一個最適合需求的框架。
備注:dynamic-load-apk(github)的鏈接:
https://github.com/singwhatiwanna/dynamic-load-apk
總結
以上是生活随笔為你收集整理的途牛原创|途牛Android App的插件实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息安全等级保护等级划分
- 下一篇: android sina oauth2.