作者:刘洋

一、覆盖率踩过的坑

在项目中使用JaCoCo覆盖率的时候,也遇到过各种奇葩的问题,在这里列出来分享下,问题和实际的项目关系密切,希望对有遇到过相似问题的童鞋有所启发。

1.1 覆盖率包在部分手机6.0上安装失败

事情起因:在测试新功能时,用打的覆盖率包,外包反馈部分手机6.0上安装不了。

问题重现:试了在自己的手机,华为mate8的6.0系统上安装正常,属于部分机型问题。

将问题小米手机借来后,发现用豌豆荚或者应用宝确实安装失败,提示“该应用签名有问题,无法安装。”通过adb install安装,提示INSTALL_PARSE_FAILED_NO_CERTIFICATES

怀疑是部分厂商对签名的校验级别比较高。

问题排解:网上有种说法,jdk1.7以后变更了默认的加密算法,而签名程序没有,所以需要在签名时用参数指定。具体方法:在签名命令后加入-digestalg SHA1 -sigalg MD5withRSA

1.会不会这种情况导致:查了应用宝的打包脚本,签名部分已经增加。

此种情况排除

2、会不会签名文件有问题?

重新排查了打包过程的签名,密钥和口令都和RDM打包一样,对ANDROIDR.RSA、ANDROIDR.SF、MANIFEST.MF,清除掉签名,重新进行签名,问题仍然存在。

此种情况排除

3、JaCoCo的jar包重新签名

和RDM打包,也就增加了JaCoCo部分,会不会是JaCoCo的两个jar包jacocoagent.jar和jacocoagent.jar出的问题?

这两个jar包已经是签名过的,会不会需要用应用宝的签名进行重新签?
使用jarsigner重新对这两个jar包用应用宝的密钥进行签名,打包安装,问题仍然存在。

此种情况排除

到这里,网上的各种方法基本都试过了,没任何效果,问题纠结在这里了。
静下心来,网上的方法没任何效果,还是回到项目中,重新一步一步的对比RDM打包和覆盖率打包的区别,逐步排查吧。

4、RDM打包和覆盖率打包逐一对比

….(这里省略一万字,都是排查)

签名部分的日志对比:

我们还是回到打包签名的target:sign_obfuscated

逐行对比RDM和我们覆盖率打包的日志:

发现了一个不同的点:

RDM的:

我们打包的:

大家看出差别了没(红色部分)

红色部分为jacocoagent.jar包里的非class文件,signer对这两个文件也进行了签名。

到这里都不是问题。

问题还是应用宝脚本本身(┬_┬哭~)

签名后做compress和zipalign,据说是极限压缩,减少包的大小。

Compress会调用compress_yingyongbao.sh脚本,这里列出了所有要压缩的文件

看到没,看到没,它重新按这里的文件列表压缩打包,丢掉了上面JaCoCo里面的两个文件应用在打包后,签名文件是存在JaCoCo这两个文件的,但打包后找不到这两个文件,因此安装时有的手机提示签名有问题。

解决方法:

JaCoCo这两个文件,一个是属性文件,一个是生成xml的dtd文件,对我们生成覆盖率没多大作用,我们把这两个从jar包里删除,在重新打包,这两个文件不存在了,也就不用签名了,问题就解决了。

1.2 覆盖率包在部分4.X版本手机上生成ec文件失败

事情起因:在测试新功能时,用打的覆盖率包,外包反馈部分4.X手机生成不了ec文件

问题重现:试了在自己的手机,华为mate8的6.0系统上生成正常,属于部分机型问题。

将问题手机借来后,生成ec文件提示失败。

问题排解:

查看logcat日志:

java.lang.IllegalAccessError:
07-02 16:21:19.768: W/dalvikvm(557): Class resolved by unexpected DEX: Lorg.JaCoCo.agent.rt.internal.Agent(0x44f0d158):0x128f18 ref [Lorg.JaCoCo.agent.rt.internal.Agent;] Lorg.JaCoCo.agent.rt.internal.Agent;(0x44f0d158):0x11df68

还有一段:

反射RT类的getAgent() 方法是提示

`java.lang.reflect.InvocationTargetException`

