我试图在android 10.0中获得代码覆盖率,应用程序的目标是packages / services / Telecom。使用下面的这些步骤后,生成一个错误。但是,在android 9.0中以相同的方式使用时,它可以通过。
以下详细步骤:
1。在程序包/服务/电信/Android.bp中添加这些代码
dex_preopt: {
enabled: false,
},
2。编译并生成jacoco-cli.jar
cd external/jacoco/
EMMA_INSTRUMENT_STATIC=true mma
3。编译并生成Telecom.apk和TelecomUnitTests.apk
EMMA_INSTRUMENT_STATIC=true make Telecom
EMMA_INSTRUMENT_STATIC=true make TelecomUnitTests
4。将这两个apk推送并安装到设备上。然后,重新启动设备。
adb root
adb remount
adb install -r -g out/target/product/s9863a1h10/data/app/TelecomUnitTests/TelecomUnitTests.apk
adb install -r -g out/target/product/s9863a1h10/system/priv-app/Telecom/Telecom.apk
adb reboot
5。在下面运行此命令,尝试运行UT case,并生成coverage.ec文件。
adb shell am instrument -e coverage true -w com.android.server.telecom.tests/androidx.test.runner.AndroidJUnitRunner
运行这些文件步骤后,发生一个错误:
10-30 09:15:40.271 5977 6000 E CoverageListener: Failed to generate Emma/JaCoCo coverage. Is Emma/JaCoCo jar on classpath?
10-30 09:15:40.271 5977 6000 E CoverageListener: java.lang.ClassNotFoundException: com.vladium.emma.rt.RT
10-30 09:15:40.271 5977 6000 E CoverageListener: at java.lang.Class.classForName(Native Method)
10-30 09:15:40.271 5977 6000 E CoverageListener: at java.lang.Class.forName(Class.java:454)
10-30 09:15:40.271 5977 6000 E CoverageListener: at androidx.test.internal.runner.listener.CoverageListener.generateCoverageReport(CoverageListener.java:90)
10-30 09:15:40.271 5977 6000 E CoverageListener: at androidx.test.internal.runner.listener.CoverageListener.instrumentationRunFinished(CoverageListener.java:70)
10-30 09:15:40.271 5977 6000 E CoverageListener: at androidx.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:92)
10-30 09:15:40.271 5977 6000 E CoverageListener: at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:65)
10-30 09:15:40.271 5977 6000 E CoverageListener: at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
10-30 09:15:40.271 5977 6000 E CoverageListener: at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2196)
10-30 09:15:40.271 5977 6000 E CoverageListener: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.vladium.emma.rt.RT" on path: DexPathList[[zip file "/data/app/com.android.server.telecom.tests-Y8DgaJTZ5VgUHXN2FYmnPQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.android.server.telecom.tests-Y8DgaJTZ5VgUHXN2FYmnPQ==/lib/arm64, /system/fake-libs64, /data/app/com.android.server.telecom.tests-Y8DgaJTZ5VgUHXN2FYmnPQ==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]
10-30 09:15:40.271 5977 6000 E CoverageListener: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
10-30 09:15:40.271 5977 6000 E CoverageListener: at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
10-30 09:15:40.271 5977 6000 E CoverageListener: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
10-30 09:15:40.271 5977 6000 E CoverageListener: ... 8 more
10-30 09:15:40.286 5977 6000 I MonitoringInstr: waitForActivitiesToComplete() took: 0ms
我试图在代码中找到问题,在frameworks / base / test-runner / src / android / test / InstrumentationTestRunner类中,问题是generateCoverageReport,问题是com.vladium.emma.rt类.RT找不到。
try {
Class<?> emmaRTClass = Class.forName("com.vladium.emma.rt.RT");
Method dumpCoverageMethod = emmaRTClass.getMethod("dumpCoverageData",
coverageFile.getClass(), boolean.class, boolean.class);
dumpCoverageMethod.invoke(null, coverageFile, false, false);
// output path to generated coverage file so it can be parsed by a test harness if
// needed
mResults.putString(REPORT_KEY_COVERAGE_PATH, coverageFilePath);
// also output a more user friendly msg
final String currentStream = mResults.getString(
Instrumentation.REPORT_KEY_STREAMRESULT);
mResults.putString(Instrumentation.REPORT_KEY_STREAMRESULT,
String.format("%s\nGenerated code coverage data to %s", currentStream,
coverageFilePath));
} catch (ClassNotFoundException e) {
reportEmmaError("Is emma jar on classpath?", e);
}
因此,我需要帮助找到一种方法来生成coverage.ec文件,该文件可以在android 10.0中进行覆盖率统计。
我像您一样做了,但是在Android 9中它不会生成coverage.em文件。然后,当我按下apk并运行命令时,它就生成了coverage.ec文件。最后我没有生成报告。没有coverage.em文件。您知道如何解决吗?