2012-06-29 12 views
6

Podczas budowania i wdrażania pliku wykonywalnego na Androida bez uruchamiania ProGuard, metody bez odwołań są zawarte w ostatecznym pliku wykonywalnym?Czy metody bezwyjątkowe są zawarte w ostatecznym pliku wykonywalnym?

Czy dostępne są również metody bez odwołań z zewnętrznych słoików do biblioteki?

Czy to zachowanie jest zależne od kompilatora Java, czy też czy dekoder wykonuje wszystkie przycinanie?

+0

Nie jest to dokładny duplikat, ale zobacz wiele przydatnych informacji: http://stackoverflow.com/questions/4912695/what-optimizations-can-i-expect-from-dalvik-and-theandand- toolchain –

+0

@GrahamBorland Dzięki, zapoznałem się i nie mogłem znaleźć żadnych informacji w pytaniu lub odpowiedzi na temat tego, czy dołączono kod pozbawiony odnośników. –

Odpowiedz

5

I badane w prosty klasy (wszystkie te metody są przypisań)

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

skompilowałem APK ekstrahuje Test.class i dekompilowana go (z javap -c). Mam następujące wyniki. Przetestowałem także z słojem zamiast pliku APK, a wynik jest dokładnie taki sam. Użyłem Java 1.6.0_29.

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   

Czyli tylko prywatne funkcje są wyłączone w czasie kompilacji.

Próbowałem również zadeklarować klasę final, ale wynik był taki sam.

+2

Może to również zależeć od używanego kompilatora. Ponadto jesteśmy na Androidzie, więc krok dekonifikacji może również zoptymalizować kod. – Robert

+0

@Robert, w jaki sposób Dalmas mógł skompilować się do apk i uniknąć dexing? –

+1

Tak, wyodrębniłem klasę z klasy classes.dex w pakiecie APK (z dex2jar). Nie wiem jednak, czy ta optymalizacja pochodzi z kompilatora Java, czy z dexification. – Dalmas

Powiązane problemy