Android、Eclipse:什么是;“无扩展操作码”;误差平均值?

Android、Eclipse:什么是;“无扩展操作码”;误差平均值?,android,eclipse,opcode,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

尝试从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
Dx写入输出时出错:00412995 ExtractorBase.java没有扩展操作码:101@0006: 
调用直接v0:N0001Lorg/xml/sax/InputSource;,v2:Ljava/io/Reader;,
org.xml.sax.InputSource.:(Ljava/io/Reader;)V
这到底意味着什么


Thx

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

如果您有一个特别大的项目,您可能会遇到这个限制


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

正如@Booger所提到的,android应用程序中可以声明的字段、方法和类的数量有一个最大限制。事实上,如果您查看dalivk字节码指令本身,您可以看到id的最大值为64k

错误消息来自android dx工具,每当编译android代码时都会执行该工具。从中,以下是引发该异常的代码:

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指令的格式类。在你的情况下,它将是35C/3rc格式。在这里,有一个检查id是否适合短整数:

public boolean isCompatible(DalvInsn insn) {
    ....
    CstInsn ci = (CstInsn) insn;
    int cpi = ci.getIndex();
    if (! unsignedFitsInShort(cpi)) {
        return false;
    }
目前正在开发新的扩展字节码,将来可以容纳更大的ID,但它们不可用


同时,除了缩减方法的大小之外,您没有什么可以做的。对于包含多个JAR的大型项目,这意味着要仔细检查它们,并尝试找到可以删除的未使用的库。

这就是Logcat中的全部内容?什么?你不显示一些代码吗?嗯。。。我试着在桌面上运行相同的第三方代码,使用的外部jar和第三方代码比我在Android项目中使用的要多,效果很好。