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