问答 android jacoco 统计多模块

飞宇 · 2017年03月31日 · 最后由 yunmenzhe 回复于 2018年04月17日 · 2612 次阅读

Android 项目进行了模块化,手工运行完测试用例之后,jacoco 只统计一个模块下面的代码覆盖,其它模块的统计出来的数据都是为 0。

build.gradle:

apply plugin: "jacoco"

def coverageSourceDirs = ['../app/src/']
task jacocoTestReport(type: JacocoReport) {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled true
html.enabled true
}
classDirectories = fileTree(
dir: './build/intermediates/classes/product/debug',
excludes: ['/R*.class',
'
/$InjectAdapter.class',
'
/$ModuleAdapter.class',
'*/$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/outputs/code-coverage/connected/coverage.ec")
doFirst {
new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}

统计代码如下:
OnCreate:
String SDCARD_PATH = Environment.getExternalStorageDirectory().getPath();
String DEFAULT_COVERAGE_FILE_PATH = SDCARD_PATH + "/coverage.ec";
File file = new File(DEFAULT_COVERAGE_FILE_PATH);
if (! file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}

OnDestroy:
public void generateCoverageReport() {
String SDCARD_PATH = Environment.getExternalStorageDirectory().getPath();
String DEFAULT_COVERAGE_FILE_PATH = SDCARD_PATH + "/coverage.ec";
Log.d("generateCoverageReport", "generateCoverageReport():" + DEFAULT_COVERAGE_FILE_PATH);
OutputStream out = null;
try {
out = new FileOutputStream(DEFAULT_COVERAGE_FILE_PATH, false);
Object agent = Class.forName("org.jacoco.agent.rt.RT").getMethod("getAgent").invoke(null);
out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class).invoke(agent, false));
} catch (Exception e) {
Log.d("generateCoverageReport", e.toString(), e);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

覆盖数据都有,只是 HTML 文件显示代码都未运行,可以确认 MainActivity 是有运行的,但并未统计出来。求大神解答

共收到 8 条回复 时间 点赞

请使用 markdown 排版,这排版代码没法看。。。

你好,请问这个问题解决了吗,想请教一下

匿名 #3 · 2017年06月14日

不知道是不是因为你引用了库工程的原因。。。
你这个只能统计到主工程的代码覆盖率,而无法统计到库工程,其具体原因可以参考此文 Issue 76373: Code Coverage does not work for library project
你需要在每个模块中插桩才行的

hi 请问问题最后解决了吗?是不是必须每个模块插桩?谢谢

每个模块都需要添加,但是在打包过程中,会卡住。无法出包

飞宇 回复

打包卡住的问题,你后来解决了么

yunmenzhe 回复

请问下,这个打包卡住的问题又解决嘛?

hcl 回复

最终还是没有,卡在那里后后续没有继续研究下去

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册