@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 を含む大規模なプロジェクトの場合、それはそれらを調べて、削除できる未使用のライブラリを見つけようとすることを意味します。