2015-03-23 17 views
11

Mam podklasę android.support.v7.widget.RecyclerView. Działa dobrze, gdy używam aplikacji i testów.java.lang.IncompatibleClassChangeError przy włączaniu espresso-contrib: 2.0

Jednak gdy dołączę plik espresso-contrib do mojego pliku aplikacji gradle, otrzymuję wyjątek, gdy próbuję uruchomić te same testy. Aplikacja nadal działa. Ten sam problem występuje w obu wersjach sdk 21 i 22, na emulatorze i urządzeniu Armv. Używając emulatora x86, zamiast tego ulega on uszkodzeniu.

Gradle

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

Wyjątek

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) 
+1

Wygląda na to, że' onFailedToRecycleView (Landroid/support/v7/widget/RecyclerView $ ViewHolder;) 'to różnica. Zgaduję, że espresso-contrib próbuje zastąpić klasę lub interfejs, ale nie implementuje wszystkich metod? Nadal nie wiem, jak to naprawić. – seppo0010

Odpowiedz

12

zależność Espresso jest nieaktualne. Zgłoszono i zostanie naprawiony w przyszłości. https://code.google.com/p/android-test-kit/issues/detail?id=139

+1

wszelkie aktualizacje dotyczące tego? –

+0

Czy istnieje obecnie aktualne obejście tego problemu? –

+1

@JohnShelley Udało mi się obejść ten problem przez wykluczenie modułu Recyclerview, którego biblioteka espresso-contrib próbuje użyć. androidTestCompile ('com.android.support.test.espresso: espresso-contrib: 2,2') { wyłączyć moduł: 'support-adnotacje' wyłączyć moduł: 'recyclerview NRPV7' } – jacobduron

0

skorzystaj Newest Gradle Plugin (nie jest to wersja stabilna)

Począwszy 2.0.0 na Android Gradle Plugin, Gradle budować zawiedzie jeśli główny APK i testy APK używać tej samej biblioteki (np Guava) ale w różnych wersjach.

Aby kompilacja uda, wystarczy dodać zależność do nowszej wersji do build.gradle

na przykład:

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

referencyjny:

0

Można spróbować dodać, że w dolnej części pliku Gradle (po każdym 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()}" 
    } 
} 

To od projektu Android testowania na github

Źródło: https://github.com/googlecodelabs/android-testing/blob/master/app/build.gradle#L96

0

Może zapomniałeś dodać testInstrumentationRunner android.support.test.runner.AndroidJUnitRunner "w defaultConfig {}

Powiązane problemy