我正在使用的应用程序正在使用Gradle构建。我试图添加Espresso作为仪器测试的依赖项。应用程序本身有一些依赖项,其中一个是Guava 15.0。为了使这个工作,我使用具有显式依赖关系的Espresso版本,并排除捆绑的Guava(使用我自己的)。
dependencies {
...
instrumentTestCompile fileTree(dir: 'libs/espresso-dependencies', include: '*.jar')
compile 'com.google.guava:guava:15.0'
...
}
当我尝试使用gradle connectedInstrumentTest
进行构建时,我会收到与缺少方法和类相关的错误。
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.** { *; }
添加到我的Proguard配置中可以使一切正常。似乎正在发生的事情是,Proguard只分析主应用程序使用的类,而不是寻找仪器测试依赖项的使用。我的主应用程序未使用但仪器测试所需的方法/类似乎已经过优化。
如何让Proguard保留Espresso及其依赖项所需的Guava类/方法呢?手动指定它们(有许多用法)似乎不切实际,并且保持所有这些都违背了Proguard的目的。
答案 0 :(得分:11)
这对我有用:
在build.gradle中,我将此行添加到defaultConfig部分:
testProguardFile "test-proguard-rules.pro"
然后我用以下内容创建了test-proguard-rules.pro:
-dontobfuscate
-dontwarn
这告诉gradle为你的测试apk使用这个单独的proguard配置,包含你的仪器测试。在这种情况下,你告诉proguard不要混淆你的测试apk,这可能是你想要的。您正在测试的主apk仍然使用您现有的proguard配置进行模糊处理。
答案 1 :(得分:-7)
在测试期间不要预测你的apk,除非你绝对不得不这样做。