我正在开发的应用程序是使用 Gradle 构建的。我正在尝试添加 Espresso作为仪器测试的依赖项。该应用程序本身有一些依赖项,其中之一是 Guava 15.0。为了完成这项工作,我使用了具有显式依赖项的 Espresso 版本,并排除了 bundle 的 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 的目的。
最佳答案
这是对我有用的:
在 build.gradle 中,我将这一行添加到我的 defaultConfig 部分:
testProguardFile "test-proguard-rules.pro"
然后我创建了包含以下内容的 test-proguard-rules.pro:
-dontobfuscate
-dontwarn
这告诉 gradle 为您的测试 apk 使用这个单独的 proguard 配置,该 apk 包含您的仪器测试。在这种情况下,您告诉混淆器不要混淆您的测试 apk,这可能是您想要的。您正在测试的主要 apk 仍然会使用您现有的 proguard 配置进行混淆。
关于android - 将 Espresso 与 Proguard 和 Gradle 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20261558/