13

我正在开发的应用程序是使用 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 的目的。

4

2 回答 2

11

这对我有用:

在 build.gradle 中,我将此行添加到我的 defaultConfig 部分:

testProguardFile "test-proguard-rules.pro"

然后我用以下内容创建了 test-proguard-rules.pro:

-dontobfuscate
-dontwarn

这告诉 gradle 为您的测试 apk 使用这个单独的 proguard 配置,该配置包含您的仪器测试。在这种情况下,您告诉 proguard 不要混淆您的测试 apk,这可能是您想要的。您正在测试的主要 apk 仍然会使用您现有的 proguard 配置进行混淆。

于 2015-06-25T15:26:16.400 回答
-9

除非绝对必须,否则不要在测试期间保护您的 apk。

于 2013-12-14T04:34:06.957 回答