运行 Espresso 在 Firebase 上测试时出现 NoClassDefFoundError
NoClassDefFoundError when running Espresso tests on Firebase
我有一套仪器测试,旨在 运行 在从 Android 4.4 到 8 的各种物理设备上使用 Firebase 测试实验室。
我可以在任何 OS 版本以及 Firebase 测试实验室中的较新设备上本地成功 运行 这些测试,但是当我 运行 在 Firebase 测试中进行这些测试时设备 运行ning 4.4 上的实验室(目前 运行ning 在 Moto X 和 Galaxy S4 Mini 上),报告了一个异常,即使各个测试用例都报告成功。这是我看到的异常:
java.lang.NoClassDefFoundError: org.junit.internal.TextListener FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner Process: today.onedrop.android.debug, PID: 5579 java.lang.NoClassDefFoundError: org.junit.internal.TextListener
at android.support.test.internal.runner.listener.InstrumentationResultPrinter.instrumentationRunFinished(InstrumentationResultPrinter.java:221)
at android.support.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:92)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:67)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1792)
我怀疑 Firebase 实际上不是一个因素,如果我在本地测试 Moto X 或 Galaxy S4 Mini,这些测试也会以同样的方式失败。不幸的是,我无法验证该理论。
更新我的 Espresso 测试以使用 TestOrchestrator
后,我也开始在 Android 4.4 本地 AVD 上获得 NoClassDefFoundError
。不过和上面的不一样:
FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner
Process: today.onedrop.android.debug, PID: 15683
java.lang.NoClassDefFoundError: org.junit.runner.Request
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:353)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
在 Firebase 上使用 TestOrchestrator
也会产生新错误而不是旧错误。任何人都可以猜测它们是否具有相同的根本原因,但它们的相似性确实令人怀疑。
更新 #2
@MartinZeitler 关于 MultiDex 的直觉似乎是正确的。我已经解决了 第二个 NoClassDefFoundError
这两个问题,方法是在我的 gradle 配置中将缺少的 类 添加到 multidex keep file:
multiDexKeepFile file('multidex-config.txt')
multidex-config.txt:
org/junit/runner/Request.class
org/junit/internal/TextListener.class
看来 4.4 上的 multidex 需要一些帮助。或者这可能只是一个黑客攻击,只会导致随机崩溃,其他 类 丢失。
无论如何一切都恢复正常了!
您是否添加了对 jUnit 的依赖?即使在 Android 的旧版本上,库 class 也应该是已知的...导致假设您可能还需要在构建时在 build.gradle
中设置 multiDexEnabled true
对于 Android < API 22(默认情况下在以后 API 上启用)。
dependencies {
testImplementation 'junit:junit:4.12'
}
gcloud firebase test android models list
列出设备...
┌───────────────────┬──────────┬─────────────────────────────────────┬──────────┬─────────────┬────────────────┬────────────┐
│ MODEL_ID │ MAKE │ MODEL_NAME │ FORM │ RESOLUTION │ OS_VERSION_IDS │ TAGS │
├───────────────────┼──────────┼─────────────────────────────────────┼──────────┼─────────────┼────────────────┼────────────┤
│ serranolte │ Samsung │ Galaxy S4 mini │ PHYSICAL │ 960 x 540 │ 19 │ │
│ victara │ Motorola │ Moto X │ PHYSICAL │ 1920 x 1080 │ 19 │ │
└───────────────────┴──────────┴─────────────────────────────────────┴──────────┴─────────────┴────────────────┴────────────┘
gcloud firebase test android models describe serranolte
brand: Samsung
codename: serranolte
form: PHYSICAL
supportedVersionIds:
- '19'
gcloud firebase test android models describe victara
brand: Motorola
codename: victara
form: PHYSICAL
supportedVersionIds:
- '19'
都是硬件设备。
我有一套仪器测试,旨在 运行 在从 Android 4.4 到 8 的各种物理设备上使用 Firebase 测试实验室。
我可以在任何 OS 版本以及 Firebase 测试实验室中的较新设备上本地成功 运行 这些测试,但是当我 运行 在 Firebase 测试中进行这些测试时设备 运行ning 4.4 上的实验室(目前 运行ning 在 Moto X 和 Galaxy S4 Mini 上),报告了一个异常,即使各个测试用例都报告成功。这是我看到的异常:
java.lang.NoClassDefFoundError: org.junit.internal.TextListener FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner Process: today.onedrop.android.debug, PID: 5579 java.lang.NoClassDefFoundError: org.junit.internal.TextListener
at android.support.test.internal.runner.listener.InstrumentationResultPrinter.instrumentationRunFinished(InstrumentationResultPrinter.java:221)
at android.support.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:92)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:67)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1792)
我怀疑 Firebase 实际上不是一个因素,如果我在本地测试 Moto X 或 Galaxy S4 Mini,这些测试也会以同样的方式失败。不幸的是,我无法验证该理论。
更新我的 Espresso 测试以使用 TestOrchestrator
后,我也开始在 Android 4.4 本地 AVD 上获得 NoClassDefFoundError
。不过和上面的不一样:
FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner
Process: today.onedrop.android.debug, PID: 15683
java.lang.NoClassDefFoundError: org.junit.runner.Request
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:353)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
在 Firebase 上使用 TestOrchestrator
也会产生新错误而不是旧错误。任何人都可以猜测它们是否具有相同的根本原因,但它们的相似性确实令人怀疑。
更新 #2
@MartinZeitler 关于 MultiDex 的直觉似乎是正确的。我已经解决了 第二个 这两个问题,方法是在我的 gradle 配置中将缺少的 类 添加到 multidex keep file:NoClassDefFoundError
multiDexKeepFile file('multidex-config.txt')
multidex-config.txt:
org/junit/runner/Request.class
org/junit/internal/TextListener.class
看来 4.4 上的 multidex 需要一些帮助。或者这可能只是一个黑客攻击,只会导致随机崩溃,其他 类 丢失。 无论如何一切都恢复正常了!
您是否添加了对 jUnit 的依赖?即使在 Android 的旧版本上,库 class 也应该是已知的...导致假设您可能还需要在构建时在 build.gradle
中设置 multiDexEnabled true
对于 Android < API 22(默认情况下在以后 API 上启用)。
dependencies {
testImplementation 'junit:junit:4.12'
}
gcloud firebase test android models list
列出设备...
┌───────────────────┬──────────┬─────────────────────────────────────┬──────────┬─────────────┬────────────────┬────────────┐
│ MODEL_ID │ MAKE │ MODEL_NAME │ FORM │ RESOLUTION │ OS_VERSION_IDS │ TAGS │
├───────────────────┼──────────┼─────────────────────────────────────┼──────────┼─────────────┼────────────────┼────────────┤
│ serranolte │ Samsung │ Galaxy S4 mini │ PHYSICAL │ 960 x 540 │ 19 │ │
│ victara │ Motorola │ Moto X │ PHYSICAL │ 1920 x 1080 │ 19 │ │
└───────────────────┴──────────┴─────────────────────────────────────┴──────────┴─────────────┴────────────────┴────────────┘
gcloud firebase test android models describe serranolte
brand: Samsung
codename: serranolte
form: PHYSICAL
supportedVersionIds:
- '19'
gcloud firebase test android models describe victara
brand: Motorola
codename: victara
form: PHYSICAL
supportedVersionIds:
- '19'
都是硬件设备。