android 反编译出错 can not merge I and Z
在使用旧版dex2jar时,可能会出现以下错误:
java.lang.RuntimeException: can not merge I and Z
通过日志文件可以知道,这是com.googlecode.dex2jar.ir.TypeClass的merge问题。查看dex2jar源码后,可以确定这是int和boolean互相转换问题。在java里面,这两个类型是不能转换的。
问题可能来源:别人打包的代码并不一定使用java编写(kotlin)或者采用新的dx(d8)版本,这时编译的代码可能引入新的指令(不兼容java)。当然,有些是混淆目的(开源的话一般就不是啦)。
这个问题已经修复:
https://github.com/pxb1988/dex2jar/issues/10
一方面,我们可以重新打包dex2jar源码,另一方面只修改这个类。我是选择后者,处理起来比较方便。下载最新TypeClass,使用javac编译并替换掉旧的(依赖引用旧jar就可以)。
另外,TypeTransformer有时也会因为这个问题转换失败。源码是2018年后才修复的,所以这个类变动很大。要独立修改源码的话,请选择tags/2.0分支的源码(我的编译版本就是这个分支的代码,如果你的不是,请选择对应的版本)
这是修改后的dex-ir-2.0.jar
链接:https://pan.baidu.com/s/1tYKlC6czgNKk6b_zf1j6Yw
提取码:4djc
当然啦,为了避免出现新的问题,编译最新源码才是一劳永逸的方法。要是出现还没有修复的问题,可以按照上面的逻辑自己修改源码并编译这部分。
这里之所以谈这个问题,是因为很少人做这种“偷懒”的事情,但是比起其它方案确实方便。遇到同类型问题时,我很多时候都是修改class(不用重新编译)或源码(需要重新编译)。重点是,没必要为修复局部问题而全局编译源码