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

第6.2节 Android Agent制作<三>

第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,
var nocovered: Set
)
class JacocoParserOperation {
val Covered = setOf(ICounter.FULLY_COVERED, ICounter.PARTLY_COVERED)
val NoCovered = setOf(ICounter.NOT_COVERED)
fun readJacocoECFileContent(ecFileNames:Array,classesDir:File,sourceDir: Array,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()) { s, e -> s + e}.groupBy { it.name }
val bundle = coverageBuild.getBundle("")
val coverageMap = mutableMapOf()
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 } ?: continue
var 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://www.sczhlp.com/news/129764/

相关文章:

  • 网站的数据库是什么免费广告发布平台
  • 谷歌站长平台网站上的百度地图标注咋样做
  • 英文网站建设口碑好优化排名推广教程网站
  • 虚拟空间怎么做网站目录指向wordpress收录排名插件
  • 专业网站建设流程网站关键词怎样优化
  • LVS 服务器 知识
  • 电商网站目录优化wordpress首页调用文章页图片
  • 红色网站建设广州市建设和水务局网站
  • 东平网站建设网站开发模板
  • 可以做视频片头的网站嘉定企业网站制作
  • 互动力 网站建设石家庄推广网站
  • 都匀网站制作济源网站维护
  • 网站商务建设实训的意义自己设计房子软件手机
  • 郑州建网站价 s浏览器
  • 四川省住房和城乡建设局网站山东网站备案注销申请表
  • 07-django+DRF项目中统一json返回格式 - 详解
  • 用帝国cms做网站简易的网站建设
  • 单页面网站模板怎么做摄影网站下载
  • 网站项目运营方案辽宁大连建设工程信息网站
  • 双语公司网站系统下载阿里巴巴运营工资大概多少
  • 制作俄语网站濮阳建设工程网站
  • 品牌型网站建设特点wordpress 栏目列表页
  • 织梦做的网站怎么传到网上网站开发工作室
  • 学校网站建设评比活动获奖网站如何建设与优化
  • 淘宝网站怎么做的好看wordpress+手机端
  • 东拼西凑网站谁做的阳朔网站建设公司
  • 软工第二次作业——个人项目
  • 四川建设银行手机银行下载官方网站下载浙江网站建设前十的公司
  • 南昌做网站的公司哪家好室内设计软件3d
  • 坪地网站建设教程dedecms游戏门户网站源码