(1)反射在其他手机是正常的,按道理不应该在部分问题手机会失败,但也做一下排查报错的代码行:

网上有说InvocationTargetException问题可能是没有设置可见就访问私有先看看RT的这个方法

在看看Agent类的这个方法:

尝试把私有字段可见,在去调用

结果问题仍然存在,此种情况排除

(2)那我们就回到第一个错误, Class resolved by unexpected DEX
Agent出了两个地址。

我们在回过头来看应用宝的打包脚本,看看dex干了什么。


调用dex,输入classes,输出dex,下面对excludes里面的jar进行了排除

调用dex_sub,输入subclasses,输出second_dex,下面对excludes里面的jar进行了排除

回过头来在看看我们的插桩脚本,对dex、dex_sub这块只改了classes为classes_instr(用插桩后的打dex)

应用宝这个分包的逻辑,会分别打两个dex。

问题就找到了,因为没有改excludes部分,jacocoagent.jar是放在应用宝libs目录下的,默认dex和dex_sub都把jacocoagent.jar打了进去,运行时就会出现新的dex想要替换之前校验过的dex,也就出现agent有两个地址的缘故。

解决方法:
覆盖率打包的脚本,对dex_sub的excludes中加入jacocoagent.jar,这样两次dex只打一次jacocoagent.jar。

重新打包,ec文件正常生成。

1.3 覆盖率报告生成后看不到源码覆盖情况

源码和类文件都正确指定了,为什么生成的报告看不到源码覆盖?
**
解决方法:**

(1)编译的时候debug=”true” 这个一定要设置,比如

(2)如果1没有错误,那就要看看你的源码和class文件路径指定正确没,JaCoCo是按照包名去搜索的,这个一定要确定好,很多项目会自建代码目录的。

二、覆盖率一些需要注意的地方

由于Android不能通过JVM停止后自动dump覆盖率数据,因此当Android应用进程不存在或停止的时候,覆盖率数据不会生成。

也就有了如下需要注意的地方

(1) 没有启动应用进程,生成覆盖率数据会失败。

(2) 覆盖率生成工具进程杀不杀掉,不影响覆盖率生成结果。

(3) 测试过程中,杀掉应用进程,内存中的覆盖率数据会丢失。

(4) 覆盖率数据是可以追加记录的,但最好在杀掉应用进程前先备份。

建议养成良好的操作习惯,,定期生成覆盖率文件。

如果有杀掉应用进程的需求操作,请在操作前生成一次,这样之前的数据就有所保留了。

一次测试前,一定要保证先清理掉以前覆盖率的数据,否则以现有追加文件的方式的形式,会导致旧新的覆盖率柔和在一起,有可能merge时候会失败。

本章完~

