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