1、android 类加载器(DexClassLoader的用法),调用其他apk的类中的方法:

方式一:

   

然后在Host中利用下面的方式调用

PackageManager pm = getPackageManager();List<ResolveInfo> resolveInfos =  pm.queryIntentActivities(new Intent("com.haili.Plugin.client") , 0);ResolveInfo resolveInfo = resolveInfos.get(0);ActivityInfo activityInfo =resolveInfo.activityInfo;String packageName = activityInfo.packageName;String dexPath = activityInfo.applicationInfo.sourceDir; // 目标类所在的apk或jar所在的路径,加载器将在此目录寻找目标类String dexOutputDir = getApplicationInfo().dataDir; // dex包含在apk或者jar文件中,因此在装载目标类的时候需要先解压,此路径就是解压的路径String libPath = activityInfo.applicationInfo.nativeLibraryDir;  // 目标使用的一些C、C++库的路径
DexClassLoader dexClassLoader = new DexClassLoader(dexPath , dexOutputDir , libPath ,this.getClass().getClassLoader());//利用java反射原理的方式来调用try {Class clazz = dexClassLoader.loadClass(packageName+"."+ "Plugin");Object object =  clazz.newInstance();Method method = clazz.getMethod("function" , Integer.TYPE ,Integer.TYPE);int addResult = (int) method.invoke(object ,12 ,34);}catch (Exception e){}

方式二:利用插件的方式来实现:

  1 、在host中定义comm的接口如下;然后生成外部jar包,然后必须以Library的方式添加到Plugin中,若以“外部jar方式”添加,jar会作为程序的一部分打包到最终文件中,导致Plugin和Host中有2份Comm(包名和类名相同),导致冲突,发生:Class ref in pre-verified class resolved to unexpected implementation错误。

 public interface Comm
{public int function(int a , int b);
}

  2、将Plugin的class的代码修改如下:

public class Plugin implements Comm
{...  public int function(int a ,int b){return a + b ;  }
}

  3 、 在Host调用的时候

 PackageManager pm = getPackageManager();List<ResolveInfo> resolveInfos =  pm.queryIntentActivities(new Intent("com.haili.Plugin.client") , 0);ResolveInfo resolveInfo = resolveInfos.get(0);ActivityInfo activityInfo =resolveInfo.activityInfo;String packageName = activityInfo.packageName;String dexPath = activityInfo.applicationInfo.sourceDir; // 目标类所在的apk或jar所在的路径,加载器将在此目录寻找目标类String dexOutputDir = getApplicationInfo().dataDir; // dex包含在apk或者jar文件中,因此在装载目标类的时候需要先解压,此路径就是解压的路径String libPath = activityInfo.applicationInfo.nativeLibraryDir;  // 目标使用的一些C、C++库的路径
DexClassLoader dexClassLoader = new DexClassLoader(dexPath , dexOutputDir , libPath ,this.getClass().getClassLoader());//利用插件的方式调用try{Class clazz = dexClassLoader.loadClass(packageName+"."+ "Plugin");Comm comm = (Comm)clazz.newInstance();int addResult = comm.function(12 , 34);}catch (Exception exception){}

二、插件架构

  所谓插件,就是由宿主车内光线调用插件,如浏览器的插件,浏览器就是Host,调用的插件Plugin:

  由上面利用插件架构的方式实现可以得出插件的基本概率和特点:

  

主要结构:

  1、在Host中定义相关接口Comm,生成jar包以library的方式导入到Plugin中。

  2、Plugin中要实现插件功能相关的类中实现接口Comm.

  3、在Host 中用上面的方法加载plugin的类,并调用Plugin中实现的方法。

 Note:为了知晓有哪些插件,Host中可以为每一个插件定义一个特定的action字段,每个插件定义一个activity,并在插件Plugin中AndroidMainfest.xml清单文件定义一个空的activity,action设置为Host中插件的字段:这样Host就可以根据字段查询相应的插件从而查找相应的类和方法。

插件和宿主的兼容性,插件的res/values/string中一般都会定义一些版本号以及一些名称信息,在Host中可以通过下面方法获取:

  

转载于:https://www.cnblogs.com/bokeofzp/p/6667637.html

