gpt4 book ai didi

android - Android Espresso 内部 Dagger 工厂类的 NoClassDefFoundError

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:42:34 26 4
gpt4 key购买 nike

我正在尝试将 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。

在我看来,混合使用 proguard 和 dagger2 会带来问题,但我的想法已经用完了。请帮忙。

祝福

最佳答案

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

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

    ui测试{ minifyEnabled 真

  2. 在 Android Studio 的左下方,点击“Build Variants”。对于您的应用程序模块,选择新添加的构建变体,例如“用户界面测试”。

  3. 运行应用程序。

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

关于android - Android Espresso 内部 Dagger 工厂类的 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37586162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com