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.
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