现在android 开发都喜欢用模块化的方式,然后以aar文件的方式导入到主项目,但是这对于统计代码覆盖率就有点麻烦了,因为统计时候都忽略这些第三方库,那么我们如何将这些aar文件纳入到代码覆盖率的统计中来呢?请看本篇文章。参考资料

何为模块化开发

问题

像这些aar文件加入到主项目后,我们在使用jacoco的时候,都无法统计这些aar文件的覆盖率,比如说主项目是一个空项目,其他所有的代码都分散在其他模块中,也就是以后的以aar文件加入过来,如果你这个时候在主项目中统计代码覆盖率,永远都是0%。其实原因很容易理解,比如你在java开发中的一些第三方jar包肯定不在jacoco的统计范围内。

解决方法

见参考文章,这位大牛利用了一种变通的方式,为每一个aar项目打开了代码覆盖率的统计开关,然后再利用一个任务删除了每一个aar项目中重复的jacocoagent.jar包。具体的操作方式如下:

假设A项目为主项目,B项目为aar项目。操作如下:

A项目配置

首先我们要在A项目的build.gradle打开代码覆盖率的开关

在android/buildTypes/debug下加入testCoverageEnabled = true

在dependencies下加入如下配置:

debugCompile project(path:':B', configuration: 'debug')

path后面跟什么,需要你自己调整,目的是为了指引到B项目,因为我们在setting.properties文件中配置了这个项目,所以在这里可以通过冒号+项目的方式直接引用。

上面的配置说的是,在编译debug版本的包时,引用B项目的debug版本。那既然这样说 ,肯定需要在B项目配置点啥了,来切换到B项目下的build.gradle下

B项目配置

开启代码覆盖率开关,也就是testCoverageEnabled = true

然后一点就是修改默认的publish选项,默认的情况下只发布release版本,我们现在更改成发布debug和release两个版本。在android{}下加入publishNonDefault true 。这样我们就能找到debug版本的aar文件,切这个debug版本加入了代码覆盖率。

删除多余的jacocoagent.jar包

因为多处打开了代码覆盖率的开关,会有多个jacocoagent.jar包,编译的时候会报错,这个时候需要删除多余的jacocoagent.jar包,因为主项目中已经含有了,所以我们只需要删除了aar包下的即可。

task deleteJacocoagentJar {

doLast {

getTransitiveProjectDependencies(this, 'debugCompile').each { project ->

delete "build/intermediates/exploded-aar/${rootProject.name}/${project.name}/unspecified/debug/libs/jacocoagent.jar"

}

}

}

def getTransitiveProjectDependencies(project, configuration) {

def projectDependencies = project.configurations."$configuration".getAllDependencies().withType(ProjectDependency)

def dependencyProjects = projectDependencies*.dependencyProject

dependencyProjects.each {

dependencyProjects += getTransitiveProjectDependencies(it, configuration)

}

return dependencyProjects.unique()

}

android {

applicationVariants.all { variant ->

variant.dex.dependsOn deleteJacocoagentJar

deleteJacocoagentJar.mustRunAfter variant.javaCompile

}

}

这个时候我们使用增强版方式来获得代码覆盖率,安装debug版本到手机,操作一段时间后,获取coverage.ec文件,下面是我两次操作获得的coverage.ec文件

shell@android:/mnt/sdcard/coverage $ls -l

-rw-rw-r-- root sdcard_rw 227 2015-05-12 06:52 coverage.ec_1431413536233

-rw-rw-r-- root sdcard_rw 484 2015-05-12 07:06 coverage.ec_1431414353987

-rw-rw-r-- root sdcard_rw 3777 2015-05-12 07:07 coverage.ec_1431414416960

shell@android:/mnt/sdcard/coverage $

第一个文件,是没有上述配置,产生的代码覆盖率的数据,我pull到本地,生成的报告的代码覆盖率是0%,无论你操作多少,都是0%。

第二个文件,是上述配置完成后,我打开应用关闭后,产生的代码覆盖率的数据。

第三个文件,是上述配置完成后,我打开应用,进行不同的操作,产生的代码覆盖率。

后续问题

代码覆盖率的数据得到了,那么生成报告的问题就摆在面前了,因为这个时候要包含aar项目的源码了,大家尝试下如何生成报告。(参考文章中也有)

