写点什么

无用代码扫描组件设计

  • 2024-04-10
    北京
  • 本文字数:1320 字

    阅读完需:约 4 分钟

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 依赖


<dependency>    <groupId>org.jacoco</groupId>    <artifactId>org.jacoco.ant</artifactId>    <version>0.8.3</version></dependency><dependency>     <groupId>org.apache.ant</groupId>     <artifactId>ant</artifactId>     <version>1.9.9</version> </dependency>
复制代码

(2)赋能 Rest 请求

添加一个 url 地址,通过 ant 执行 dump task 用于 Dump Coverage 文件生成


@RestController@RequestMapping("/coverage")public class CoverageController {
@PostMapping("dump") @NoCheckMenuPermission public Result<Boolean> dumpCoverageFile() { DumpTask dumpTask = new DumpTask(); // dump文件地址 dumpTask.setDestfile(new File("/export/Data/coverage/code-cover.exec")); // 多次dump追加形式 dumpTask.setAppend(true); // 选一个空闲接口即可 dumpTask.setPort(8840); // 默认本机 dumpTask.setAddress("127.0.0.1"); dumpTask.execute(); return Result.succeed(true); }}
复制代码

(3)嵌入 jacocoagent

java 启动参数添加如下:


#decompress file 解压依赖,获得jacocoagent.jar包,避免需要联系运维上传包jar -xvf $BASEDIR/lib/org.jacoco.agent-0.8.3.jar
复制代码


-javaagent:$BASEDIR/bin/jacocoagent.jar=includes=com.jdwl.*,output=tcpserver,port=8840,address=127.0.0.1 -Xverify:none
复制代码

(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)相关链接

1.JaCoCo - Documentatio


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、点击扫描,获取结果


发布于: 16 小时前阅读数: 7
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
无用代码扫描组件设计_京东科技开发者_InfoQ写作社区