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

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