2014-10-21 5 views
20

Ho un problema che Proguard estrae i metodi del mio debug APK (ho bisogno di eseguire proguard sul debug perché si utilizza il metodo dex file limit), anche se sono usati nell'apk Test. Per esempio. utilizzo il metodo addProeprty di GSON in Test unità, ma non nell'app apk. Questo metodo viene rimosso e causa il fallimento del test. Ma non voglio configurare proguard per mantenere tutto GSOn a causa del limite del file dex, ma non voglio nemmeno elencare tutti i metodi separatamente. c'è un modo per dire a rpguard di considerare i test unitari come punti di ingresso del codice sorgente?Test di unità Android con proguard abilitato

risposta

1

Ho risolto questo problema nella mia build con un "dev" aggiuntivo buildType in cui abilito proguard, ma lo configuro per mantenere tutto il codice nel mio pacchetto e alcune classi di librerie specifiche che possono essere utilizzate da solo test. Disabilito anche l'offuscamento nel dev buildType in modo che possa essere eseguito il debug da un IDE.

Per le versioni di debug e release, utilizzo le mie impostazioni "reali" della proguard, inclusi l'offuscamento e le ottimizzazioni.

+0

puoi condividere un file proguard simile? –

+0

Grazie, dovrebbe funzionare. Tuttavia, abbiamo diversi sapori e moduli e avere un altro tipo di build per tutti loro è un po 'un casino. Le regole proguard personalizzate dall'altra risposta hanno aiutato. – Gaket

3

I test di strumentazione (e altri?) Non utilizzano lo stesso file proguard degli apk di debug/release. Potresti provare a impostare l'opzione testProguardFile all'interno dei blocchi di debug e release. Questo file proguard specifico per il test può essere molto permissivo perché non viene utilizzato per l'apk di debug/release.

25

Questo è quello che ho fatto.

Aggiungere un file di regole proguard personalizzato.

/project/app/proguard-test-rules.pro

# Proguard rules that are applied to your test apk/code. 
-ignorewarnings 

-keepattributes *Annotation* 

-dontnote junit.framework.** 
-dontnote junit.runner.** 

-dontwarn android.test.** 
-dontwarn android.support.test.** 
-dontwarn org.junit.** 
-dontwarn org.hamcrest.** 
-dontwarn com.squareup.javawriter.JavaWriter 
# Uncomment this if you use Mockito 
#-dontwarn org.mockito.** 

La aggiungere il seguente al vostro build.gradle per la tua app. Per utilizzare il file proguard durante il test.

/project/app/build.gradle

android { 
    debug { 
     minifyEnabled true 
     testProguardFile 'proguard-test-rules.pro' 
    } 
} 
+3

signore, sono fantastici! – spy

+2

Ho perso il "test" in testProguardFile la prima volta che ho provato questa soluzione, grazie! –

+0

questa dovrebbe essere la risposta accettata – Gaket

5

Nessuna delle risposte di cui sopra ha fatto il trucco per me. Avevo due problemi: dovevo usare anche il file proguard predefinito per i test e il mio file proguard predefinito era sbagliato.

  1. Per utilizzare il file Proguard di default, in aggiunta al proprio:

    android { 
        debug { 
         minifyEnabled true 
         testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project-test.pro' 
        } 
    } 
    
  2. Il file predefinito Proguard (e tutta la cartella di tools/proguard) è apparentemente not replaced by default quando si aggiornano gli strumenti SDK attraverso Studio Android. La mia macchina stava usando un file di configurazione obsoleto, che stava causando problemi di proguard strani. Per aggiornare la configurazione predefinita di proguard, sostituire ~/Library/Android/Sdk/tools/proguard/proguard-android.txt con this.

+0

Stavo solo affrontando il secondo problema. Penso che valga la pena ricordare che dalla versione 2.2.0 del plugin Android per gradle, 'proguard-android.txt' non è più utilizzato e invece le regole predefinite vengono generate al momento della compilazione. Fonte: [plugin Android per Gradle, revisione 2.2.0] (https://developer.android.com/studio/releases/gradle-plugin.html) – aProperFox