无用代码扫描组件设计
1、现状痛点
系统越来越臃肿,开发过程中可能产生的无用代码增加了系统维护成本。
2、设计思路
2.1、静态代码扫描方案
本方案解决静态代码下无调用方法扫描,通过 ASTParser 对静态文件进行扫描分析,获取代码块来判断调用关系。
基本步骤及思路
(1)载入本地磁盘项目
(2)循环使用 ASTParser 解析每个 java 文件的方法块,把类名+方法名和方法代码块一起落缓存,vm 文件单独落。
分析代码如下
(3)进行调用关系扫描,再次用 ASTParser 解析解析每个 java 文件的方法块,拿方法名去缓存中根据代码块模糊查询,刨除掉自己之后统计调用次数,次数为 0 的可以认为是僵尸方法,打印出来供参考。
2.2、运行时扫描方案
本方案是借助 jacoco(Java Code Coverage),jacoco 本质是一种测试覆盖率工具,通过 asn 字节码增强技术再源代码中加入探针从而获取代码覆盖率
具体实践
(1)依赖 jacoco.ant
在工程内的 pom 中引入 jar 依赖
(2)赋能 Rest 请求
添加一个 url 地址,通过 ant 执行 dump task 用于 Dump Coverage 文件生成
(3)嵌入 jacocoagent
java 启动参数添加如下:
(4)增加配置脚本
/home/admin/clean_export.sh( 脚本默认内容上增加了 *&& $9 != "coverage" *)
输出的文件路径为 /export/Data/coverage/code-cover.exec
(5)下载 cover 文件
/export/Data/coverage/code-cover.exec 目录下
(6)分析代码
打开 idea -> run -> show coverage data 选择对应的 exec 文件即可获取服务端的代码覆盖情况。
绿色覆盖(活跃代码)
红色未覆盖(僵尸代码)
(7)相关链接
2.javaagent使用指南 - rickiyang - 博客园 (cnblogs.com
3.使用Jacoco统计服务端代码覆盖情况实践 - M104 - 博客园 (cnblogs.com
4.Diving Into Bytecode Manipulation: Creating an Audit Log With ASM and Javassist | New Reli
3、实现结果
1、启动工具,选择工程路径
2、点击生成 DB,解析代码载入数据库
3、点击扫描,获取结果
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/2492674d52e6b09096c4296b0】。文章转载请联系作者。
评论