2013-06-08 4 views
6

ho notato che con progetti che ho creato da poco, arriva un nuovo approccio alla Proguard che è quello di utilizzare uno script pre-costruito:Che ottimizzazione è sicura che consente ancora -assumenosideeffects traslochi

$ { sdk.dir} /tools/proguard/proguard-android.txt

Questo è senza ottimizzazione, e viene fornito con un commento:

ottimizzazione è disattivata per impostazione predefinita. A Dex non piace l'esecuzione del codice attraverso i passaggi di ottimizzazione e preverify di ProGuard (ed esegue alcune delle di queste ottimizzazioni da solo).

Sembra che seguendo questo consiglio si intende che assumenosideeffects non ha alcun effetto. Ad esempio, queste attività comuni:

#Remove logging 
-assumenosideeffects class android.util.Log { 
    public static boolean isLoggable(java.lang.String, int); 
    public static int v(...); 
    public static int i(...); 
    public static int w(...); 
    public static int d(...); 
    public static int e(...); 
} 

#Remove asserts 
-assumenosideeffects class junit.framework.Assert { 
    public static *** assert*(...); 
} 

prova non sta funzionando:

if (release) 
{ 
    Assert.assertTrue("Proguard config error, Asserts have been left in", false); 
} 

C'è una via di mezzo sicuro, dove posso applicare l'ottimizzazione per tagliare fuori il debug come definito con assumenosideeffects, ma senza rischiare i problemi associati con l'ottimizzazione di Dex e proguard?

risposta

1

La soluzione che ho trovato è di abilitare esplicitamente solo le ottimizzazioni che dipendono dal comando assumenosideeffects. Così un esempio Proguard config sarebbe il seguente:

# proguard-project.txt 

# Remove all Verbose/Debug logging 
-optimizations code/removal/simple,code/removal/advanced 
-dontobfuscate 
-assumenosideeffects class android.util.Log { 
    public static int v(...); 
    public static int d(...); 
} 

Si noti che il file project.properties deve specificare il SDK file di configurazione Proguard ottimizzare, dal momento che una singola chiamata a -dontoptimize disabilita le ottimizzazioni.

# project.properties 

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt