You need to enable JavaScript to run this app. build.gradle已配源码目录,Jacoco仍找不到Kotlin源文件
优惠活动
大模型
产品
解决方案
定价
更多

build.gradle已配源码目录,Jacoco仍找不到Kotlin源文件

Jacoco 无法匹配 Kotlin 源文件的修复方案

问题本质

Jacoco 匹配源文件的逻辑很直接:拿到类的全限定名(比如com.example.helloworld.KeyboardUtil)后,会在getSourceDirectories()指定的所有根目录下,递归查找同名的.java/.kt源文件,找不到就会抛出“生成报告期间未找到源文件”的报错。

这里要澄清一个常见误区:你在报告里看到的app > com.example.helloworld > KeyboardUtil的导航层级,不是匹配失败的表现。Jacoco HTML 报告本来就不会把src/main/java这类物理目录路径展示在导航栏,默认就是以「模块 > 包名 > 类名」的结构做导航,只要点进类详情能正常打开源码、看到行覆盖的红绿标记,就说明匹配正常。

修复步骤

  1. 替换硬编码的源码路径,避免漏配 Kotlin 专属目录
    很多项目的 Kotlin 源码并不放在src/main/java下,而是单独维护在src/main/kotlin路径下,硬编码路径很容易漏掉这类目录,导致 Jacoco 翻遍所有指定路径也找不到对应的.kt文件。直接引用 Android 插件维护的源码集配置是最稳妥的方案,不会漏任何合法源码路径:

    // 替换原来硬编码的def mainSrc = fileTree(...)定义
    def mainSrc = android.sourceSets.main.java.srcDirs
    // 自动过滤不存在的目录,避免配置触发路径不存在的报错
    getSourceDirectories().setFrom(files(mainSrc).filter { it.exists() })
    

    如果项目有自定义的构建变体、产品风味对应的源码目录,这个配置也会自动把这些路径全部收集进来,不需要手动逐行补路径。

  2. 补全类文件扫描范围,避免 Kotlin/Java 编译输出的类漏扫
    原来的配置只扫描了 Kotlin 编译输出的 class 路径,需要把 Java 编译输出的 class 路径也加入扫描范围,否则对应类的覆盖信息会因为找不到 class 文件匹配失败:

    def debugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug", excludes: fileFilter)
    // 新增Java编译输出的class目录扫描
    debugTree += fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter)
    getClassDirectories().setFrom(files([debugTree]))
    
  3. 校验 Android 测试的执行数据路径有效性
    老版本 AGP 的 Android 测试覆盖率文件路径是${buildDir}/outputs/code_coverage/debugAndroidTest/connected/,新版本 AGP(7.0+)的路径已经调整为${buildDir}/outputs/androidTest_code_coverage/debugAndroidTest/,可以先检查对应目录下有没有生成的.ec文件,避免因为执行数据路径不对导致覆盖率计算异常。

修复验证

重新执行jacocoTestReport任务后,打开生成的 HTML 报告,点击对应类的链接:

  • 能正常展示KeyboardUtil.kt的源码内容,并且行号有红绿覆盖标记,就说明源文件匹配成功
  • 之前的“未找到源文件”报错会直接消失,报告里的未覆盖行、未覆盖控制流统计也会和源码视图的标记一一对应

内容的提问来源于stack exchange,提问作者John Glen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 00:06:00