2015-04-15 4 views
6

sto giocando con ProGuard nel mio progetto attuale e deciso di provare config Android ottimizzata (con Gradle):correttamente ignorare opzioni Proguard

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 

non ho trovato alcuna documentazione chiaro circa le ottimizzazioni eseguite da Proguard e versioni di Android che sono compatibili con loro:

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* 

Sono aggiornati se la versione min sdk dell'app è 11?

così ho deciso di ignorare per fare un tentativo in proguard-rules.pro:

-optimizations ** 
-printconfiguration "result.pro" 

Ma definitiva configurazione non è come mi aspettavo. Contiene tutte le regole combinate:

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*,** 

Quindi, come può essere sovrascritta l'opzione in ProGuard? O può essere questa linea è uguale a -optimizations **?

risposta

4

Mi ci sono voluti un po 'di prove ed errori ma alla fine l'ho scoperto. Per ignorare le ottimizzazioni di default Proguard, ad esempio, applicare tutto, ma poi code/simplification/arithmetic:

  1. Aggiungi una linea -optimizations al file ProGuard e utilizzare * per rappresentare tutto. Ad esempio, la riga seguente:

    -optimizations !code/simplification/arithmetic,* 
    

    significa "attivare tutte le ottimizzazioni eccetto code/simplification/arithmetic". L'elenco delle ottimizzazioni disponibili è disponibile in the official website ed è possibile utilizzare * per abilitare/disabilitare classi di ottimizzazioni (ad esempio !field/*).

  2. È necessario assicurarsi che il file di regole Proguard viene caricato prima che il file di default ProGuard scambiando l'ordine di proguard-rules.pro e getDefaultProguardFile('proguard-android.txt') nel file Gradle in modo che proguard-rules.pro appare prima:

    buildTypes { 
        release { 
        minifyEnabled false 
        proguardFiles 'proguard-rules.pro', getDefaultProguardFile('proguard-android.txt') 
        } 
    } 
    

L'output dovrebbe essere simile a questo ora:

Optimizing... 
    Number of finalized classes:     68 
    Number of unboxed enum classes:    1 
    Number of vertically merged classes:   0 
    Number of horizontally merged classes:  3 
    Number of removed write-only fields:   0 (disabled) 
    Number of privatized fields:     58 
    Number of inlined constant fields:   375 
    Number of privatized methods:    13 
    Number of staticized methods:    37 
    Number of finalized methods:     210 
    Number of removed method parameters:   290 
    Number of inlined constant parameters:  236 
    Number of inlined constant return values: 239 
    Number of inlined short method calls:  35 
    Number of inlined unique method calls:  114 
    Number of inlined tail recursion calls:  0 
    Number of merged code blocks:    4 
    Number of variable peephole optimizations: 723 
    Number of arithmetic peephole optimizations: 10 
    Number of cast peephole optimizations:  0 
    Number of field peephole optimizations:  0 
    Number of branch peephole optimizations:  42 
    Number of string peephole optimizations:  35 
    Number of simplified instructions:   369 
    Number of removed instructions:    5019 
    Number of removed local variables:   154 
    Number of removed exception blocks:   0 
    Number of optimized local variable frames: 201