無用代碼掃描組件設計

架構互聯高可用 2024-05-23 08:47:33
Tech

目錄

前言

設計思路

實現結果

01 前言在今年的敏捷團隊建設中,我通過Suite在軟件開發的過程中,維護一個幹淨、高效的代碼庫是非常重要的。隨著項目的發展,系統越來越臃腫,開發過程中代碼庫往往會積累大量不再使用或者冗余的無用代碼,這些無用代碼不僅增加了系統的複雜度,還可能降低軟件的運行效率,進而增加系統維護成本。因此,設計一個能夠自動掃描並識別這些無用代碼的組件顯得尤爲重要。本文將圍繞這一需求,分別介紹靜態代碼掃描方案和運行時掃描代碼方案,來幫助讀者減少維護成本。02 設計思路 理解,首先 MCube 會依據模板緩存狀態判斷是否需要網絡獲取最新模板,當獲取到模板後進行模板加載,加載階段會將産物轉換爲視圖樹的結構,轉換完成後將通過表達式引擎解析表達式並取得正確的值,通過事件解析引擎解析用戶自定義事件並完成事件的綁定,完成解析賦值以及事件綁定後進行視圖的渲染,最終將目標頁面展示到屏幕。

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 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)嵌入jacocoagentjava啓動參數添加如下:#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

03 實現結果 理解,首先 MCube 會依據模板緩存狀態判斷是否需要網絡獲取最新模板,當獲取到模板後進行模板加載,加載階段會將産物轉換爲視圖樹的結構,轉換完成後將通過表達式引擎解析表達式並取得正確的值,通過事件解析引擎解析用戶自定義事件並完成事件的綁定,完成解析賦值以及事件綁定後進行視圖的渲染,最終將目標頁面展示到屏幕。

1、啓動工具,選擇工程路徑

2、點擊生成DB,解析代碼載入數據庫

3、點擊掃描,獲取結果

活動介紹:GIAC全球互聯網架構大會

本文由高可用架構轉載。技術原創及架構實踐文章,歡迎通過公衆號菜單「聯系我們」進行投稿

0 阅读:32

架構互聯高可用

簡介:感謝大家的關注