2013-11-28 105 views
13

我正在使用的应用程序正在使用Gradle构建。我正在尝试添加Espresso作为仪器测试的依赖项。该应用程序本身有一些依赖项,其中一个是Guava 15.0。为了做到这一点,我使用Espresso版本的显式依赖,并排除捆绑的番石榴(使用我自己的代替)。集成浓缩咖啡和Proguard和Gradle

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的目的。

回答

-6

在测试过程中不要编程你的apk,除非你绝对必须。

+5

不幸的是,由于具有太多方法(通过库),该应用程序由于没有proguard而失败了dex步骤。有足够的余地添加番石榴排除,但在其他地方也可能会出现类似的错误(即任何时候方法/类在测试中使用,但不在主应用程序中)。 – antonyt

11

下面是我工作:

在我的build.gradle加入这一行我defaultConfig部分:

testProguardFile "test-proguard-rules.pro"

然后创建test-proguard-rules.pro包含以下内容:

-dontobfuscate 
-dontwarn 

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

+2

你如何处理测试apk对主应用程序的所有调用。 由于主程序中的类和方法会被proguard混淆,因此测试应用程序将如何调用那些混淆的方法/类? –