我把apk文件用apktool反编译后得到smali,smali_classes2,smali_classes3,smali_classes4..........
然后手工修改包里的smali文件,增加了些内容进去,尝试再打包回apk文件时遇到错误.上网查了一下原因.是我添加了东西,导致Unsignedshortvalueoutofrange:65536。每个包长度超限了.
Exceptioninthread"main"org.jf.util.ExceptionWithContext:Exceptionoccurredwhilewritingcode_itemformethodLcom/google/gson/internal/b$b;-><init>(Ljava/lang/reflect/Type;Ljava/lang/reflect/Type;[Ljava/lang/reflect/Type;)V
atorg.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:1046)
atorg.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:345)
atorg.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:300)
atbrut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:61)
atbrut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:36)
atbrut.androlib.Androlib.buildSourcesSmali(Androlib.java:420)
atbrut.androlib.Androlib.buildSources(Androlib.java:351)
atbrut.androlib.Androlib.build(Androlib.java:303)
atbrut.androlib.Androlib.build(Androlib.java:270)
atbrut.apktool.Main.cmdBuild(Main.java:259)
atbrut.apktool.Main.main(Main.java:85)
Causedby:org.jf.util.ExceptionWithContext:Errorwhilewritinginstructionatcodeoffset0x39
atorg.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1319)
atorg.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:1042)
...10more
Causedby:org.jf.util.ExceptionWithContext:Unsignedshortvalueoutofrange:65536
atorg.jf.dexlib2.writer.DexDataWriter.writeUshort(DexDataWriter.java:116)
atorg.jf.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:356)
atorg.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1279)
...11more
为此问题,特意论坛上问了一下结果没人回答
网上找了个笨方法实现. 有位大神用python实现了, 命令如下.
解包
java -jar apktool_2.5.0.jar d D:\apk反编译\base.apk -f -r -s -o D:\apk反编译\base12301
#apktool反编译 不解源代码包 生成dev文件
python smali_decompile.py -d D:\apk反编译\base12301 -o D:\apk反编译\base12301 -m one
#运行python命令,将将原dex文件解出,整合到class目录
----------------------------------------------------------------
修改class目录里你想要修改的smali文件,例如添加类,
----------------------------------------------------------------
python smali_split.py -a D:\apk反编译\base12301\classes -o D:\apk反编译\base12301
#将class文件再次分开打包成dex文件. 可以见到产生的dev数量比原来要多.
#将新产生的dev文件拷贝出来取代原来的dev
生成包
java -jar apktool_2.5.0.jar b D:\apk反编译\base12301 -o D:\apk反编译\base12301.apk
#编译成apk文件
签名
java -jar signapk.jar testkey.x509.pem testkey.pk8 D:\apk反编译\base12301.apk D:\apk反编译\base12301_final.apk
#对apk文件进行签名
本文所需所有工具下载地址
/download/konglai/13986088
用apktool反编译 修改添加smali文 再打包apk遇到的64k问题的解决方法 Unsigned short value out of range: 65536