Android中的inheritance方法是否违反Dex方法的限制?

Dalvik在一个.dex文件(其中大约65,536个文件)中可以使用的方法数量有这个众所周知的限制。 我的问题是,inheritance(但不是重写)方法是否违反这个限制。

为了使事情具体化,假设我有:

 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? (或者,我想,要把事情的逻辑结论,考虑到java.lang.Object带来了12个方法,这是否算作1方法或52方法)。

作为背景,我得到了一些具有一定共性的生成类,而且我也碰到了方法的限制,所以我想知道是否值得将某些类抽象成一个类以便购买一些时间。

Solutions Collecting From Web of "Android中的inheritance方法是否违反Dex方法的限制?"

如果被引用(调用),则inheritance但未覆盖的方法仅计算方法限制。

在你的例子中,假设你有下面的一段代码

 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()

* 这个计数不是很准确,它没有考虑在幕后添加到每个类的构造函数方法。 每个构造函数调用它的超类的构造函数,所以我们也有一个Object构造函数的引用,每种情况下总共有6个额外的方法引用,分别给出8和11的方法数。


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

例如

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

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