2013-11-28 18 views
13

L'app su cui sto lavorando è in fase di costruzione con Gradle. Sto cercando di aggiungere Espresso come dipendenza per i test degli strumenti. L'app stessa ha alcune dipendenze, una delle quali è Guava 15.0. Per farlo funzionare, utilizzo la versione di Espresso con dipendenze esplicite ed escludo il guava in bundle (utilizzando invece il mio).Integrazione dell'espresso con Proguard e Gradle

dependencies { 
    ... 
    instrumentTestCompile fileTree(dir: 'libs/espresso-dependencies', include: '*.jar') 
    compile 'com.google.guava:guava:15.0' 
    ... 
} 

Quando provo a costruire con gradle connectedInstrumentTest, ottengo errori relativi ai metodi mancanti e classi.

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState 
at com.google.android.apps.common.testing.ui.espresso.base.InputManagerEventInjectionStrategy.<init>(InputManagerEventInjectionStrategy.java:35) 

Aggiunta -keep class com.google.common.** { *; } al mio config Proguard fa funzionare tutto bene. Ciò che sembra accadere è che Proguard sta solo analizzando le classi utilizzate dall'app principale e non sta cercando l'utilizzo delle dipendenze del test dello strumento. Metodi/classi che non vengono utilizzati dalla mia app principale, ma che sono necessari per i test dello strumento, sembrano essere ottimizzati.

Come posso fare in modo che Proguard mantenga le classi/metodi Guava richiesti da Espresso e dalle sue dipendenze? Non sembra pratico specificarli tutti manualmente (ci sono molti usi), e mantenere tutti loro sconfigge lo scopo di Proguard.

risposta

-6

Non proguardare il tuo apk (s) durante il test, a meno che non sia assolutamente necessario.

+5

Sfortunatamente, l'app fallisce il passo dex senza proguard perché ha troppi metodi (tramite le librerie). C'è abbastanza margine per aggiungere esclusioni di Guava ma errori simili possono verificarsi anche in altri luoghi (ad esempio quando metodi/classi vengono utilizzati in testing, ma non nell'app principale). – antonyt

11

Ecco cosa ha funzionato per me:

In build.gradle ho aggiunto questa linea per la mia sezione defaultconfig:

testProguardFile "test-proguard-rules.pro"

Poi ho creato test-proguard-rules.pro con il seguente contenuto :

-dontobfuscate 
-dontwarn 

questo dice Gradle utilizzare questa configurazione Proguard separato per l'apk prova, quella che contiene il tuo instrume test di verifica. In questo caso stai dicendo a proguard di non offuscare l'apk del test, che è probabilmente quello che vuoi. L'apk principale che stai testando rimane ancora offuscato usando la tua proguard config esistente.

+2

Come gestisci tutte le chiamate effettuate dall'app di prova all'app principale. Dato che la classe e i metodi nell'app principale sarebbero stati offuscati da proguard, in che modo l'app di test chiamerà quei metodi/classe offuscati? –