zoukankan      html  css  js  c++  java
  • 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(不用重新编译)或源码(需要重新编译)。重点是,没必要为修复局部问题而全局编译源码。

  • 相关阅读:
    nginx负载均衡
    saltstack高效运维
    nginx入门与实战
    web service基础知识
    centos tomcat解压版安装
    centos yum 安装jdk1.7
    centos7安装opencv3.4.1(同样适用于最新版本4.2.0)
    正向代理与反向代理,正向代理与反向代理的应用
    MySQL日期 字符串 时间戳互转
    idea svn提交时,performing vcs refresh时间很长的解决办法
  • 原文地址:https://www.cnblogs.com/lianghe01/p/13906472.html
Copyright © 2011-2022 走看看