当前位置: 首页 > news >正文

第6.2节 Android Agent开发<三>

6.2.2 覆盖率文件解析jacoco-parser

由于移动端的特殊性,jacoco插件无法直接在java项目中直接引用,然后解析覆盖率文件。于是就开发了一下android端的工具 ,打包成jar包来解析覆盖率文件。

1,项目整体情况

早期这个工具只有EC文件解析功能,后来做覆盖率合并的时候,我又添加上了覆盖率数据的去除和添加功能,形成jacoco-parser2.0.jar,针对这个工具的功能,会有另外的文章介绍,此处只介绍覆盖率EC文件的解析。

2,覆盖率文件解析类

通过在项目中添加jacoco插件,然后引用插件的类处理EC文件,根据探针解析出对应的覆盖率数据在文件中的行,再反查对应的函数,输出为json文件。
i
import com.google.gson.Gson
import org.jacoco.core.analysis.Analyzer
import org.jacoco.core.analysis.CoverageBuilder
import org.jacoco.core.analysis.ICounter
import org.jacoco.core.tools.ExecFileLoader
import java.io.File/********************************************************************************  Read jacoco exec file, java class file, and source file to produce coverage lines.* @author songxianfeng@kuaishou.com*/
data class CoverageInfo(val filename: String,var covered: Set<Int>,var nocovered: Set<Int>
)class JacocoParserOperation {val Covered = setOf(ICounter.FULLY_COVERED, ICounter.PARTLY_COVERED)val NoCovered = setOf(ICounter.NOT_COVERED)fun readJacocoECFileContent(ecFileNames:Array<File>,classesDir:File,sourceDir: Array<File>,output: File){val ecFileLoader = ExecFileLoader()for (file in ecFileNames) {ecFileLoader.load(file)}val coverageBuild = CoverageBuilder()val analyzer = Analyzer(ecFileLoader.executionDataStore, coverageBuild)analyzer.analyzeAll(classesDir)val sourceFileGroup = sourceDir.map {it.walk().filter { file -> file.isFile }.toSet()}.fold(setOf<File>()) { s, e -> s + e}.groupBy { it.name }val bundle = coverageBuild.getBundle("")val coverageMap = mutableMapOf<String, CoverageInfo>()bundle.packages.map { pkg ->//println("${pkg.name} - ${pkg.sourceFiles} - ${pkg.lineCounter}")for (c in pkg.classes) {val sourceFile =sourceFileGroup[c.sourceFileName]?.findLast { f -> f.path.indexOf(c.packageName) > 0 } ?: continuevar coverageInfo = coverageMap[sourceFile.toString()]if (coverageInfo == null) {coverageInfo = CoverageInfo(sourceFile.toString(), setOf(), setOf())}
//                println("class: ${c.name}, source: ${c.sourceFileName}")for (i in c.firstLine..c.lastLine) {if (c.getLine(i).status in Covered) {coverageInfo.covered += i} else if (c.getLine(i).status in NoCovered) {coverageInfo.nocovered += i}}coverageMap[sourceFile.toString()] = coverageInfo}}//        coverageMap.forEach { (k, v) -> println("$k -> $v") }val gson = Gson()val content = gson.toJson(coverageMap)output.writeText(content)}
}

3,工具使用方法

(1)先对项目进行打包
在项目根目录下执行以下命令:
./grwdlew jar

(2)调用工具解析文件
java -jar ./build/libs/jacoco-parser-2.0-SNAPSHOT.jar 
-e /Users/***/first_merged.ec 
-c /Users/****/build_classes_8900 
-s /Users/****/packages 
-o /*****/ecparse.json
  • -e 指定EC文件路径
  • -c 项目源码文件对应的类文件
  • -s 项目的源码文件路径
  • -o 解析后的输出结果,格式为{"文件路径":[函数列表],"文件路径1":[函数列表1]}

文章转载自:

http://OGiJQoC5.nkbfc.cn
http://zCTY24mx.nkbfc.cn
http://veAfO0yN.nkbfc.cn
http://SkePTsYU.nkbfc.cn
http://YLhX3tu9.nkbfc.cn
http://RET1q1TC.nkbfc.cn
http://xo3SGI0i.nkbfc.cn
http://a1LvGkeg.nkbfc.cn
http://tQ0abCNI.nkbfc.cn
http://a4DwKluM.nkbfc.cn
http://KKdU5zqY.nkbfc.cn
http://D7wwMirI.nkbfc.cn
http://3aBpnGYl.nkbfc.cn
http://pph20FYl.nkbfc.cn
http://u8cJRAH7.nkbfc.cn
http://AYZ6DZty.nkbfc.cn
http://3EWE6dko.nkbfc.cn
http://QsRLLz8V.nkbfc.cn
http://K4oWNAJg.nkbfc.cn
http://QUAiz0cD.nkbfc.cn
http://41enMxoP.nkbfc.cn
http://W4kdzHmT.nkbfc.cn
http://4siOkn9d.nkbfc.cn
http://wp6cHX1x.nkbfc.cn
http://lRgr7Bkt.nkbfc.cn
http://7raf4r7g.nkbfc.cn
http://pPcMg5mu.nkbfc.cn
http://VwozCjy4.nkbfc.cn
http://KkY2En2B.nkbfc.cn
http://HREptILF.nkbfc.cn
http://www.dtcms.com/a/384152.html

相关文章:

  • 利用kimi k2编写postgresql协议服务端的尝试
  • 深入理解 Java 集合框架
  • 第十届99全球链商节重点项目“全球纸基生态战略联盟”正式签约
  • 系统服务包括1-4章
  • 自动化C到Rust翻译工具探索:工具实操、不足与挑战解析
  • RabbitMQ 事件驱动与多进程架构
  • 飞书视频,设计测试case
  • python 自动化从入门到实战-开发一个文件自动备份工具(7)
  • 量子能量泵:一种基于并联电池与电容阵的动态直接升压架构
  • 从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移
  • pgNow:一款免费的PostgreSQL监控与性能诊断工具
  • 【完整源码+数据集+部署教程】俯视视角交通场景图像分割系统: yolov8-seg-FocalModulation
  • 《用 Python 构建可靠的自动化 Web 测试:从入门到进阶实战(含 Playwright + pytest + CI/Docker)》
  • Nginx负载均衡集群实验步骤
  • 从go语言出发,搭建多语言云原生场景下全链路观测体系
  • 9.13 9.15 JavaWeb(事务管理、AOP P172-P182)
  • 九、vue3后台项目系列——tag标签逻辑
  • 数据结构入门指南:计算机专业核心课精要
  • 贪心算法应用:DNS缓存问题详解
  • Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据
  • 知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
  • NGUI--游戏登录、注册和服务器选择系统​​
  • C++ std::vector
  • 知微集:Transformer
  • 大数据毕业设计选题推荐-基于大数据的客户购物订单数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • C# JPG转PDF实现方案
  • 单变量单步时序预测 | TCN-BiLSTM时间卷积结合长短期记忆神经网络(MATLAB)
  • uniapp scroll-view 设置scrollTop无效
  • Day24_【深度学习(2)—PyTorch框架安装】
  • 未来汽车电气/电子(E/E)架构——迈向全新电气/电子范式之路上的复杂性掌控