我们经常头疼项目的编译耗时长,每次编译都很久,大大的降低了我们的工作效率(提升了摸鱼时间)。为了解决这个问题,各种优化编译的方案层出不穷。先给大家看看效果:
这样可以大大的提升我们的开发效率,提升效能。
稍后补充实现原理,和实现过程。。。
JVMTI
我们要替换掉我们当前运行程序中的class,就需要使用到jvmti。那么什么是JVMTI呢? JVMTI全称Java Virtual Machine Tool Interface,也就是java虚拟机工具接口,这个是Java的一套由虚拟机直接提供的native接口。他能干什么呢?这么说吧,JVM提供的所有调试功能本质上就是他来提供的。他可以重新RedefineClasses,也就是我演示中的,修改了class使用jvmti直接redefineClass,可以对类进行重定义。 官方文档地址: JVMTI. 这个就是我们的核心方法。这样我们修改了某一个类,通过这样的接口,直接替换运行中的class。及时更新,而且不需要重启应用,不过也有局限性。 比如:
。
当然使用JVMTI还可以实现很多功能,比如获取内存、线程、类加载、gc等信息,还可以监控jvm的运行状态,实时监控jvm。安卓在8.0版本引入了JVMTI 1.2版本。比如我们使用的Android Studio的profiler就是使用jvmti来实现的。
我写了一个简单的jvmti的demo 稍后上传到git。
功能
既然有了可以动态修改类的办法,我们是否可以用修改后的类替换掉正在运行的程序中的类呢。答案是肯定的。但是jvmti是依赖于我们注册监听的事件.
稍后更新。。。