JaCoCo 二次开发解决「类局部修改丢失历史覆盖率」完整方案
本文为基于 JaCoCo 源码二次开发的全流程方案,旨在实现类局部修改后保留未改动方法历史覆盖率,仅失效改动方法覆盖率的核心诉求,兼顾 JaCoCo 原生正确性原则与业务实用性。
一、核心目标与不可突破原则
1.1 核心开发目标
- 类局部修改(方法 / 代码块修改)时,未改动方法的历史覆盖率完全复用,改动方法覆盖率清零并重新统计;
- 完全兼容 JaCoCo 原生能力:插桩方式(动态 / 离线)、覆盖率维度、dump 文件格式、构建插件(Maven/Gradle);
- 坚守正确性底线:仅当方法字节码逻辑完全未变时才复用覆盖率,杜绝错误数据。
1.2 不可突破原则
- 正确性原则:复用数据必须基于方法逻辑一致性,方法体改动则覆盖率强制失效;
- 向下兼容原则:改造后 JaCoCo 可解析原生 dump 文件,原生 JaCoCo 可解析改造后文件(降级兼容);
- 无侵入原则:业务侧无感知,使用方式与原生 JaCoCo 一致,新增开关控制功能。
1.3 核心改造思想
原生 JaCoCo 以 类级别 ClassID 绑定覆盖率数据,类变更则全量失效;改造后下沉为 方法级别 MethodID 绑定,实现方法级粒度的失效与复用,核心逻辑如下:
- 覆盖率数据存储结构从 ClassID + 全局探针ID → ClassID + MethodID + 方法内局部探针ID