ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java代码变更怎么解决 热修复及调试如何实现

2019-09-23 17:02:11  阅读:911  来源: 互联网

标签:dex 文件 Java 修复 class 调试 加载


Java代码变更怎么解决?热修复及调试如何实现?对于Java语言来说,如果涉及代码变更,一般情况下会选择重新启动JVM来修复问题。然而重新启动意味着需要一些时间才能将异常修复,热修复的出现为实现秒级恢复故障创造了可能,接下来就给大家讲解一下。

 

Java代码变更怎么解决 热修复及调试如何实现

 

 

Java热修复

目前较火的热修复方案大致分为两派:阿里系:DeXposed、andfix:从底层二进制入手(C语言);腾讯系:tinker:从Java加载机制入手。今天主要讲解基于Java加载机制,来研究热修复的实现方法。

安卓的类加载器在加载一个类时会先从自身DexPathList对象中的Element数组中获取(Element[] dexElements)到对应的类,之后再加载。在for循环中,首先遍历出来的是dex文件,然后再是从dex文件中获取class,所以,我们只要让修复好的class打包成一个dex文件,放于Element数组的第一个元素,这样就能保证获取到的class是最新修复好的class。

热修复的实现步骤:

1、得到dex格式补丁。修复好有问题的Java文件(根据bug的实际情况修改代码即可);将Java文件编译成class文件;将class文件打包成dex文件(dx指令程序)。

2、加载dex格式补丁。

3、加载jar、apk、zip格式补丁。注意这类压缩包中必须放着一个dex文件,而且对名字有要求,必须是classes.dex。

Java-debug

Java-debug-tool提供了多个trouble-shot命令,但杀手级的命令就两个,methodTrace和redefineClass。

methodTrace命令,用于快速问题发现,可以做到不暂停JVM而获取到方法调试信息。基本格式:

mt -c -m

可选参数:-d -t -i -n -time -u等。

redefineClass命令,可以做到不重启JVM而进行类字节码替换,实现方法热修复。当使用mt命令定位到问题之后,修复了的代码如果需要快速上线,那么就可以使用该命令。命令的使用格式为:

rdf -p [className1:class1Path className1:class2Path]

findClass命令,它可以在目标JVM找到你需要的类,并且告诉你类的具体信息,比如类是否已经加载?如果加载,那么加载类的classLoader是哪一个等。这个命令可以允许你不输入类的全限定名,并可以允许你输入正则表达式去匹配类。

想成为高薪Java工程师,你需要理论与实战兼备,而良好的知识基础是你高效率学习、付诸实战的前提。如果你想更好的学习Java编程,可以选择专业的学习方式。

标签:dex,文件,Java,修复,class,调试,加载
来源: https://www.cnblogs.com/qianfengzz/p/11573316.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有