2012-06-29 14 views
6

Quando si crea e distribuisce un eseguibile su Android senza eseguire ProGuard, i metodi non referenziati sono inclusi nell'eseguibile finale?I metodi non referenziati sono inclusi nell'eseguibile finale?

Sono inclusi anche i metodi senza riferimento dai gusci di libreria esterni?

Questo comportamento dipende dal compilatore Java, oppure fa il dex tutto il taglio, se presente?

+0

Non un duplicato esatto, ma guarda questo per molte informazioni molto utili: http://stackoverflow.com/questions/4912695/what-optimizations-can-i-expect-from-dalvik-and-the-android- toolchain –

+0

@GrahamBorland Grazie, ho dato un'occhiata e non sono riuscito a trovare alcuna informazione nella domanda o risposta sul fatto che sia incluso o meno il codice non referenziato. –

risposta

5

ho provato con una semplice classe (tutti questi metodi sono referenziata):

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

ho compilato l'APK, estratto Test.class e decompilato essa (con javap -c). Ho ottenuto i seguenti risultati. Ho anche provato con un jar invece di un APK, e il risultato è esattamente lo stesso. Ho usato 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   

Il che significa solo funzioni private sono esclusi al momento della compilazione.

Ho anche provato a dichiarare la classe final, ma il risultato è stato lo stesso.

+2

Ciò può dipendere anche dal compilatore effettivo utilizzato. Inoltre siamo su Android quindi la fase di dexificazione può anche ottimizzare il codice. – Robert

+0

@Robert come ha potuto compilare Dalmas in un apk ed evitare il dexing? –

+1

Sì, ho estratto la classe da classes.dex nell'APK (con dex2jar). Tuttavia, non so se questa ottimizzazione provenga dal compilatore Java o dalla dexificazione. – Dalmas

Problemi correlati