Android,Eclipse:“无扩展操作码”错误是什么意思?

时间:2012-05-16 18:55:46

标签: android eclipse opcode

尝试从Eclipse调试Android应用程序,我收到以下消息

Dx trouble writing output: No expanded opcode for 00412995 ExtractorBase.java:101@0006: 
invoke-direct v0:N0001Lorg/xml/sax/InputSource;, v2:Ljava/io/Reader;,
org.xml.sax.InputSource.<init>:(Ljava/io/Reader;)V

这是什么意思?

THX

2 个答案:

答案 0 :(得分:1)

看起来你可能有更多的字段引用或方法(实际上,有64k的硬限制)。

如果你有一个特别大的项目,你可能会遇到这个约束。

您可以使用try来删除不需要的引用(手动删除项目中不需要的内容),或者使用Proguard,它可以自动为您执行此操作。

答案 1 :(得分:0)

正如@Booger已经提到的,你可以在android应用程序中声明的字段,方法和类的数量有一个最大限制。实际上,如果你查看dalivk字节代码指令本身,你会发现id最多有64k。

错误消息来自android dx工具,只要你编译你的android代码就会执行它。从android open source开始,这是抛出异常的代码:

private Dop findExpandedOpcodeForInsn(DalvInsn insn) {
    Dop result = findOpcodeForInsn(insn.getLowRegVersion(), insn.getOpcode());
    if (result == null) {
        throw new DexException("No expanded opcode for " + insn);
    }
    return result;
}

如果深入研究findOpCodeForInsn函数调用树,您将最终得到一个定义dalvik指令的格式类。在你的情况下,它将是Form35c / 3rc。在这里,检查id是否适合短整数:

public boolean isCompatible(DalvInsn insn) {
    ....
    CstInsn ci = (CstInsn) insn;
    int cpi = ci.getIndex();
    if (! unsignedFitsInShort(cpi)) {
        return false;
    }

正在开发新的扩展字节码,并且将来可以容纳更大的ID,但它们不可用。

与此同时,除了缩小方法的大小之外别无他法。对于包含多个jar的大型项目,这意味着要浏览它们并尝试查找可以删除的未使用的库。