将 compileOptions 升级到 java8 会导致 connectedDebugAndroidTest 在 Kitkat 设备上不 运行

Upgrading compileOptions to java8 causes connectedDebugAndroidTest to not run on Kitkat devices

由于我们已将 android 项目升级到 java8,连接的Android测试停止了 运行 Kitkat 设备上的 Robotium 测试。然而,相同的代码在 Lollipop 和更高的 android 版本上运行良好,甚至在 kitkat 上从 Android Studio 执行时也运行良好。但是,一旦我们切换到 ./gradlew cAT,它就会停止在具有以下日志的 kitkat 设备上执行:

如果使用 AndroidJUnitRunner 完成执行,则会显示以下错误:

18:29:56.902 [LIFECYCLE] [org.gradle.api.Task] Starting 0 tests on Titanium Octane Plus - 4.4.2 18:29:56.903 [WARN] [org.gradle.api.Task] Tests on Titanium Octane Plus - 4.4.2 failed: Instrumentation run failed due to 'java.lang.IllegalAccessError' 18:29:56.939 [INFO] [org.gradle.api.Task] [XmlResultReporter]: XML test result file generated at /Users/sil/Workspace/Android/LrAndroid/dev-eng/Thio/android/build/outputs/androidTest-results/connected/TEST-Titanium Octane Plus - 4.4.2-android-.xml. Total tests 0, 18:29:56.939 [INFO] [com.android.build.gradle.internal.ApplicationTaskManager] [XmlResultReporter]: XML test result file generated at /Users/sil/Workspace/Android/LrAndroid/dev-eng/Thio/android/build/outputs/androidTest-results/connected/TEST-Titanium Octane Plus - 4.4.2-android-.xml. Total tests 0, 18:29:57.108 [WARN] [org.gradle.api.Task] com.android.builder.testing.ConnectedDevice > No tests found.[Titanium Octane Plus - 4.4.2] FAILED 18:29:57.109 [WARN] [org.gradle.api.Task] No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).

但如果使用 orchestrator,则会出现以下日志:

12:13:48.953 [LIFECYCLE] [org.gradle.api.Task] Starting 0 tests on Titanium Octane Plus - 4.4.2 12:13:48.963 [INFO] [org.gradle.api.Task] [XmlResultReporter]: XML test result file generated at /Users/sil/Workspace/Android/LrAndroid/dev-eng/Thio/android/build/outputs/androidTest-results/connected/TEST-Titanium Octane Plus - 4.4.2-android-.xml. Total tests 0, 12:13:48.963 [INFO] [org.gradle.api.Task] [XmlResultReporter]: XML test result file generated at /Users/sil/Workspace/Android/LrAndroid/dev-eng/Thio/android/build/outputs/androidTest-results/connected/TEST-Titanium Octane Plus - 4.4.2-android-.xml. Total tests 0, 12:13:48.963 [INFO] [org.gradle.api.Task] [XmlResultReporter]: XML test result file generated at /Users/sil/Workspace/Android/LrAndroid/dev-eng/Thio/android/build/outputs/androidTest-results/connected/TEST-Titanium Octane Plus - 4.4.2-android-.xml. Total tests 0, 12:13:48.963 [INFO] [org.gradle.api.Task] [XmlResultReporter]: XML test result file generated at /Users/sil/Workspace/Android/LrAndroid/dev-eng/Thio/android/build/outputs/androidTest-results/connected/TEST-Titanium Octane Plus - 4.4.2-android-.xml. Total tests 0, 12:13:48.963 [INFO] [com.android.build.gradle.internal.ApplicationTaskManager] [XmlResultReporter]: XML test result file generated at /Users/sil/Workspace/Android/LrAndroid/dev-eng/Thio/android/build/outputs/androidTest-results/connected/TEST-Titanium Octane Plus - 4.4.2-android-.xml. Total tests 0, 12:13:48.995 [WARN] [org.gradle.api.Task] com.android.builder.testing.ConnectedDevice > No tests found.[Titanium Octane Plus - 4.4.2] FAILED 12:13:48.995 [WARN] [org.gradle.api.Task] No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).

在 build.gradle 中为使用 java8 所做的更改是:

compileOptions { targetCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8 }

期待 workarounds/explanation 为什么这个问题只发生在 Kitkat 和更低版本的设备上(尽管我对 android 版本低于 kitkat 的设备不太在意)。

问题是由于未在 build.gradle 中定义用于测试代码的 java 源目录。所以之前的代码就像

instrumentTest.setRoot('tests')

androidTest.setRoot('tests')

当更新到下面时,问题解决了。

androidTest {
        setRoot('tests')
        java.srcDirs = ['src/androidTest/java']
        manifest.srcFile file('src/androidTest/AndroidManifest.xml')
    }