无用代码扫描组件设计

京东云开发者
• 阅读 87

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



无用代码扫描组件设计

点赞
收藏
评论区
推荐文章
红烧土豆泥 红烧土豆泥
2年前
简简单单复习一哈ArrayList和Arrays.asList()
1、面向对象补充(详见面试补充)基于JDK11静态代码块非静态代码块无参/有参构造在同一次编译运行时,静态代码块只会被调用一次ListArrayList(数组,初始容量为10)注:除了通过Iterator自己的remove或add方法,迭代器将抛出ConcurrentModificationException。因此,面对并
Stella981 Stella981
2年前
SpotBugs注解SuppressWarnings在Java&Groovy中的应用
在最近做Java服务端代码静态测试过程中,目前采取的方案如下:测试拉取代码到本地。使用IDE:Intellij,插件:SpotBugs(无增强插件)进行静态测试,更新BUG信息,维护文档和代码中的注解。开发修复禅道BUG。QA拉取修复代码分支,与本地分支(含有抑制注解)进行合并,
Stella981 Stella981
2年前
Dynamic Web TWAIN开如何获取动态Web TWAIN SDK
DynamicWebTWAIN(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.evget.com%2Fproduct%2F1313)是一个专为Web应用程序设计的TWAIN扫描识别控件。你只需在TWAIN接口写几行代码,就可以用兼容TWAIN的扫描仪扫描文档或从数码相机/采
Wesley13 Wesley13
2年前
Java中静态代码块、构造代码块、构造函数、普通代码块
转载来源http://www.cnblogs.com/ysocean/(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2Fysocean%2F)1、静态代码块①、格式  在java类中(方法中不能存在静态代码块)使用s
Wesley13 Wesley13
2年前
Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。构造函数publicHelloA(){//构造函数}关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造
京东云开发者 京东云开发者
2个月前
代码手术刀—自定义你的代码重构工具
前言笔者近日在做代码仓库的存量代码缩减工作,首先考虑的是基于静态扫描的缩减,尝试使用了很多工具来对代码进行优化,例如PMD、IDEA自带的inspect功能、findBugs等。但是无一例外,要么过于“保守”,只给出扫描结果,但是无法实现一键优化,要么直接
铁扇公主 铁扇公主
8个月前
Mac电脑上简洁好用的垃圾清理软件:BuhoCleaner中文最新
BuhoCleaner是一款专为Mac设备设计的清理和优化工具,旨在帮助用户轻松清理磁盘空间、优化系统性能,并保护用户的隐私安全。BuhoCleaner的主要特点如下:清理磁盘空间:可以快速扫描并清理Mac上的无用文件和垃圾数据,包括临时文件、应用程序缓存
新支点小玉 新支点小玉
5个月前
CNAS中兴新支点——源代码审计对企业有哪些好处
源代码扫描,对应用程序进行静态漏洞扫描,分析源代码中存在的安全风险,运行应用于模拟器中对应用进行实时漏洞攻击检测。你是否了解源代码扫描对企业的好处?一、源代码扫描,通常能够帮助企业解决这些问题:1、软件代码中安全漏洞和未声明功能的存在是信息安全事件频繁发生
新支点小玉 新支点小玉
5个月前
源代码审计怎么做?有哪些常用工具
源代码审计是一种通过检查源代码来发现潜在的安全漏洞的方法。下面是常用的源代码审计工具:1、Fortify:通过内置的五大主要分析引擎,对源代码进行静态分析,并与特有的软件安全漏洞规则集进行全面地匹配、查找。2、Checkmax:通过虚拟编译器自动对软件源代
京东云开发者 京东云开发者
4个月前
代码手术刀-自定义你的代码重构工具
前言笔者近日在做代码仓库的存量代码缩减工作,首先考虑的是基于静态扫描的缩减,尝试使用了很多工具来对代码进行优化,例如PMD、IDEA自带的inspect功能、findBugs等。但是无一例外,要么过于“保守”,只给出扫描结果,但是无法实现一键优化,要么直接