0

尝试从 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

这到底是什么意思?

谢谢

4

2 回答 2

1

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

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

您可以使用 try 摆脱不需要的引用(手动从项目中删除不需要的东西),或者使用 Proguard,它可以自动为您完成此操作。

于 2012-05-16T19:08:08.490 回答
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 的大型项目,这意味着遍历它们并尝试找到可以删除的未使用库。

于 2012-09-14T04:53:22.417 回答