Die App, an der ich arbeite, wird mit Gradle erstellt. Ich versuche, Espresso als Abhängigkeit für Instrumententests hinzuzufügen. Die App selbst hat einige Abhängigkeiten, von denen Guava 15.0 ist. Um dies zu erreichen, verwende ich die Version von Espresso mit expliziten Abhängigkeiten und schließe das gebündelte Guava aus (benutze stattdessen mein eigenes).Integrieren von Espresso mit Proguard und Gradle
dependencies {
...
instrumentTestCompile fileTree(dir: 'libs/espresso-dependencies', include: '*.jar')
compile 'com.google.guava:guava:15.0'
...
}
Wenn ich versuche, mit gradle connectedInstrumentTest
zu bauen, bekomme ich Fehler fehlende Methoden und Klassen zusammen.
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState
at com.google.android.apps.common.testing.ui.espresso.base.InputManagerEventInjectionStrategy.<init>(InputManagerEventInjectionStrategy.java:35)
-keep class com.google.common.** { *; }
meiner Proguard Config Hinzufügen macht alles funktionieren. Was passiert, ist, dass Proguard nur die Klassen analysiert, die von der Haupt-App verwendet werden, und nicht nach der Verwendung durch die Abhängigkeiten des Instrument-Tests sucht. Methoden/Klassen, die nicht von meiner Haupt-App verwendet werden, aber für die Instrumententests benötigt werden, scheinen weit entfernt zu sein.
Wie kann ich Proguard veranlassen, die von Espresso und seinen Abhängigkeiten benötigten Guava-Klassen/Methoden beizubehalten? Es scheint nicht praktisch zu sein, sie alle manuell zu spezifizieren (es gibt viele Verwendungen), und sie alle zu behalten, widerspricht dem Zweck von Proguard.
Leider schlägt die App aufgrund von zu vielen Methoden (über Bibliotheken) den Dex-Schritt ohne Proguard fehl. Es gibt genügend Spielraum, um Guava-Ausschlüsse hinzuzufügen, aber ähnliche Fehler können auch an anderen Stellen auftreten (d. H. Jederzeit, wenn Methoden/Klassen beim Testen verwendet werden, aber nicht in der Haupt-App). – antonyt