将Espresso与Proguard和Gradle集成

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)

在我的Proguard配置中添加-keep class com.google.common.** { *; }可以使一切正常工作。看起来 Proguard 仅分析了主应用程序使用的类,并未查找仪器测试依赖项的使用情况。对于我的主应用程序未使用但仪器测试所需的方法/类似乎被优化掉了。

我该如何让Proguard保留Espresso及其依赖项所需的Guava类/方法?手动指定它们似乎并不实际(有很多地方要用),保留所有内容又失去了Proguard的目的。

2个回答

11

以下是对我有效的方法:

在 build.gradle 文件中,我在 defaultConfig 部分添加了以下行:

testProguardFile "test-proguard-rules.pro"

然后我创建了 test-proguard-rules.pro 文件,并填入以下内容:

-dontobfuscate
-dontwarn

这会告诉 Gradle 使用单独的 Proguard 配置来构建你的测试 APK,其中包含你的 Instrumentation tests。在这种情况下,你告诉 Proguard 不要混淆你的测试 APK,这可能是你想要的。你正在测试的主 APK 仍将使用现有的 Proguard 配置进行混淆。


6
你如何处理测试apk对主应用程序所做的所有调用?由于Proguard混淆了主应用程序中的类和方法,测试应用程序如何调用这些被混淆的方法/类? - Sahil Jain

-10

在测试期间,除非你确实需要这样做,否则不要对你的apk进行混淆。


5
很不幸,该应用程序由于包含太多方法(经由库文件)而在未启用ProGuard的情况下无法通过dex步骤。虽然有足够的余地来添加Guava排除项,但类似的错误也可能出现在其他地方(例如,在测试中使用了方法/类但未在主应用程序中使用时)。 - antonyt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接