Я пытался получить покрытие кода в 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.