【Android】类加载器热修复-随记(二)
- 创业
- 2025-09-17 02:03:02

1. 背景
在【Android】类加载器&热修复-随记一文中了解了类加载,要完成完整的热修复过程,我们需要构建出差量jar包。而这构建差量包分为两个步骤:
原包,注解解析和插桩; 变更后,差量包构建;在这两步过程中会涉及到较多的字节码操作,这里我们需要了解下。我们都听过ASM的大名,但门槛较高,这里选择Javaassist来入门。 另在Robust的构建插件中也可看见所使用的是Javaassist这个库:
2. 要点官方文档: .javassist.org/ 学习文档:http:// .javassist.org/tutorial/tutorial.html?spm=395e44f7.4d3ad9aa.0.0.13e45fb4COpEYh
主旨是为了学习Robust,故这里的javaassist版本和该项目保持一致。即:
implementation 'org.javassist:javassist:3.20.0-GA'下面章节将围绕这个版本进行学习。字节码操作大致分为增、删、改。网上查阅到了这篇文章:javassist使用全解析 ,写的挺详细的。这里我们就了解两个能力:
新增一个类; 在方法前,插装; 2.1 新增一个类到apk中在app构建过程中,如何通过javaassist来做到满足某个条件就新增一个类到最终apk中? 可以通过注册一个自定义transfrom:
AppExtension appExtension = project.getExtensions().getByType(AppExtension.class); appExtension.registerTransform(new JavaAssistTransform(project));在这个transfrom中处理class文件。比如按照上面博客教程生成一个class:
// "com.mengfou.sample.javaassist.AClass" private byte[] generateTestClass(ClassBuffer classBuffer) { try { ClassPool pool = ClassPool.getDefault(); CtClass ctClass = pool.makeClass(classBuffer.getClassName()); CtField paramField = new CtField(pool.get("java.lang.String"), "value", ctClass); paramField.setModifiers(Modifier.PRIVATE); ctClass.addField(paramField, CtField.Initializer.constant("1")); CtConstructor cons = new CtConstructor(new CtClass[]{ pool.get("java.lang.String")}, ctClass); cons.setBody("{$0.value=$1;}"); ctClass.addConstructor(cons); CtMethod calculate = new CtMethod(pool.get("java.lang.String"), "calculate", new CtClass[]{ }, ctClass); calculate.setModifiers(Modifier.PRIVATE); calculate.setBody("{return $0.value + \"_hello\";}"); ctClass.addMethod(calculate); File parentPath = new File(project.getBuildDir(), "gen【Android】类加载器热修复-随记(二)由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【Android】类加载器热修复-随记(二)”