gpt4 book ai didi

java - 继承的方法是否计入 Android 中的 Dex 方法限制?

转载 作者:IT老高 更新时间:2023-10-28 20:23:43 24 4
gpt4 key购买 nike

Dalvik 对单个 .dex 文件中的方法数量有这个众所周知的限制(大约 65,536 个)。我的问题是继承(但不是覆盖)方法是否计入此限制。

为了具体化,假设我有:

public class Foo {
public int foo() {
return 0;
}
}

public class A extends Foo { }
public class B extends Foo { }
public class C extends Foo { }

出于 65,536 种方法限制的目的,这算作添加一种方法还是添加 4 种方法? (或者,我想,按照逻辑结论,这算作 1 个方法还是 52 个方法,考虑到 java.lang.Object 也带来了 12 个方法)。

作为背景,我有大量具有一些共性的生成类,而且我也遇到了方法限制,所以我想知道是否值得尝试将其中的一些抽象出来进入类层次结构以争取一些时间。

最佳答案

继承但未被覆盖的方法仅在被引用(调用)时才计入方法限制。

在您的示例中,假设您有以下代码

public class main {
public static void main(String[] args) {
Foo foo = new A();
foo.foo();
}
}

在这种情况下,您指的是 Foo.foo(),由于显式定义,它已经有一个引用。假设这 5 个类是 dex 文件中唯一的类,那么您总共将有 2 个方法引用*。一个用于 main.main(String[]),一个用于 Foo.foo()。

相反,假设您有以下代码

public class main {
public static void main(String[] args) {
A a = new A();
a.foo();

B b = new B();
b.foo();

C c = new C();
c.foo();
}
}

在这种情况下,由于实际引用了每个子类的 foo 方法,它们将计入您的方法限制。您的 dex 文件将包含 5 个方法引用*。

  • main.main(String[])
  • Foo.foo()
  • A.foo()
  • B.foo()
  • C.foo()

* 这个计数不是很准确,它没有考虑在幕后添加到每个类的构造函数方法。每个构造函数都调用其父类(super class)的构造函数,因此我们还有一个对 Object 构造函数的引用,每种情况下总共有 6 个额外的方法引用,分别给出了 8 个和 11 个方法计数。


如果有疑问,您可以尝试各种场景并使用 baksmali 的原始转储功能来查看 dex 文件中的方法列表实际包含的内容。

例如

javac *.java
dx --dex --output=temp.dex *.class
baksmali -N -D temp.dump temp.dex

然后,在转储文件中,查找“method_id_item 部分”。这是 64k 限制适用的方法引用列表。

关于java - 继承的方法是否计入 Android 中的 Dex 方法限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17730815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com