android 类加载器 DexClassLoader的用法,以及引出的插件架构相关推荐

  1. android类加载器ClassLoader

    前言: 我们开发android写的都是java代码,java代码都是写在class里面,虚拟机需要把class文件加载进来才能创建实例对象并工作,完成类加载的角色就是ClassLoader.那这个Cl ...

  2. Java类加载器及Android类加载器基础

    引子 Android插件化与热更新技术日渐成熟,当你研究这些技术时会发现类加载器在其中占据重要地位.Java语言天生就有灵活性.动态性,支持运行期间动态组装程序,而这一切的基础就是类加载器. Java ...

  3. 【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )

    文章目录 一.Android 类加载器 1.ClassLoader 抽象类 2.BootClassLoader 3.BaseDexClassLoader 4.PathClassLoader 5.Dex ...

  4. Android中插件开发篇之----类加载器

    前言 关于插件,已经在各大平台上出现过很多,eclipse插件.chrome插件.3dmax插件,所有这些插件大概都为了在一个主程序中实现比较通用的功能,把业务相关或者让可以让用户自定义扩展的功能不附 ...

  5. Android Studio第4部分:调试工具和生产力插件

    Android Studio提供了丰富的内置开发工具,以及更丰富的插件生态系统.本系列的前三篇文章重点介绍如何使用Android Studio 安装和设置以及编码和运行一个简单的移动应用程序.现在,您 ...

  6. 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | ART 虚拟机下 DexClassLoader 类加载器脱壳点总结 )

    文章目录 一.ART 虚拟机下 DexClassLoader 类加载器脱壳点总结 1.file_magic.cc#OpenAndReadMagic 函数 2.dex_file.cc#DexFile:: ...

  7. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )

    文章目录 一.使用 DexClassLoader 获取组件类失败报错 二.失败原因分析 一.使用 DexClassLoader 获取组件类失败报错 在上一篇博客 [Android 逆向]启动 DEX ...

  8. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  9. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 )

    文章目录 一.DexClassLoader 构造函数简介 二.准备 DEX 文件 一.DexClassLoader 构造函数简介 DexClassLoader 构造函数如下 : /*** 创建一个{@ ...

最新文章

  1. 惠普企业第三财季净利润23亿美元 同比增长914%
  2. Effective Objective-C [下]
  3. [zz]淘宝子团关于kvm 调优的分享
  4. 记录java在后台运行命令
  5. How to change the status of Prepayment invoice
  6. spotify 数据分析_没有数据? 没问题! 如何从Wikipedia和Spotify收集重金属数据
  7. 【LeetCode笔记】213. 打家劫舍II(Java、动态规划)
  8. 打印时候复选框勾选不见了_checkbox 选中未显示对号勾选的问题
  9. AI + 3D!英伟达开源3D深度学习框架Kaolin
  10. 编辑服务器上的文件,Sublime Text编辑远程Linux服务器上的文件
  11. ie6/ie7/firefox/dispaly:inline-block:兼容性
  12. Support Vector Machines
  13. 如何c51和mdk共存兼容_解决KeilMDK和KeilC51的兼容性——如何只用一个keil软件既可编译51核又可编译ARM核...
  14. 程序员数学(23)–图形的旋转与中心对称
  15. lua 利用os.data和os.time实现运营活动在客户端跨时区换算服务端所在时区时间戳
  16. C++ 计算球体体积
  17. 阿迪达斯进博会展示首款碳足迹低于3千克运动鞋;霍尼韦尔携30余项产品和解决方案亮相进博会 | 美通社头条...
  18. 基础算法-支持向量机
  19. IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required
  20. 综合素质计算机考点,教师资格综合素质考前必背知识点:基本能力

热门文章

  1. python编程视频-【科研资源03】最全Python编程全套系统视频学习教程
  2. python怎么读取列表-python读入列表
  3. python北京理工大学推荐的书-2020最新的学Python编程的五本必读好书
  4. python中国大学排名爬虫写明详细步骤-python中国大学排名爬虫
  5. python画横条形图-用matplotlib画条形图(bar)
  6. python语言入门u-Python语言十分钟快速入门
  7. python turtle画彩虹-python绘制彩虹图
  8. python 科学计算基础教程电子版-自学Python 编程基础、科学计算及数据分析
  9. python怎么学最快-怎么样快速高效学习Python
  10. python画笑脸图案-如何让这些代码中的一个在窗口中绘制不同大小的笑脸?