【腾讯TMQ】JAVA代码覆盖率工具JaCoCo-实践篇

作者:刘洋

一、覆盖率项目中使用介绍

本节开始详细介绍下项目中的JaCoCo实战经验。

下图是覆盖率在实际在项目中的主要实施点:

分别详细介绍下:

1.1 确定插桩方式

Android项目只能使用JaCoCo的离线插桩方式。

为什么?主要是因为Android覆盖率的特殊性:

一般运行在服务器java程序的插桩可以在加载class文件进行,运用java Agent的机制,可以理解成”实时插桩”。JaCoCo提供了自己的Agent,完成插桩的同时,还提供了丰富的dump输出机制,如File,Tcp Server,Tcp Client。覆盖率信息可以通过文件或是Tcp的形式输出。这样外部程序可很方便随时拿到被测程序的覆盖率。

但是Android系统破坏了JaCoCo这种便利性,原因有两个:

(1)Android虚拟机不同与服务器上的JVM,它所支持的字节码必须经过处理支持Android Dalvik等专用虚拟机,所以插桩必须在处理之前完成,即离线插桩模式。

(2)Android虚拟机没有配置JVM 配置项的机制,所以应用启动时没有机会直接配置dump输出方式。

1.2 分析项目打包流程

项目目前还是已build方式打包,属于Apache Ant方式。

插桩前先熟悉下项目build内容。

项目主要有几个build文件:

存放在根目录下的build.xml文件,这个是项目构建的组织文件

  • ant目录下的build_common.xml,这个是构建时target内容

  • ant目录下的build_option.xml,定义的属性文件。

  • ant目录下的build_plugins.xml,插件文件。

在插桩前,应该对项目构建过程做一个总体的熟悉,了解下每个target的作用,这样才能确定不会影响各个插桩点,不会遗漏,否则会在打包的过程中出现各种各样的问题。

1.3 代码插桩

http://eclemma.org/jacoco/trunk/doc/ant.html,这个地址是JaCoCo的ant的说明文档。

里面简单介绍了其支持的task类型,包括:
Task coverage、Task agent、Task merge、Task report、Task instrument、Task dump

具体怎么使用可以参考里面的例子。

各Task实际调用的类,看一下JaCoCo的antlib.xml就知道了


项目根据自己的情况暂时只用到了Task instrument,其他dump、merge、report是通过其他方式使用的,具体后面有说明。

为什么没有用到dump、merge、report?

这种情况比较适合一个带有自动化测试的构建:打包、自动化测试、dump、merge、report。

项目部分功能需要手工测试,因此,上述几个步骤需要后面再另外处理。
OK,简单了解了JaCoCo的ant方式,下面开始对项目进行插桩打包。

项目的插桩修改步骤:

主要修改了build-common.xml和build-plugins.xml两个文件:
以下是build-common.xml的修改,build-plugins.xml的修改就不累述了,原理一样。

(1)文件开头的命名空间加入
xmlns:JaCoCo="antlib:org.JaCoCo.ant"

(2)引入 JaCoCo 的 jar 和相关定义

`<taskdef uri="antlib:org.JaCoCo.ant" resource="org/JaCoCo/ant/antlib.xml">

<classpath path="${basedir}/libs/JaCoCoant.jar" />`

(3)重新定义 class 文件生成路径
<property name="classes_instr" value="${temp}/classes_instr" />

(4)修改compile编译节点,插桩注入
`

<fileset dir="${classes}" includes="**/*.class" />

</JaCoCo:instrument>`

(5)修改打包package节点,主要是指定 JaCoCo 编译后的类路径
<jar basedir="${classes_instr}" destfile="temp.jar" />

(6)修改混淆obfuscate节点,增加混淆所需要的
<arg value="-libraryjars ${lib}/JaCoCoagent.jar" />
将delete、mkdir、unzip操作指向classes_instr

(7)修改分包splitClasses节点,指向classes_instr
<arg value="${classes_instr}" />

(8)修改热补丁注入injectPatchCode节点,指向classes_instr
<YYBInjectPatchCode inputDir="${classes_instr}"

(9)修改dex节点,指向classes_instr

 <arg path="${classes_instr}"

(10)修改dex-sub节点,指向classes-instr,同时在excludes中加入jacocoagent.jar
<arg path="${classes_instr}"
fileset dir="${lib}" excludes="tmdownloadsdk.jar,tmapkpatch.jar,.....,jacocoagent.jar" />

将上面的操作,做成全自动修改,打包成autoinsertxml.jar,放到打包服务器后台指定的目录下。

Jar包里详细内容如下:
<

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值