构建DEX文件报错:Smali代码中无符号短整型值超出范围
APK构建时遭遇DEX写入错误(Smali代码相关)
在APK构建过程中遇到DEX文件相关问题,该问题直接关联Smali代码。涉及的values()方法编译时触发数值越界错误,已排查语法问题、单独编译文件/方法仍无法解决。
涉事Smali方法代码
.method public static values()[Landroidx/annotation/RequiresOptIn$Level; .locals 1 sget-object v0, Landroidx/annotation/RequiresOptIn$Level;->$VALUES:[Landroidx/annotation/RequiresOptIn$Level; invoke-virtual {v0}, [Ljava/lang/Object;->clone()Ljava/lang/Object; move-result-object v0 check-cast v0, [Landroidx/annotation/RequiresOptIn$Level; return-object v0 .end method
报错信息
Exception in thread "main" com.android.tools.smali.util.ExceptionWithContext: Exception occurred while writing code_item for method Landroidx/annotation/RequiresOptIn$Level;->values()[Landroidx/annotation/RequiresOptIn$Level; at com.android.tools.smali.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:1119) at com.android.tools.smali.dexlib2.writer.DexWriter.writeTo(DexWriter.java:415) at com.android.tools.smali.dexlib2.writer.DexWriter.writeTo(DexWriter.java:370) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:56) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:35) at brut.androlib.ApkBuilder.buildSourcesSmali(ApkBuilder.java:211) at brut.androlib.ApkBuilder.buildNonDefaultSources(ApkBuilder.java:159) at brut.androlib.ApkBuilder.build(ApkBuilder.java:100) at brut.apktool.Main.cmdBuild(Main.java:296) at brut.apktool.Main.main(Main.java:95) Caused by: com.android.tools.smali.util.ExceptionWithContext: Error while writing instruction at code offset 0x2 at com.android.tools.smali.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1392) at com.android.tools.smali.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:1115) ... 9 more Caused by: com.android.tools.smali.util.ExceptionWithContext: Unsigned short value out of range: 66291 at com.android.tools.smali.dexlib2.writer.DexDataWriter.writeUshort(DexWriter.java:115) at com.android.tools.smali.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:397) at com.android.tools.smali.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1352) ... 10 more
已做排查尝试
- 确认该Smali方法无语法错误或逻辑问题
- 尝试单独编译该Smali文件及目标方法,问题依旧
可能的解决方向
处理常量池索引溢出
报错中的Unsigned short value out of range: 66291说明DEX文件中某个需要用无符号短整型(最大65535)存储的索引值超限,大概率是字符串/类型/方法常量池的索引溢出。- 若采用多DEX构建,将该类的Smali代码拆分到其他DEX文件中
- 清理项目中无用的常量、类或方法,缩减常量池大小
修正Smali指令引用
修改invoke-virtual指令,直接使用数组类型的clone()方法而非Object类的,避免额外的常量引用:invoke-virtual {v0}, [Landroidx/annotation/RequiresOptIn$Level;->clone()Ljava/lang/Object;更新Apktool版本
旧版Apktool在处理高版本Android SDK注解类时可能存在常量池处理bug,尝试更新至最新稳定版本后重新编译。检查注解类完整性
确认RequiresOptIn$Level枚举类的所有Smali文件完整,静态数组$VALUES的定义无缺失或错误。
内容的提问来源于stack exchange,提问作者Duxii
相关产品推荐
相关产品推荐

