You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

引入最新Sentry依赖后Jacoco类执行数据不匹配问题求助

问题原因

这个问题源于Sentry 7.6.0的字节码插桩机制——Sentry会在编译后修改类文件,而Jacoco生成覆盖率报告时,要求测试运行时使用的类与报告生成时读取的类完全一致。当Sentry在Jacoco完成测试执行后修改了类文件,就会导致两者字节码不匹配,触发报错。

解决方案

方案1:在单元测试变体中禁用Sentry插桩

单元测试场景通常不需要Sentry的错误捕获能力,直接关闭测试变体的Sentry插桩即可从根源解决类不匹配问题:

在你的app模块build.gradle中添加Sentry变体配置:

sentry {
    // 保留你原有的Sentry配置(如dsn、release等)
    variants {
        all { variant ->
            // 针对所有Debug单元测试变体禁用Sentry插桩
            if (variant.name.contains("DebugUnitTest")) {
                enabled = false
            }
        }
    }
}

方案2:让Jacoco报告使用Sentry处理后的类文件

如果必须在单元测试中启用Sentry,需要调整Jacoco的classDirectories指向Sentry插桩后的类文件(这些文件与测试运行时使用的类完全一致):

修改你自定义的defaultDebugCoverage任务中的类目录配置:

project.afterEvaluate {
    tasks.register("defaultDebugCoverage", JacocoReport) {
        // 保留其他原有配置...
        
        def excludes = [
                // 保留原有排除规则
                '**/R.class',
                '**/R$*.class',
                '**/BuildConfig.*',
                '**/Manifest*.*',
                '**/*_Provide*Factory*.*',
                '**/*_ViewBinding*.*',
                '**/AutoValue_*.*',
                '**/R2.class',
                '**/R2$*.class',
                '**/*Directions$*',
                '**/*Directions.*',
                '**/*Binding.*'
        ]

        // 替换原javaClasses和kotlinClasses,改为指向Sentry处理后的类目录
        def sentryTransformedClasses = fileTree(
            dir: "${project.buildDir}/intermediates/transforms/sentry/defaultDebug",
            excludes: excludes
        )

        classDirectories.from = files(sentryTransformedClasses)
        
        // 保留sourceDirectories和executionData的原有配置...
    }
}

注意:transforms/sentry/defaultDebug路径可能因Gradle版本或Sentry插件版本略有差异,你可以在项目的build/intermediates/transforms目录下找到实际的Sentry处理目录。

方案3:调整任务依赖确保类文件一致

如果上述方案无效,可以强制让Jacoco报告任务依赖Sentry的transform任务,确保读取的类是最新的插桩后版本:

在defaultDebugCoverage任务中添加依赖:

tasks.register("defaultDebugCoverage", JacocoReport) {
    // 保留原有配置...
    // 替换为你项目中实际的Sentry transform任务名
    dependsOn("transformClassesWithSentryTransformForDefaultDebug")
    // 其他配置...
}

你可以通过运行./gradlew tasks --all命令,查看项目中Sentry相关的transform任务具体名称。

内容的提问来源于stack exchange,提问作者Dima Ivankiv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:27:28