我有一套仪器测试,旨在使用 Firebase 测试实验室在从 Android 4.4 到 8 的各种物理设备上运行。
我可以在任何操作系统版本以及 Firebase 测试实验室中的较新设备上成功地在本地运行这些测试,但是当我在运行 4.4 的设备上的 Firebase 测试实验室中运行这些测试时(目前在 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
,我也开始NoClassDefFoundError
在 Android 4.4 本地 AVD 上使用。不过和上面的不一样:
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 保留文件中,我解决了第二个问题:NoClassDefFoundError
multiDexKeepFile file('multidex-config.txt')
multidex-config.txt:
org/junit/runner/Request.class
org/junit/internal/TextListener.class
似乎 4.4 上的 multidex 需要一些帮助。或者,也许这只是一个 hack,只会导致其他缺失类的随机崩溃。无论如何,一切都恢复正常了!