适用于Android Espresso内部匕首工厂类的NoClassDefFoundError

时间:2016-06-02 08:10:39

标签: android android-espresso android-proguard

我正在尝试将Espresso测试框架添加到我的项目中。但是,我坚持使用这个NoClassDefFoundError 3天了。搜索完Google后,我发现测试APK默认使用的是DEBUG构建类型。出于某种原因,我需要为调试构建类型设置Proguard。但是,运行我的测试配置时出现以下错误:

06-02 15:27:01.105 19436-19457/com.lingyue.YqgAndroid E/TestLoader: Could not find class: android.support.test.espresso.base.UiControllerModule_ProvideUiControllerFactory
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.core.deps.dagger.internal.Factory>
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.base.ViewFinderImpl_Factory>
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.base.ViewFinderImpl_Factory>
06-02 15:27:01.109 19436-19457/com.lingyue.YqgAndroid E/TestLoader: Could not find class: android.support.test.espresso.base.ViewFinderImpl_Factory
06-02 15:27:01.114 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.core.deps.dagger.internal.Factory>
06-02 15:27:01.115 19436-19457/com.lingyue.YqgAndroid E/AndroidRuntime: FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner
    Process: com.lingyue.YqgAndroid, PID: 19436
    java.lang.NoClassDefFoundError: android.support.test.espresso.core.deps.dagger.internal.Factory
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:324)
    at android.support.test.internal.runner.TestLoader.doLoadClass(TestLoader.java:92)
    at android.support.test.internal.runner.TestLoader.loadIfTest(TestLoader.java:113)
    at android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(TestRequestBuilder.java:801)
    at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:747)
    at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:354)
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:260)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)

我的build.gradle看起来喜欢这个依赖项:

dependencies {
    compile "com.android.support:cardview-v7:${supportVersion}"
    compile "com.android.support:recyclerview-v7:${supportVersion}"
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
    compile 'com.loopj.android:android-async-http:1.4.9'
    compile 'com.qiniu:qiniu-android-sdk:7.0.9'
    compile 'com.mcxiaoke.gradle:packer-helper:1.0.4'
    compile 'me.henrytao:smooth-app-bar-layout:23.2.1.1'
    compile 'com.alipay.euler:andfix:0.4.0@aar'
    compile 'com.umeng.analytics:analytics:6.0.0'
    compile fileTree('libs')
    compile project(':framework')
    compile project(':yqdsdk')

    // Only needed at compilation
    provided 'com.google.dagger:dagger-compiler:2.0'
    provided 'org.glassfish:javax.annotation:10.0-b28'

    // For testing
    androidTestCompile "com.android.support:support-annotations:${supportVersion}"
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
        exclude group: 'javax.inject'
    }
}

构建类型如下所示:

buildTypes {
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        testProguardFile 'test-proguard-rules.pro'
    }

    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

testProguardFile.pro看起来像这样:

-dontobfuscate
-dontwarn

我做了什么:

  1. 如果我通过设置minifyEnabled = false将Proguard 关闭用于调试版本,则测试会成功运行。我得到了上面的错误。
  2. 我试图把testProguardFile放在“defaultConfig”和“debug”下,但两者都无济于事。
  3. 我试图在Proguard关闭的情况下再添加一个构建类型“uiTest”,但在将 testBuildType 设置为“uiTest”后,测试配置将无效。错误是Android Studio无法识别测试运行器AndroidJUnitRunner。
  4. 在我看来,问题来自于proguard和dagger2的混合使用,但我的想法已经不多了。请帮忙。

    祝福

2 个答案:

答案 0 :(得分:0)

经过更多的研究,我找到了解决这个问题的方法,虽然这不是直截了当的:

  1. 添加新的构建类型并同步构建项目,例如

    uiTest {     minifyEnabled是的 }

  2. 在Android Studio的左下方,点击&#34; Build Variants&#34;。对于您的应用程序模块,请选择新添加的构建变体,例如&#34; UiTest&#34 ;.

  3. 运行该应用程序。

  4. 这有点不方便,因为当您需要在不同的构建变体下进行测试时,需要来回切换。但它让Expresso运行起来。

答案 1 :(得分:0)

我有一个similar problem,并且能够通过在proguard-rules.pro中添加以下规则来解决该问题:

-keep class javax.inject.** { *; }

我不确定您的问题是否完全相同。
另外,我不确定是否需要从javax.inject依赖项中排除espresso-core组。