无法生成Emma / JaCoCo覆盖范围。 Emma / JaCoCo jar是否在classpath上?同时在android 10.0中使用priv-app(Telecom)

问题描述 投票:0回答:1

我试图在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 jacoco android-10.0
1个回答
0
投票

我像您一样做了,但是在Android 9中它不会生成coverage.em文件。然后,当我按下apk并运行命令时,它就生成了coverage.ec文件。最后我没有生成报告。没有coverage.em文件。您知道如何解决吗?

© www.soinside.com 2019 - 2024. All rights reserved.