Android覆盖率,使用Jacoco时遇到的各种意外情况

基础

本篇是"Android覆盖率-Jacoco使用总结"(后称"总结"")的后续整理。
由于后期遇到的问题太多,写在总结里可能过于累赘,故开新篇。名正言顺多水一篇!

扩充说明

Jacoco的覆盖率报告html文件主要包含:

  • index.html 主html文件,用于展示整体情况
  • jacoco-resources.html/report.css 整个html的css样式文件
  • XXX.java.html 某个java文件的具体覆盖信息
  • XXX.html 某个java文件的覆盖索引,以方法拆分

其他请参阅"总结"

Why: 执行覆盖率,一直不产出某些模块的报告

要执行Jacoco,Gradle中默认需要以下前提:

  1. 只支持Debug包
  2. 只支持非混淆包(混淆后无法对应源文件)
  3. 需要插桩的模块需要增加参数

在需要的模块中添加

1
2
3
4
5
6
buildTypes {
	debug {
		// 开启覆盖率需要的参数
		testCoverageEnabled = true
	}
}

Where: 同层文件夹中其他java文件报告存在,但是个别文件不存在; 只包含静态方法的java文件的不存在

查阅资料后确认,使用手工覆盖的Jacoco无法覆盖静态方法。 原因应该为其使用字节码判定是否覆盖,但是静态方法存在的class未init时不会生成字节码,导致无法覆盖。
参考: https://www.jacoco.org/jacoco/trunk/doc/faq.html - Why are abstract methods not shown in coverage reports?
参考: https://stackoverflow.com/questions/30121265/how-to-add-static-member-variables-jacoco-test-coverage

What: 执行覆盖率时崩溃,提示Error while creating report: Can’t add different class with same name

Jacaoco不支持增加相同名称的不同class,为解决这个问题,我是进行分拆,一步一步增加classDirectories的

1
2
3
4
5
6
classDirectories += fileTree(
	dir: '../xxx/build/intermediates/javac/localDebug/compileLocalDebugJavaWithJavac/classes',
	excludes: excludeClasses)
classDirectories += fileTree(
	dir: '../xxx/adb/build/intermediates/javac/localDebug/compileLocalDebugJavaWithJavac/classes',
	excludes: excludeClasses)

更多请看以下参考 参考: https://stackoverflow.com/questions/11673356/jacoco-cant-add-different-class-with-same-name-org-hamcrest-basedescription