dynamic-load-apk 插件與宿主方法互調

新建項目 DlPluginHost,下載dynamic-load-apk源碼app

1.將dynamic-load-apk 文件夾中的lib作爲module導入到DlPlginHostide

 

2.導入到PluginHost後,PluginHost引用lib,項目文件目錄以下:gradle

 

3.新建插件項目DlPluginFirst,將dynamic-load-apk下的lib模塊編譯生成的jar,丟到插件的libs目錄下: ui

修改插件的 gradle 文件:spa

 

注意這裏用provided只是爲了讓插件經過編譯,最終打包出來的插件是不會包含這個lib的,由於宿主中已經包含了這個lib,若是用 compile去包含,雖然可能一樣能夠達到效果,可是插件包莫名增長了一個lib的大小,不必插件

4.這樣宿主跟插件都有了,宿主app是根據demo作的,全部咱們把 DlPluginFirst build生成apk,放在根目錄的 DynamicLoadHost目錄下:代理

 

 

5.啓動宿主app(DlPluginHost),點擊Item,就能夠正常拉起 插件app(DlPluginFirst)了:日誌

 

 

下面咱們開始處理插件與宿主間的方法互調:繼承

1.咱們先看一下dynamic-load-apk的源碼(如下簡稱DL):接口

 

注意紅色箭頭部分:

很明顯這裏獲取到插件的 classname ,而後經過loadPluginClass 獲取該類的實例,loadPluginClass代碼以下:

 

1.這裏能夠拿到類的實例的話,那麼接下來的問題就好處理了,不少人想到的第一個處理方法就是,經過反射出該類的方法而後直接進行調用,but,這樣實驗下來是有問題的 ,method 是能夠反射出來的,可是調用的時候 報錯:class 不一致,這個方法pass. 

 

那怎麼解決這個問題呢,咱們能夠這麼作,咱們作一個host與plugin共同引用的interface,而後經過interface來達到調用的效果:

1.在 host中新建module plugininterface , 並添加接口類:

 

 因爲反射出插件類是在 dl-lib中實現的 ,因此lib添加依賴 plugininterface, 再把plugininterface生成jar 拷貝到 plugin的libs 中

 

因爲後面還須要作插件調用宿主方法的jar,這邊咱們將這個class修更名字 區分一下:

因爲host中包含這個 module 因此放在libs下 一樣用 provided 引用,防止重複。

接下來就是考慮怎麼調用的問題了,咱們能夠這麼作,在DL的  DlPluginManager中增長一下方法:

 

將plugin類反射出來,因爲plugin類是繼承 plugininterface 接口的,因此經過反射出來的 PluginInterface,中的接口是能夠調用到插件的方法的!!!

 

plugin的代碼以下:

 

 

 

因爲dl是經過代理實現的 全部plugin中activity其實都是host中代理的activity,因此經過上面的方法實施獲取插件版本號是獲取不到的 ,由於代理的問題,獲取的context老是host的,獲取出來的版本號實際上是host的版本號。

 

 反射出來以後,咱們經過host 開始調用插件的方法(這個方法直接反射plugin的方法,不走plugin activity中生命週期):

 最後查看log日誌,的確是能夠調用到的:

宿主調用插件的方法,到此就結束了,想一想插件怎麼調用宿主的方法呢,其實套路是同樣的,咱們在host中新建一個 hostinterface module,

 

 注意hostinterface 提供給plugin 調用的包名,類名以及方法名都要一直,這樣plugin才能調用到host的 HostMethod.,  hostinterface 中的方法只是 host中方法的空殼,只是爲了讓plugin能找到host的具體實現方法:

 

 

具體實現仍是在host中:

 

一樣咱們把 hostinterface 的jar包拷貝出來丟到plugin中,修改jar包名稱以做區分 :

 

 

接下來DlPluginFist編譯成jar,丟到根目錄DynamicLoadHost中,啓動host拉起 plugin:

 

 invokeHostMethod 對應的代碼以下:

 

執行結果,查看log,調用成功:

這樣host, plugin的互調就到這裏結束了,下一章將 經過 dynamic-load-apk實現 host 顯示插件懸浮窗,相似九遊遊戲sdk,懸浮球。

 

本章代碼:

DlPluginHost.zip

DlFirstPlugin.zip

相關文章
相關標籤/搜索