6

我在 Android 应用程序中使用 Dagger。它在应用程序中工作,但是当我运行仪器测试时,我得到一个 NoClassDefFoundError。

我正在使用 Gradle 和 Espresso。这是在没有 progaurd 的情况下发生的。

这很奇怪,因为“Module$$ModuleAdapter”正在加载,但“Module$$ModuleAdapter$EndpointProvidesAdapter”没有。

我将 APK 拉出设备并使用 dexdump 验证该类确实在 APK 中,“Module$$ModuleAdapter$EndpointProvidesAdapter”。

关于可能导致这种情况的任何想法?

 java.lang.NoClassDefFoundError: Module$$ModuleAdapter$EndpointProvidesAdapter
            at ...Module$$ModuleAdapter.getBindings(MslModule$$ModuleAdapter.java:33)
            at ...Module$$ModuleAdapter.getBindings(MslModule$$ModuleAdapter.java:13)
            at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:185)
            at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138)
            at dagger.ObjectGraph.create(ObjectGraph.java:129)
            at ...Application.onCreate(...Application.java:21)
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
            at android.app.ActivityThread.access$1500(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: Didn't find class ...Module$$ModuleAdapter$MslEndpointProvidesAdapter" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/....test-1.apk", zip file "/data/app/...-2.apk"],nativeLibraryDirectories=[/data/app-lib/....test-1, /data/app-lib/...-2, /vendor/lib, /system/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
            at ...Module$$ModuleAdapter.getBindings(MslModule$$ModuleAdapter.java:33)
            at ...Module$$ModuleAdapter.getBindings(MslModule$$ModuleAdapter.java:13)
            at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:185)
            at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138)
            at dagger.ObjectGraph.create(ObjectGraph.java:129)
            at ...eApplication.onCreate(...Application.java:21)
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
            at android.app.ActivityThread.access$1500(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
4

2 回答 2

5

Double Espresso 现在已弃用,取而代之的是 Espresso 2.0。它可能对您有用,因为 Jake 在枚举传递依赖项方面做得很好,您可能需要排除这些传递依赖项才能使事情正常进行。

根据我的经验,将 Espresso 2.0 与 Dagger 一起使用可能需要您从 espresso 依赖项中排除 javax.inject:

    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.0') {
    exclude group: 'javax.inject'
}

您可能需要对项目包含的所有 espresso 依赖项执行此操作。

于 2015-01-09T20:34:33.727 回答
3

这似乎与我包含 Espresso 的方式有关,而不是 Dagger 问题...

androidTestCompile ('com.google.android.apps.common.testing:espresso:1.1' ){
        exclude group: 'com.squareup.dagger'
}

改用 Jake Wharton 的“双份浓缩咖啡”,问题就迎刃而解了。

https://github.com/JakeWharton/double-espresso

我仍然不确定为什么会在 Dagger 生成的类上导致 NoClassDefFoundError。

于 2014-05-01T20:28:30.203 回答