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 コードをコンパイルするたびに実行される 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 命令を定義するフォーマット クラスの 1 つにたどり着きます。あなたの場合、それは 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 に答える