2013-11-28 7 views
13

私が取り組んでいるアプリケーションはGradleで構築されています。私はEspressoを計測器テストの依存として追加しようとしています。アプリケーション自体にはいくつかの依存関係があり、そのうちの1つはGuava 15.0です。この作業を行うために、明示的な依存関係を持つEspressoのバージョンを使用し、バンドルされたGuavaを除外します(代わりに自分自身を使用します)。エスプレッソと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は主アプリで使用されるクラスのみを分析しており、計測器テストの依存関係による使用を探していないということです。私のメインアプリでは使用されていないが、計測器テストに必要なメソッド/クラスは最適化されているようです。

エスプレッソとその依存関係に必要なGuavaクラス/メソッドをProguardに保存させるにはどうしたらいいですか?それらをすべて手作業で指定することは実用的ではないようです(多くの用途があります)、それらのすべてを保つことはProguardの目的を破ってしまいます。

答えて

-6

あなたが絶対に必要な場合を除き、テスト中にあなたのapkを監視しないでください。

+5

残念なことに、アプリがあまりにも多くのメソッドを(ライブラリを介して)持っているためにproguardのないdexステップに失敗します。 Guava除外を追加するには十分な余裕がありますが、他の場所でも同様のエラーが発生する可能性があります(つまり、テストではメソッド/クラスが使用されているが、メインアプリでは使用されません)。 – antonyt

11

ここでは私のために働いていたものです:

build.gradleでは、私は私のdefaultConfigセクションに次の行を追加:

testProguardFile "test-proguard-rules.pro"

をそれから私は、以下の内容で作成したtest-proguard-rules.pro :

-dontobfuscate 
-dontwarn 

これは、テストアパートにこの別のプロアード構成を使用するように指示します。これには、インストゥルメント検査。この場合、proguardにあなたのテストapkを難読化しないように指示しています。これはおそらくあなたが望むものです。あなたがテストしているメインのapkは、あなたの既存のproguard設定を使用して、難読化されます。

+2

テストapkがメインアプリに行うすべての呼び出しをどのように処理しますか? メインアプリケーションのクラスとメソッドは、proguardによって難読化されているので、アプリケーションがそれらの難読化メソッド/クラスをどのように呼び出すのでしょうか? –

関連する問題