apktool打包遇到org.jf.util.ExceptionWithContext

有时我们接入sdk,使用打包工具合包时会出现类似如下错误:

Using Apktool 2.4.0\nI: Smaling smali folder into classes.dex...
Exception in thread "main" org.jf.util.ExceptionWithContext: Exception occurred while writing code_item for method Landroid/arch/lifecycle/Lifecycle$Event;->values()[Landroid/arch/lifecycle/Lifecycle$Event;
at org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:917)
at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:341)
at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:297)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:61)
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:36)
at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:419)
at brut.androlib.Androlib.buildSources(Androlib.java:350)
at brut.androlib.Androlib.build(Androlib.java:302)
at brut.androlib.Androlib.build(Androlib.java:269)\n\tat brut.apktool.Main.cmdBuild(Main.java:247)
at brut.apktool.Main.main(Main.java:79)
Caused by: org.jf.util.ExceptionWithContext: Error while writing instruction at code offset 0x2
at org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1190)\n\tat org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:913)
... 10 more
Caused by: org.jf.util.ExceptionWithContext: Unsigned short value out of range: 66354
at org.jf.dexlib2.writer.DexDataWriter.writeUshort(DexDataWriter.java:116)
at org.jf.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:356)
at org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1150)
... 11 more

我们可以看到有一句Unsigned short value out of range,这就是报错的原因:方法数超过了65536的限制。我们的解决方案也就有了:拆分出多个dex文件,让每个dex文件方法数少于65535就行。
解决思路:

1、在回编译之前, 先找出总共的函数数量,如果超出65536的限制,我们自动拆分出多个dex,我们采用google提供的android-support-multidex.jar。如果母包或者渠道SDK中不存在这个jar包,我们就要将这个jar包添加进来

2、在游戏或SDKApplication中的attachBaseContext ,调用一下MultiDex.install(this); 以便对多dex文件的支持。
3、apktool反编译之后,我们统一的代码格式为smali,我们需要将多余的smali文件,移到smali_classes2,smali_classes3…等等,目前最多支持5个,应该够用了。
4、因为程序入口是游戏或者SDKApplication,所以我们必须保证该Application等类和multidex这个jar包所有的文件在第一个classes.dex文件中,否则程序初始化就会找不到这个类。

参考原文链接:游戏接入SDK系列之org.jf.util.ExceptionWithContext: Unsigned short value out of range

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章