2013-11-28 149 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混淆,因此測試應用程序將如何調用那些混淆的方法/類? –