android - 将 Espresso 与 Proguard 和 Gradle 集成

标签 android gradle dependencies guava android-espresso

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

相关文章:

android - Gradle SourceSets 按 productFlavor 和 buildType

c++ - .lib 子依赖项

android - 使图像适合 X 并缩放 Y

java - Android服务读取localStorage?

android - setTextAppearance deprecated android怎么用?

node.js - 如何管理内部 Node.JS 模块

python - 忽略 ssl 证书以便于安装 python

android - 如何在 Cordova/Phonegap - Eclipse for Android 上安装 barcodescanner-plugin?

java - 如何使用gradle将外部文件添加到jar中?

gradle - 创建可执行的Gradle任务