2013-07-18 12 views
25

Dalvik, tek bir .dex dosyasında (yaklaşık 65.536 tanesi) sahip olabileceği yöntem sayısında bu bilinen kısıtlamaya sahiptir. Sorum, miras (ancak geçersiz kılınmayan) yöntemlerinin bu sınıra karşı sayıp atmadığıdır. 65.536 yöntem sınırı amaçları doğrultusundaDevralınan yöntemler, Android'de Dex yöntemine göre sayılır mı?

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

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

yapar bir yöntem ekleyerek veya 4 ekleme gibi bu sayım:

şey somut hale getirmek için, ben mi var? (Ya da, sanırım, mantıklı bir sonuca varmak için sanırım, bu, 1 yöntem veya 52 yöntem olarak sayılır, bu da java.lang.Object'un da 12 yöntem getirdiğini düşünür).

Arka plan olarak, bazı Ortak Özellikleri ile oluşturulan sınıfların önemsiz olmayan bir sayı var ve ben de yöntem sınırı karşı yukarı darbeleme ediyorum, bu yüzden soyut olanlardan bir kısmının denemek faydalıdır olmadığını merak ediyorum Bir süre satın almak için bir sınıf hiyerarşisi içine.

+1

Yöntemin görünürlüğünü değiştirebildiğiniz için, bunların tümünü sayması gerekmiyor mu? [Dex formatı için buraya bakınız] (http://www.retrodev.com/android/dexformat.html). –

+2

Retrodev bağlantısı, dex dosya biçiminin yayın öncesi sürümünün, modası geçmiş bir tersine mühendislik çalışmasıdır. Daha yetkili ve güncel bir kaynak için adresini deneyin. – danfuzz

+0

404 on dex-format.html –

cevap

15

bir miras ama hiç başvuruda bulunulan değilse geçersiz kılınan yöntem tek yöntem sınırı düşülen (denir). Örnekte

, en Eğer Foo.foo başvuruyorsunuz, bu durumda kod

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

aşağıdaki parça var diyelim(), zaten nedeniyle açık tanımına, bir referansı vardır ki. Bu 5 sınıfın dex dosyasındaki tek sınıf olduğu varsayılırsa, toplam 2 yöntem referansına sahip olursunuz *. Main.main (String []) ve Foo.foo() için bir tane.

Bunun yerine, diyelim ki her alt sınıf için foo metodu aslında başvuruda bulunulan beri, bunlar yöntem sınıra etki edecek, bu durumda aşağıdaki kodu

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

olduğunu varsayalım. Dex dosyanızın 5 yöntem referansı olacaktır *.

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

* Bu sayım çok doğru değil, sahnelerin arkasına her sınıfa eklenen kurucu yöntemlerini dikkate almıyor. Her kurucu, süper sınıfı 'yapıcısını çağırır, bu yüzden, her biri için sırasıyla 8 ve 11 yöntem sayımı vererek, toplam 6 ek yöntem başvurusu için, Nesne yapıcısına bir başvurumuz vardır.


Şüphe, çeşitli senaryoları denemek ve dex dosyasında yöntem liste aslında ne içerdiğini görmek için baksmali en ham dökümü işlevini kullanabilirsiniz.

örn.

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

Ve sonra, döküm dosyasında, "method_id_item bölümünde" arayın. Bu, 64k limitinin geçerli olduğu yöntem referanslarının listesidir.

+2

Kurucular aynı zamanda yöntem referansları olarak sayılmıyor mu? Bu, örneklerinizdeki yöntem referanslarının sayısını artırmaz mı? – snrlx

+0

@nvrmnd, evet. Bu iyi bir nokta. Cevabı uygun şekilde güncelleyeceğim. Teşekkürler! – JesusFreke

+0

İçinde .SO dosyaları veya JNI kodu içindeki yöntemler bu limite kadar sayar mı? – skygeek

İlgili konular