Android之ClassLoader和插件

本文详细介绍如何在Android中使用ClassLoader加载外部插件。通过生成特定格式的JAR包,并利用dex2jar工具将其转换为classes.dex,再通过DexClassLoader加载到Android应用中。文章提供了完整的步骤和代码示例,展示了插件的加载与运行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android之ClassLoader和插件


Android中的ClassLoader本质上跟JRE中的一样,但Android的字节码格式不一样,Android下的ClassLoader不能直接加载普通的jar包,需要使用dex2jar工具中的d2j-jar2dex.bat,  把jar转换为classes.dex,然后把classes.dex放到jar文件中作为ClassLoader的源数据;

1)我们先生成一个Android需要的JAR;
源码:
package test;

public class AnPluginDemo {
   public int getValue() {
      return 100;
   }
}
2)打包成jar;
3)使用dex2jar工具中的d2j-jar2dex.bat, 把jar转换为classes.dex;
4)把classes.dex放到一个新的jar中, AnPluginDemo.jar;
5)建立一个Android工程;
6)把AnPluginDemo.jar放到assets下;
7)加载插件并运行
void loadAndInvoke(String name) {
      try {
         File dir = getDir("plugin", Context.MODE_PRIVATE);

         byte[] bs = readDataFromAsserts("plugin/" + name);// 读取插件数据
         String path = new File(dir, name).getAbsolutePath();// 插件保存的位置
         Files.writeFile(path, bs);// 保存插件

         // 创建类加载器,把dex加载到虚拟机中
         DexClassLoader loader = new DexClassLoader(//
               path,//插件路径,可以用冒号分隔多个,  可以是jar(内有classes.dex)或apk格式
               dir.getAbsolutePath(),//优化后保存的目录
               null,//so文件位置
               this.getClass().getClassLoader()//父ClassLoader
         );

         Class<?> c = loader.loadClass("test/AnPluginDemo");// 加载需要使用的类
         Method m = c.getMethod("getValue");// 取得方法
         Object o = c.newInstance();// 创建对象
         Object r = m.invoke(o);// 调用方法
         showTipDialog("R:" + r);//显示执行结果
      } catch (Exception e) {
         e.printStackTrace();
         showTipDialog("R:" + e.getClass());
      }
   }

转载于:https://my.oschina.net/u/184090/blog/548820

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值