在使用舊版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(不用重新編譯)或源碼(需要重新編譯)。重點是,沒必要為修復局部問題而全局編譯源碼