Не удалось создать покрытие Emma / JaCoCo. Emma / JaCoCo работает на classpath и генерирует отчет о покрытии в Android 10.0 с помощью priv-app (Telecom) - PullRequest
0 голосов
/ 30 октября 2019

Я пытался получить покрытие кода в Android 10.0, цель приложения - пакеты / услуги / телекоммуникации. После использования этих шагов ниже, генерируется одна ошибка. Однако используя те же средства в Android 9.0, он может пройти.

Подробные шаги ниже:

1.Добавьте эти коды в пакеты / службы / Telecom / 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.Нажмите и установитеэти два apks к устройству. После этого перезагрузите устройство.

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 и сгенерировать файлы cover.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);
    }

Так что мне нужно помочь найти способ создания файла cover.ec, который может сделать статистику покрытия в android 10.0.

...