Android之ClassLoader和插件

Android之ClassLoader和插件

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

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

1package test; 2 3public class AnPluginDemo { 4 public int getValue() { 5 return 100; 6 } 7}

2)打包成jar;
3)使用dex2jar工具中的d2j-jar2dex.bat, 把jar转换为classes.dex;
4)把classes.dex放到一个新的jar中, AnPluginDemo.jar;
5)建立一个Android工程;
6)把AnPluginDemo.jar放到assets下;
7)加载插件并运行

1void loadAndInvoke(String name) { 2 try { 3 File dir = getDir("plugin", Context.MODE_PRIVATE); 4 5 byte[] bs = readDataFromAsserts("plugin/" + name);// 读取插件数据 6 String path = new File(dir, name).getAbsolutePath();// 插件保存的位置 7 Files.writeFile(path, bs);// 保存插件 8 9 // 创建类加载器,把dex加载到虚拟机中 10 DexClassLoader loader = new DexClassLoader(// 11 path,//插件路径,可以用冒号分隔多个, 可以是jar(内有classes.dex)或apk格式 12 dir.getAbsolutePath(),//优化后保存的目录 13 null,//so文件位置 14 this.getClass().getClassLoader()//父ClassLoader 15 ); 16 17 Class<?> c = loader.loadClass("test/AnPluginDemo");// 加载需要使用的类 18 Method m = c.getMethod("getValue");// 取得方法 19 Object o = c.newInstance();// 创建对象 20 Object r = m.invoke(o);// 调用方法 21 showTipDialog("R:" + r);//显示执行结果 22 } catch (Exception e) { 23 e.printStackTrace(); 24 showTipDialog("R:" + e.getClass()); 25 } 26 }
点赞
收藏

评论区

加载中...

相关推荐

Android包管理机制(一)PackageInstaller的初始化

Android框架层Android包管理机制Android框架层本文首发于微信公众号「刘望舒」前言包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一。包指的是Apk、jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一个机制来进行包的加载、解析、管理等操作,这就是包管理机制。包管理

Android动态加载基础 ClassLoader工作机制

类加载器ClassLoader早期使用过Eclipse等Java编写的软件的同学可能比较熟悉,Eclipse可以加载许多第三方的插件(或者叫扩展),这就是动态加载。这些插件大多是一些Jar包,而使用插件其实就是动态加载Jar包里的Class进行工作。这其实非常好理解,Java代码都是写在Class里面的,程序运行在虚拟机上

ClassLoader解惑

一、什么是Classloader    一个Java程序要想运行起来,首先需要经过编译生成.class文件,然后创建一个运行环境(jvm)来加载字节码文件到内存运行,而.class文件是怎样被加载中jvm中的就是JavaClassloader所做的事情。    那么.class文件什么时候会被类加载器加载到j

SpringBoot使用RedisTemplate操作Redis时,key值出现 -xac-xed-x00-x05t-x00-tb

原因分析原因与RedisTemplate源码中的默认序列化方式有关defaultSerializernewJdkSerializationRedisSerializer(classLoader!null?classLoader:this.getClass().getClassLoader()

Android 插件化原理解析——Activity生命周期管理

在Java平台要做到动态运行模块、热插拔可以使用ClassLoader技术进行动态类加载,比如广泛使用的OSGi技术。在Android上当然也可以使用动态加载技术,但是仅仅把类加载进来就足够了吗?Activity,Service等组件是有生命周期的,它们统一由系统服务AMS管理;使用ClassLoader可以从插件中创建Activit

Eclipse Spring Boot实现热部署

spring为开发者提供了一个名为springbootdevtools的模块来使SpringBoot应用支持热部署,提高开发者的开发效率,无需手动重启SpringBoot应用。devtools的原理深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更