2012-06-29 5 views
6

Beim Erstellen und Bereitstellen einer ausführbaren Datei auf Android, ohne dass ProGuard ausgeführt wird, sind nicht referenzierte Methoden in der endgültigen ausführbaren Datei enthalten?Sind referenzierte Methoden in der endgültigen ausführbaren Datei enthalten?

Sind nicht referenzierte Methoden von externen Bibliotheksgläsern ebenfalls enthalten?

Ist dieses Verhalten abhängig vom Java-Compiler, oder macht dex das gesamte Trimmen, wenn überhaupt?

+0

Nicht eine genaue Betrogene, aber sehen Sie dies für viele sehr nützliche Informationen: http://StackOverflow.com/Questions/4912695/What-optimizations-Cani-Expect-From-Dalvik-and-the-android- toolchain –

+0

@GrahamBorland Danke, ich warf einen Blick und konnte keine Informationen in der Frage oder Antwort darüber finden, ob nicht referenzierter Code enthalten ist oder nicht. –

Antwort

5

ich mit einer einfachen Klasse getestet (alle diese Methoden sind nicht referenzierte):

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

ich die APK zusammengestellt, extrahiert Test.class und es dekompilierten (mit javap -c). Ich habe folgende Ergebnisse erhalten. Ich habe auch mit einem Glas anstelle einer APK getestet, und das Ergebnis ist genau das gleiche. Ich habe Java 1.6.0_29 benutzt.

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   

Welche nur private Funktionen bedeutet, werden bei der Kompilierung ausgeschlossen.

Ich versuchte auch, die Klasse final zu deklarieren, aber das Ergebnis war das gleiche.

+2

Dies hängt möglicherweise auch vom verwendeten Compiler ab. Außerdem sind wir auf Android, daher kann der Dexifikationsschritt auch den Code optimieren. – Robert

+0

@Robert Wie konnte Dalmas zu einer Apk kompiliert haben und Dexing vermeiden? –

+1

Ja, ich extrahierte die Klasse von classes.dex in der APK (mit dex2jar). Ich weiß jedoch nicht, ob diese Optimierung vom Java-Compiler oder von der Dexification kommt. – Dalmas

Verwandte Themen