私が取り組んでいるアプリはGradleで構築されています。機器テストの依存関係としてエスプレッソを追加しようとしています。アプリ自体にはいくつかの依存関係があり、そのうちの 1 つが Guava 15.0 です。これを機能させるために、明示的な依存関係を持つバージョンの Espresso を使用し、バンドルされている 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 がメイン アプリで使用されるクラスのみを分析しており、インストルメント テストの依存関係による使用を探していないことです。メイン アプリでは使用されていないが、計測器のテストに必要なメソッド/クラスは、最適化されているように見えます。
Espresso とその依存関係に必要な Guava クラス/メソッドを Proguard に保持させるにはどうすればよいですか? それらをすべて手動で指定することは現実的ではないように思われ (多くの使用法があります)、それらすべてを保持することは Proguard の目的を無効にします。