2013-07-18 5 views
25

Dalvikには、単一の.dexファイル(約65,536個)に含めることができるメソッドの数に関するこのよく知られた制限があります。私の質問は、継承された(オーバーライドされていない)メソッドがこの制限値に当たるかどうかです。継承されたメソッドは、Androidの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 { } 

は、一つの方法を追加、または4を追加すると、このカウントしていますか? (あるいは、私は、物事を論理的に結論づけるために、java.lang.Objectが12のメソッドを持っていることを考慮すると、1つのメソッドまたは52のメソッドとしてカウントします)。

背景として、いくつかの共通性を持つ生成されたクラスは自明ではありませんが、メソッドの限界値にもぶつかります。そのため、それらのいくつかを抽象化することは価値がありますか?いくつかの時間を購入するために、クラス階層に分かれています。

+1

メソッドの可視性を変更することができるので、それらのすべてを数える必要があるとは思わないでしょうか? [dex形式についてはこちらを参照](http://www.retrodev.com/android/dexformat.html)。 –

+2

retrodevリンクは、dexファイル形式のプレリリースバージョンの悲惨な時代遅れのリバースエンジニアリングです。より信頼できる最新の情報源については、をご覧ください。 – danfuzz

+0

404 on dex-format.html –

答えて

15

継承されていてもオーバーライドされないメソッドは、それが参照される(呼び出される)場合に限り、メソッドの制限に対してカウントされます。あなたの例では

、あなたがこの場合、コード

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

の以下の部分を持っているとしましょう、あなたはすでに明示的な定義のために参照を、持っているFoo.foo()、を参照しています。これらの5つのクラスがdexファイル内の唯一のクラスであると仮定すると、合計2つのメソッド参照があります*。 1つはmain.main(String [])、もう1つはFoo.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(); 
    } 
} 

を持っているとしましょう。 dexファイルには5つのメソッド参照があります*。

  • main.main(文字列[])
  • Foo.foo()
  • A.foo()
  • B.foo()
  • C.foo()

* この数はあまり正確ではありません。バックグラウンドで各クラスに追加されるコンストラクターメソッドは考慮されていません。各コンストラクタはそのスーパークラスのコンストラクタを呼び出します。したがって、Objectコンストラクタへの参照もあり、それぞれ合計8つのメソッド参照が追加され、メソッドカウントはそれぞれ8と11になります。


疑いで、あなたはさまざまなシナリオを試してみるとDEXファイル内のメソッドリストが実際に含まれているものを見るためにbaksmaliの生のダンプ機能を使用することができます。

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

次に、ダンプファイルで、「method_id_itemセクション」を探します。これは、64kの制限が適用されるメソッド参照のリストです。

+2

コンストラクタもメソッド参照としてカウントされませんか?だから、あなたの例ではメソッド参照の数を増やさないでしょうか? – snrlx

+0

@nvrmnd、はい。それは良い点です。私はそれに応じて答えを更新します。ありがとう! – JesusFreke

+0

.SOファイルまたはJNIコード内のメソッドは、この制限までカウントされますか? – skygeek

関連する問題