新建项目 DlPluginHost,下载dynamic-load-apk源码

1.将dynamic-load-apk 文件夹中的lib做为module导入到DlPlginHost

2.导入到PluginHost后,PluginHost引用lib,项目文件目录如下:

3.新建插件项目DlPluginFirst,将dynamic-load-apk下的lib模块编译生成的jar,丢到插件的libs目录下:

修改插件的 gradle 文件:

注意这里用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

dynamic-load-apk 插件与宿主方法互调的更多相关文章

  1. Xcode7使用插件的简单方法&&以及怎样下载到更早版本的Xcode

    Xcode7自2015年9上架以来也有段时间了, 使用Xcode7以及Xcode7.1\Xcode7.2的小伙伴会发现像VVDocumenter-Xcode\KSImageNamed-Xcode\HO ...

  2. 图片懒加载插件lazyload使用方法

    图片懒加载插件lazyload使用方法 一.如何使用: Lazy Load 依赖于 jQuery.引入文件 <script type="text/javascript" sr ...

  3. Android 换肤功能的实现(Apk插件方式)

    一.概述 由于Android 没有提供一套统一的换肤机制,我猜可能是因为国外更注重功能和体验的原因 所以国内如果要做一个漂亮的换肤方案,需要自己去实现. 目前换肤的方法大概有三种方案: (1)把皮肤资 ...

  4. Unreal: Dynamic load map from Pak file

    Unreal: Dynamic load map from Pak file 目标:在程序运行时加载自定义 Pak 文件,并打开指定关卡,显示其中的完整 map 内容 Unreal 的 Pak 文件内 ...

  5. notepad++ 编辑xml的插件和使用方法

    notepad++ 编辑xml的插件和使用方法.mark http://blog.csdn.net/wangnan537/article/details/48712233

  6. UploadifyAPI-上传插件属性和方法介绍

    上一篇文章简单的介绍了Uploadify上传插件的使用.但是对于常用的属性和方法并没有说明.授人以鱼不如授人以渔,我决定将常用的属性列举出来,供大伙参考参考.           Uploadify属 ...

  7. eclipse安装插件的各种方法

    做为当下最流行的开源IDE之一,Eclipse的一大优势就在于其无数优秀的插件.一个好的插件可以大大的提高我们的工作效率,学习如何安装Eclipse插件自然也是必修课了.下面介绍Eclipse插件的安 ...

  8. 代码高亮插件Codemirror使用方法及下载

    代码高亮插件Codemirror使用方法及下载 - 老男孩的日志 - 网易博客 代码高亮插件Codemirror使用方法及下载   2013-10-31 16:51:29|  分类: 默认分类 |   ...

  9. 国内apk加固的破解方法

    国内apk加固的破解方法 By Bob Pan 国内的apk加固技术都使用了将原有的dex隐藏, 在运行时解压, 并且通过修改app的类加载器的方式实现加固. 参考: AndoridAPK反逆向解决方 ...

随机推荐

  1. Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]

    1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...

  2. javaWeb学习总结(8)- jsp指令(3)

    一.JSP指令简介 一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定 ...

  3. Easy machine learning pipelines with pipelearner: intro and call for contributors

    @drsimonj here to introduce pipelearner – a package I'm developing to make it easy to create machine ...

  4. zepto源码分析系列

    如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Ze ...

  5. OVS + dpdk 安装与实验环境配置

    ***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装       0:安装必要的工具            make            gcc           ...

  6. ASP.NET Web API 自定义 HttpParameterBinding

    背景 问题的起因是这样的.群里面一个哥们儿发现在使用 ASP.NET WebAPI 时,不能在同一个方法签名中使用多次 FromBodyAttribute 这个 Attribute .正好我也在用 W ...

  7. JS 使用 splice() 对数组去重

    一 问题 有如下 js 数组 connect_clients,需要在去掉所有元素中 user_id, goods_id 这两者的值都相同的元素. [ { id: 'eff040fb-92bc-4f24 ...

  8. 如何用VS进行程序调试

    VS是一个强大的IDE,如果你现在只会简单地用它查看一下执行效果,那就太大材小用了. 1. CRT函数报错 首先来说说最常见的一个编译错误.微信里常常收到这个错误的截图提问. CRT(C Runtim ...

  9. cpp(第十四章)

    1.类的静态成员变量.静态常整型(static const int)变量可以直接在类声明中初始化,静态常变量(static const )需要在类定义文件中初始化, 常变量(const )则在构造函数 ...

  10. 渗透测试工具Nmap从初级到高级

    Nmap是一款网络扫描和主机检测的非常有用的工具. Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器.它可以适用于winodws,linux,mac等操作系统.Nmap ...