正如@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 的大型项目,这意味着遍历它们并尝试找到可以删除的未使用库。