原文链接:(http://mp.weixin.qq.com/s?__biz=MzIxNzEyMzIzOA==&tempkey=dMHC5MnaPAD5/YPeFqVCYgfiC6%2bTXgGO%2bcti7SlD8uEUtTws4O2AOYvGs53CQvh9k/RUY0/lBZGT2zyvrIsPfz7vRYOOO9ZOx890AX/uXQOsaVzYHKvv%2bdYNYXlJzOe9keKDcaAlwMbXA%2bmGqvNI7g==&#rd)


TMQ(腾讯移动品质中心)是腾讯最早专注在移动APP测试的团队
我们专注于移动测试技术精华,饱含腾讯多款亿级APP的品质秘密,文章皆独家原创,我们不谈虚的,只谈干货!

扫码关注我们

扫一扫 关注TMQ
精彩分享不断

【腾讯TMQ】JAVA代码覆盖率工具JaCoCo-踩坑篇相关推荐

  1. JAVA代码覆盖率工具JaCoCo-踩坑篇

    JAVA代码覆盖率工具JaCoCo-原理篇和JAVA代码覆盖率工具JaCoCo-实践篇已经给大家介绍过了,本篇为踩坑篇,这里的话题不是说明JaCoCo有什么问题,而是把过程中遇到的几个棘手问题的解决方 ...

  2. vantUI组件:van-card 自定义内容 - 踩坑篇

    vantUI组件:van-card 自定义内容 - 踩坑篇 特别说明: 自定义用法,格式必须: <van-card> <template #tags> ····自定义内容·· ...

  3. vantUI组件:获取验证码 - 踩坑篇

    vant 的button组件:(发送验证码)按钮点击没反应? 应用场景 · 前戏: 效果图解说: 代码公示: <van-fieldv-model="sms"centercle ...

  4. vantUI 弹出层(轻提示)案例 - 踩坑篇

    vantUI 弹出层(轻提示)- 踩坑篇 可自定义项: 显示时长 显示内容 显示何时消失 代码 · 实例: if(this.checkedAgreement == false){this.$toast

  5. 原生Javascript 操作 css类名 - 踩坑篇

    文章目录 原生Javascript 操作 css类名 效果图示下: 案例 · 代码如下: 重要代码提示: 其他无关参考: 官方参考: 原生Javascript 操作 css类名 不建议用 .class ...

  6. MUI 宫格组件(grid)怎么取消mui-active背景色?(优先级设置问题)- 踩坑篇

    MUI 宫格组件(grid)怎么取消mui-active背景色?(优先级设置问题) 对比 · 截图如下: 踩坑总结 · 点击取消效果 · 举例: 优先级: background > backgr ...

  7. el-radio(自定义样式)获取选中label值 + 选中状态 + 拼接String + post提交 - 踩坑篇

    疑问: vue中怎么获取radio的选中值 .选中状态? 效果图 · 截图: 注意点: 需要使用 label传值,后台接什么,你就传什么 (这个需要和后台事先确定好) 使用@change事件,监听鼠标 ...

  8. elementUI组件el-dropdown - 踩坑篇

    选择即改变:click选择哪个,就显示当前的值,页面UI显示并伴随css样式的变化. 重点:v-if 和 v-else-if 的搭配使用,缺一不可. 效果图: 正确的代码如下: 重要提示: 我之前使用 ...

  9. v-for和v-if同时使用(案例分析:循环最新的前14条数据显示) - 踩坑篇

    Vue官方文档:永远不要把 v-if 和 v-for 同时用在同一个元素上. 官方文档: 避免 v-if 和 v-for 用在一起 阅读上述文档:说明vue不支持二者放到同一个标签中使用 否则真的会失 ...

  10. elementUI 分页组件的使用 - 踩坑篇

    elementUI 分页组件的使用.API调用.获取服务端数据.并初始化渲染页面:(踩坑一则) 因每个公司 / 每个项目 / 客户需求 / 都各有差异,所以本例只是demo说解,并非举一反三或万能分页 ...

最新文章

  1. 伪造服务钓鱼工具Ghost Phisher
  2. 计算勒让德多项式的系数
  3. 产销对接行动倡议书-丰收节交易会·万祥军:贫困地区农品
  4. 使用用户名/密码和Servlet安全性保护WebSockets
  5. 自注意力机制Self-attention(1)
  6. java写的学生信息查询系统_Java编写学生信息查询系统,报错!!!
  7. project不显示里程碑标志_3万台!纽荷兰大方捆打捆机再创全新里程碑
  8. 测试人员,今天再不懂BDD就晚了!
  9. 堪称神器的命令行工具系列——curl
  10. python智能推荐_Python与集体智能:第2章:推荐项目
  11. java 自己的 pid_Java获取自身PID方法搜集
  12. pytorch macos_Windows,Linux和MacOS上的PyTorch安装
  13. golang redis 队列删除图片
  14. Python中os.listdir和os.walk的区别
  15. Win装linux双系统教程
  16. mysql源代码_MySQL源代码解读(一)
  17. android gridview 做日历,android日历控件
  18. java实验学校与教师_java实验
  19. 平均获客成本_互联网金融获客成本
  20. 种子计数法对种子公司的好处

热门文章

  1. 5G宏基站的形态5G基站长什么样?
  2. 解决 selectOne 取到多个报错问题
  3. photoswipe
  4. 【计算机系统基础】符号表、符号解析(详解)
  5. 详解 CAP 定理 Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)
  6. zedgraph右键菜单英文转换成中文
  7. SCI英文文献模板/查看SCI论文分区/tex模板的使用
  8. php 截取小数_php 取小数
  9. 常用Debug模式下的打印DLog
  10. 高级Spring: AOP 实现之 ajc 编译器