Meituan-Dianping / Robust

Robust is an Android HotFix solution with high compatibility and high stability. Robust can fix bugs immediately without a reboot.
Apache License 2.0
4.4k stars 806 forks source link

非bug技术请教贴-关于javassist支持kotlin的问题 #387

Closed Dwan-xie closed 4 years ago

Dwan-xie commented 4 years ago

我们有类似的插桩逻辑使用的是javassist,但在遇到使用kotlin编写的类时,发现无法对生成的class进行插桩和修改,并且修改后的类变成了空白。 想请教一下robust在使用中是如何对于kotlin进行支持的。 感谢大佬百忙之中的解答和关注。十分感谢!

weiyixiong commented 4 years ago

Robust的插桩从javaassist 改为Asm了.参考 AsmInsertImpl.java

Dwan-xie commented 4 years ago

Robust的插桩从javaassist 改为Asm了.参考 AsmInsertImpl.java

我看还保留了其他两个字节码类库的支持类,我以为是多个插桩方式都支持。

Dwan-xie commented 4 years ago

JavaAssistInsertImpl 这个类在实际工作中已经不用了吗?

weiyixiong commented 4 years ago

JavaAssistInsertImpl 这个类在实际工作中已经不用了吗?

不知道唉。应该还是可以使用的,不过我这里只用ASM了。这个库默认也是ASM。你说的修改过的类成了空白应该不太可能吧。在插桩后输出Class文件到文件夹下面看一下字节码。我之前遇到问题就是这么调试的

Dwan-xie commented 4 years ago

JavaAssistInsertImpl 这个类在实际工作中已经不用了吗?

不知道唉。应该还是可以使用的,不过我这里只用ASM了。这个库默认也是ASM。你说的修改过的类成了空白应该不太可能吧。在插桩后输出Class文件到文件夹下面看一下字节码。我之前遇到问题就是这么调试的

在Aop完成后我查看过aop后的类代码只剩了一个类名,然后头部有一个注释 // IntelliJ API Decompiler stub source generated from a class file // Implementation of methods is not available 跟随Aop的过程通过log查看,到insertAfter之前所有的字符串拼接(即方法的解析和构建插桩),都正常生成了。但最后没有插回到原文件里。

在aop

weiyixiong commented 4 years ago

JavaAssistInsertImpl 这个类在实际工作中已经不用了吗?

不知道唉。应该还是可以使用的,不过我这里只用ASM了。这个库默认也是ASM。你说的修改过的类成了空白应该不太可能吧。在插桩后输出Class文件到文件夹下面看一下字节码。我之前遇到问题就是这么调试的

在Aop完成后我查看过aop后的类代码只剩了一个类名,然后头部有一个注释 // IntelliJ API Decompiler stub source generated from a class file // Implementation of methods is not available 跟随Aop的过程通过log查看,到insertAfter之前所有的字符串拼接(即方法的解析和构建插桩),都正常生成了。但最后没有插回到原文件里。

在aop

你用jd-gui这个软件看字节码比较准确。ide的反编译有时候不显示 。而且混淆过程可能把你的插入的代码优化掉。最好加一下混淆白名单。