2012-06-29 26 views
6

ProGuard'ı çalıştırmadan Android'de bir yürütülebilir dosya oluştururken ve dağıtırken, son yürütülebilir dosyada yer almayan yöntemlerden hangileri vardır?Son yürütülebilir dosyaya dahil edilmeyen yöntemler dahil mi?

Ayrıca harici kitaplık kavanozlarından seçilmemiş yöntemler de dahil mi?

Bu davranış, Java derleyicisine bağımlı mıdır, yoksa varsa tüm düzeltmeleri düzeltir mi?

+0

Tam olarak değil, ama çok yararlı bilgiler için bkz: http://stackoverflow.com/questions/4912695/what-optimizations-can-i-expect-from-dalvik-and-the-android- toolchain –

+0

@GrahamBorland Teşekkür ederim, bir baktım ve soruda herhangi bir bilgi bulamadım veya cevapsız kod içerip içermediğine dair cevap bulamadı. –

cevap

5

basit bir sınıfı ile test (bütün bu yöntemler başvurulmayan bağlıdır): APK derlenmiş

public class Test 
{ 
    private void privateMethod() 
    { 
     System.out.println("private"); 
    } 

    protected void protectedMethod() 
    { 
     System.out.println("protected"); 
    } 

    public void publicMethod() 
    { 
     System.out.println("public"); 
    } 

    void method() 
    { 
     System.out.println("method"); 
    } 
} 

I Test.class ekstre edilmiş ve (javap -c ile) bozulamaz. Aşağıdaki sonuçları aldım. Ayrıca bir APK yerine bir kavanozla test ettim ve sonuç tam olarak aynı. Java 1.6.0_29 kullandım. sadece özel fonksiyonlar demektir

protected void protectedMethod(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #47    // String protected 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

    public void publicMethod(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #48    // String public 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

    void method(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #49    // String method 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

derleme sırasında dışındadır.

Ayrıca, final sınıfını bildirmeyi denedim, ancak sonuç aynıydı.

+2

Bu, kullanılan gerçek derleyiciye de bağlı olabilir. Ayrıca Android’de çalışıyoruz ve bu nedenle de giderme adımı kodu optimize edebilir. – Robert

+0

@Robert, Dalmas'ın bir apk ile nasıl bir araya getirdiğini ve sakınmadan nasıl kaçınabileceğini? –

+1

Evet, sınıfı APK'daki class.dex dosyasından ayıkladım (dex2jar ile). Ancak, bu optimizasyonun Java derleyicisinden mi yoksa deksifikasyondan mı geldiğini bilmiyorum. – Dalmas