Java.lang.IncompatibleClassChangeError при включении espresso-contrib: 2.0

У меня есть подкласс android.support.v7.widget.RecyclerView. Он отлично работает, когда я использую приложение и тестирование.

Однако, когда я включаю espresso-contrib в мой файл приложения gradle, я получаю исключение, когда я пытаюсь запустить те же тесты. Приложение все еще работает. Такая же проблема возникает и в версиях 21 и 22 sdk, и в эмуляторе и устройстве armv. Используя эмулятор x86, он вместо этого отключается.

Gradle

androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'

Исключение

java.lang.IncompatibleClassChangeError: xxx.DashboardActivity$1
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:226)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
at dalvik.system.DexPathList.findClass(DexPathList.java:321)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at xxx.DashboardActivity.onCreate(DashboardActivity.java:54)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

adb logcat

I/ActivityManager( 1229): START u0 {act=android.intent.action.MAIN flg=0x14000000 cmp=xxx/.activities.DashboardActivity} from uid 10059 on display 0
V/WindowManager( 1229): addAppToken: AppWindowToken{65964e3 token=Token{3f63d512 ActivityRecord{19743c9d u0 xxx/.activities.DashboardActivity t13}}} to stack=1 task=13 at 0
D/LifecycleMonitor( 2953): Lifecycle status change: [email protected] in: PRE_ON_CREATE
V/WindowManager( 1229): Adding window Window{2d974c1a u0 Starting xxx} at 2 of 7 (after Window{27a98488 u0 com.android.launcher/com.android.launcher2.Launcher})
W/RecyclerView( 2953): setScrollingTouchSlop(): bad argument constant 315513600; using default value
W/art     ( 2953): Incompatible structural change detected: Structural change of android.support.v7.widget.RecyclerView$Adapter is hazardous (/data/dalvik-cache/x86/[email protected]@[email protected]
[email protected] at compile time, /data/dalvik-cache/x86/[email protected]@[email protected]@classes.dex at runtime): Virtual method count off: 26 vs 25
W/art     ( 2953): Landroid/support/v7/widget/RecyclerView$Adapter; (Compile time):
W/art     ( 2953):  Static fields:
W/art     ( 2953):  Instance fields:
W/art     ( 2953):   Z mHasStableIds
W/art     ( 2953):   Landroid/support/v7/widget/RecyclerView$AdapterDataObservable; mObservable
W/art     ( 2953):  Direct methods:
W/art     ( 2953):   <init>()V
W/art     ( 2953):  Virtual methods:
W/art     ( 2953):   bindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art     ( 2953):   createViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art     ( 2953):   getItemCount()I
W/art     ( 2953):   getItemId(I)J
W/art     ( 2953):   getItemViewType(I)I
W/art     ( 2953):   hasObservers()Z
W/art     ( 2953):   hasStableIds()Z
W/art     ( 2953):   notifyDataSetChanged()V
W/art     ( 2953):   notifyItemChanged(I)V
W/art     ( 2953):   notifyItemInserted(I)V
W/art     ( 2953):   notifyItemMoved(II)V
W/art     ( 2953):   notifyItemRangeChanged(II)V
W/art     ( 2953):   notifyItemRangeInserted(II)V
W/art     ( 2953):   notifyItemRangeRemoved(II)V
W/art     ( 2953):   notifyItemRemoved(I)V
W/art     ( 2953):   onAttachedToRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art     ( 2953):   onBindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art     ( 2953):   onCreateViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art     ( 2953):   onDetachedFromRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art     ( 2953):   onFailedToRecycleView(Landroid/support/v7/widget/RecyclerView$ViewHolder;)Z
W/art     ( 2953):   onViewAttachedToWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art     ( 2953):   onViewDetachedFromWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art     ( 2953):   onViewRecycled(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art     ( 2953):   registerAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
W/art     ( 2953):   setHasStableIds(Z)V
W/art     ( 2953):   unregisterAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
W/art     ( 2953): Landroid/support/v7/widget/RecyclerView$Adapter; (Runtime):
W/art     ( 2953):  Static fields:
W/art     ( 2953):  Instance fields:
W/art     ( 2953):   Z mHasStableIds
W/art     ( 2953):   Landroid/support/v7/widget/RecyclerView$AdapterDataObservable; mObservable
W/art     ( 2953):  Direct methods:
W/art     ( 2953):   <init>()V
W/art     ( 2953):  Virtual methods:
W/art     ( 2953):   bindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art     ( 2953):   createViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art     ( 2953):   getItemCount()I
W/art     ( 2953):   getItemId(I)J
W/art     ( 2953):   getItemViewType(I)I
W/art     ( 2953):   hasObservers()Z
W/art     ( 2953):   hasStableIds()Z
W/art     ( 2953):   notifyDataSetChanged()V
W/art     ( 2953):   notifyItemChanged(I)V
W/art     ( 2953):   notifyItemInserted(I)V
W/art     ( 2953):   notifyItemMoved(II)V
W/art     ( 2953):   notifyItemRangeChanged(II)V
W/art     ( 2953):   notifyItemRangeInserted(II)V
W/art     ( 2953):   notifyItemRangeRemoved(II)V
W/art     ( 2953):   notifyItemRemoved(I)V
W/art     ( 2953):   onAttachedToRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art     ( 2953):   onBindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art     ( 2953):   onCreateViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art     ( 2953):   onDetachedFromRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art     ( 2953):   onViewAttachedToWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art     ( 2953):   onViewDetachedFromWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art     ( 2953):   onViewRecycled(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art     ( 2953):   registerAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
W/art     ( 2953):   setHasStableIds(Z)V
W/art     ( 2953):   unregisterAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
I/art     ( 2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.models.JSONArrayRecyclerViewAdapter>
I/art     ( 2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.models.JSONArrayRecyclerViewAdapter>
I/art     ( 2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.activities.DashboardActivity$1>
I/art     ( 2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.activities.DashboardActivity$1>
D/AndroidRuntime( 2953): Shutting down VM
E/MonitoringInstrumentation( 2953): Exception encountered by: Thread[main,5,main]. Dumping thread state to outputs and pining for the fjords.
E/MonitoringInstrumentation( 2953): java.lang.IncompatibleClassChangeError: xxx.activities.DashboardActivity$1
E/MonitoringInstrumentation( 2953):     at dalvik.system.DexFile.defineClassNative(Native Method)
E/MonitoringInstrumentation( 2953):     at dalvik.system.DexFile.defineClass(DexFile.java:226)
E/MonitoringInstrumentation( 2953):     at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
E/MonitoringInstrumentation( 2953):     at dalvik.system.DexPathList.findClass(DexPathList.java:321)
E/MonitoringInstrumentation( 2953):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
E/MonitoringInstrumentation( 2953):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/MonitoringInstrumentation( 2953):     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
E/MonitoringInstrumentation( 2953):     at xxx.activities.DashboardActivity.onCreate(DashboardActivity.java:54)
E/MonitoringInstrumentation( 2953):     at android.app.Activity.performCreate(Activity.java:5990)
E/MonitoringInstrumentation( 2953):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
E/MonitoringInstrumentation( 2953):     at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346)
E/MonitoringInstrumentation( 2953):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
E/MonitoringInstrumentation( 2953):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
E/MonitoringInstrumentation( 2953):     at android.app.ActivityThread.access$800(ActivityThread.java:151)
E/MonitoringInstrumentation( 2953):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
E/MonitoringInstrumentation( 2953):     at android.os.Handler.dispatchMessage(Handler.java:102)
E/MonitoringInstrumentation( 2953):     at android.os.Looper.loop(Looper.java:135)
E/MonitoringInstrumentation( 2953):     at android.app.ActivityThread.main(ActivityThread.java:5257)
E/MonitoringInstrumentation( 2953):     at java.lang.reflect.Method.invoke(Native Method)
E/MonitoringInstrumentation( 2953):     at java.lang.reflect.Method.invoke(Method.java:372)
E/MonitoringInstrumentation( 2953):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/MonitoringInstrumentation( 2953):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Ответ 2

используйте Новый Gradle Плагин (не является стабильной версией)

Начиная с 2.0.0 плагина Android Gradle, сборка Gradle завершится сбой, если основной APK и тестовый APK будут использовать одну и ту же библиотеку (например, Guava), но в разных версиях.

Чтобы сделать сборку успешной, просто добавьте зависимость для более новой версии к build.gradle

например:

androidTestCompile "com.android.support:recyclerview-v7:${supportLibVersion}"

ссылка:

Ответ 3

Вы можете попробовать добавить это в нижней части вашего gradle файла (после каждого char)

/*
Resolves dependency versions across test and production APKs, specifically, transitive
dependencies. This is required since Espresso internally has a dependency on support-annotations.
*/
configurations.all {
    resolutionStrategy.force "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
}

/*
All direct/transitive dependencies shared between your test and production APKs need to be
excluded from the test APK! This is necessary because both APKs will contain the same classes. Not
excluding these dependencies from your test configuration will result in an dex pre-verifier error
at runtime. More info in this tools bug: (https://code.google.com/p/android/issues/detail?id=192497)
*/
configurations.compile.dependencies.each { compileDependency ->
    println "Excluding compile dependency: ${compileDependency.getName()}"
    configurations.androidTestCompile.dependencies.each { androidTestCompileDependency ->
        configurations.androidTestCompile.exclude module: "${compileDependency.getName()}"
    }
}

Это из проекта Android-тестирования на github

Источник: https://github.com/googlecodelabs/android-testing/blob/master/app/build.gradle#L96

Ответ 4

Возможно, вы забыли добавить testInstrumentationRunner android.support.test.runner.AndroidJUnitRunner "в defaultConfig {}