热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

一、覆盖率踩过的坑在项目中使用JaCoCo覆盖率的时候,也遇到过各种奇葩的问题,在这里列出来分享下,问题和实际的项目关系密切࿰

一、覆盖率踩过的坑

在项目中使用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时候会失败。

本章完~

原文链接:enter link description here


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • 【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup
    【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
author-avatar
Snape吾爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有