Android多模块覆盖率,Android模块化开发中统计aar库的代码覆盖率相关推荐

  1. Android多模块覆盖率,Android代码覆盖率初探—问题已解决!

    6月份到时候就要搞Android代码覆盖率,但是当时客户端即将改版,所以就耽搁了.在Android大哥的帮助下,终于完成了初步的代码覆盖率统计. 在github上找到了封装好的jacocoTestHe ...

  2. Android事件分发机制在实战开发中的应用之一

    学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助 版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https ...

  3. Android事件分发机制在实战开发中的应用之二

    学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助 版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https ...

  4. JNI开发笔记(七)--aar库的生成和调用

    aar库的生成和调用 引 前言 1. 新建一个空工程 2. 新建一个Module 3. 移植JNI工程到Module中 4. 生成aar库与so库 5. 在另一个工程中调用aar库 引 JNI开发笔记 ...

  5. Android碎片知识(十).开发中的gps定位(转)

    一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个LocationManager.我们可以通过如下代码创建LocationManger ...

  6. android 支付模块封装,Android集成支付----支付宝支付总结与封装

    前言 类似于Android集成支付----微信支付总结与封装(可以查看本人另外一篇文章),本文对支付宝支付进行一个总结与封装.相比于微信支付,支付宝支付没有那么多坑. 集成支付宝支付SDK 这里只是简 ...

  7. android红外模块,基于Android平台的智能家居红外控制系统的研究

    摘要: 计算机技术,网络通信技术,智能传感技术,微电子技术的成熟和发展为智能家居的发展创造了良好的前提条件和基础.但现有的家居系统中都存在不足和缺点,而且在智能方面还存在较大的空白.本文针对这些不足和 ...

  8. Android ui 单元测试 覆盖率,Android单元测试/Ui测试+JaCoCo覆盖率统计

    Android单元测试/Ui测试+JaCoCo覆盖率统计 参考资料1 参考资料2 背景说明 单元测试 从源代码着手,对源码中的最小可测试单元进行检查和验证,在对源代码有较深的理解下,编写测试单元,工作 ...

  9. requirejs 模块化开发中遇到的小问题吓死本宝宝了

    最近在写系统的时候,前端加入了requirejs,主要是为了跟随潮流...骗你的. 之前偶然听公司前端同事提前模块化开发.我没听说过,后来查了资料,都说是好处一大丢.就是方便快捷复用等等. 大家也都拿 ...

最新文章

  1. mysql 慢日志 作用_MySQL慢查询日志的作用和开启
  2. 文明,在于传承,而不在于遗忘。
  3. C++ Primer Plus(十一)—— 使用类
  4. C语言实验 圆周率1193,【圆周率】小数点后10000位,4个4个分,你能找到那些配对?...
  5. 对话李飞飞,揭秘国际体育赛事风“云”背后的黑科技
  6. @Scheduled定时任务不生效的原因
  7. 使用 pandas读取 excel 文件的数据
  8. 启发式算法、寻路算法A*算法
  9. 开源工业物联网数据库 Apache IoTDB 毕业成为 Apache 顶级项目!
  10. 利用python暴力破解rar压缩文件密码
  11. Python之动态检测编码chardet
  12. sucess==happiness
  13. 微信小程序怎么添加底部菜单按钮
  14. matlab hanning和hann,哪位大侠能告知——为什么在MATLAB2012中不能调研(汉宁)窗函...
  15. 图片转icon图标并在项目中引用
  16. 爱心转发:宝贝,妈妈想死你了!你在哪里啊?(帮忙转一回吧)
  17. MotoSimEG-VRC软件:多机器人信号交互与PLC功能
  18. 敲七 STL队列(c++)
  19. 关于Jboot读取不到配置文件
  20. 2016年8月16日 星期二 --出埃及记 Exodus 16:17

热门文章

  1. Android问题集锦之三十七:No resource found 'Theme.AppCompat.Light.DarkActionBar'
  2. sun.Jersey 和 glassfish.Jersey
  3. uniapp 微信小程序获取微信用户信息
  4. 一文搞懂HUB75接口(附带LED单元板驱动介绍)
  5. 下载Youku视频观看
  6. Jboss Seam 注解总结
  7. 浏览器内核检测 获取当前浏览器的内核
  8. 连锁创业,自主创业,你如何选择?
  9. 怎么彻底删除users下的文件夹_users是什么文件夹可以删除吗?
  10. php hs256加密,JWT签名算法中HS256和RS256有什么区别