1.前言:
在我們平時專案開發中,經常會寫一些不嚴謹的程式碼或者一些比較低階的錯誤程式碼,但是這些錯誤往往很難被發現,這樣就導致了我們的專案中會隱藏了很多影響效能甚至是導致閃退的錯誤程式碼,於是許多響應的檢測工具就出現了.在這裡我就介紹一下我比較常用的幾個檢測工具吧
專案DEMO原始碼
2.FindBugs
顧名思義,FindBugs是一個尋找bug的工具,更具體的說FindBugs是一個靜態檢測java程式碼的工具,可以找到程式碼中的一些潛在bug,比如說NullPointerException,或者是一些流或者資料庫沒有關閉的問題.
2.1作用
檢測範圍 :
- 常見程式碼錯誤,序列化錯誤
- 可能導致錯誤的程式碼,如空指標引用
- 國際化相關問題:如錯誤的字串轉換
- 可能受到的惡意攻擊,如訪問許可權修飾符的定義等
- 多執行緒的正確性:如多執行緒程式設計時常見的同步,執行緒排程問題。
- 執行時效能問題:如由變數定義,方法呼叫導致的程式碼低效問題
2.2使用方法
FindBugs在Android studio裡面有個外掛 正常安裝即可(不會安裝外掛的自己google)
安裝好外掛之後重啟一下Android studio,在底部會有個紅色的圖示(不同版本可能位置不同),如果你出現了這個圖示,那麼恭喜你完成了第一步
點選左側第五個按鈕可以開始檢測
檢測結果顯示如下
當建立流的時候發生了異常 那麼inputStream就可能為空 接下來直接呼叫inputStream就可能產生空指標異常
這裡使用了io流,但是沒有做釋放
2.3設定
在setting裡面還可以對FindBugs做一些設定(這裡就不做詳細的介紹了)
2.4自定義規則
FindBugs可以在gradle裡面做自定義任務
(注意需要在gradle裡面新增 apply plugin:'findbugs')
在這裡配置了規則findbugs-filter.xml 以及報告生成的路徑findbugs.xml
task findbugs(type: FindBugs, dependsOn: "assembleDebug") {
ignoreFailures = false
effort = "max"
reportLevel = "high"
excludeFilter = new File("$configDir/findbugs/findbugs-filter.xml")//這裡是自定義的規則
classes = files("${project.rootDir}/app/build/intermediates/classes")
source 'src'
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = false
html.enabled = true
xml {
destination "$reportsDir/findbugs/findbugs.xml" //這裡是報告產生的路徑
}
html {
destination "$reportsDir/findbugs/findbugs.html" //這裡是報告產生的路徑
}
}
classpath = files()
}複製程式碼
執行自定義任務(找到任務,雙擊即可)
3.PMD
PMD和FindBugs的作用差不多,但是他們倆的檢測方法不同,所以同時使用能達到互補.
3.1作用
檢測範圍 :
- 可能的bug——空的try/catch/finally/switch塊。
- 無用程式碼(Dead code):無用的本地變數,方法引數和私有方法。
- 空的if/while語句。
- 過度複雜的表示式——不必要的if語句,本來可以用while迴圈但是卻用了for迴圈。
- 可優化的程式碼:浪費效能的String/StringBuffer的使用。
3.2使用方法
PMD在Android studio也有個外掛,直接安裝即可(注意搜尋的關鍵字用QAPlug - PMD)
3.3自定義規則
(注意需要在gradle裡面新增 apply plugin: 'pmd')
task pmd(type: Pmd) {
ignoreFailures = false
ruleSetFiles = files("$configDir/pmd/pmd-ruleset.xml") //這裡是自定義的規則
ruleSets = []
source 'src'
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = false
html.enabled = true
xml {
destination "$reportsDir/pmd/pmd.xml" //這裡是報告產生的路徑
}
html {
destination "$reportsDir/pmd/pmd.html" //這裡是報告產生的路徑
}
}
}複製程式碼
在這裡配置了規則pmd-ruleset.xml 以及報告生成的路徑 pmd.html
執行自定義任務(跟FindBugs一樣,找到任務,雙擊即可)
4.CheckStyles
CheckStyles是用來檢測java程式碼規範性的
4.1作用
檢測範圍 :
- 註解
- javadoc註釋
- 命名規範
- 檔案頭
- 匯入包規範
- 尺寸設定
- 空格
- 正規表示式
- 修飾符
- 程式碼塊
- 編碼問題
- 類設計問題
- 重複、度量以及一些雜項
4.2使用方法
安裝外掛 CheckStyles
4.3設定
TreatCheckstyle errors as warnings 如果勾上的話,檢測到錯誤時只是會以警告的形式提示
下面是勾上時的提示方式(以警告的形式)
下面是不勾時的提示方式(以報錯的形式)
下面是選擇官方預設的檢測規則(也可以自己定義,具體這裡就不做詳解了)
4.4通過gradle執行
(注意需要在gradle裡面新增 apply plugin: 'checkstyle')
task checkstyle(type: Checkstyle) {
configFile file("$configDir/checkstyle/checkstyle.xml") //這裡是自定義的規則
configProperties.checkstyleSuppressionsPath = file("$configDir/checkstyle/suppressions.xml").absolutePath //這裡是自定義的規則
source 'src'
include '**/*.java'
exclude '**/gen/**'
classpath = files()
}複製程式碼
5.Demo原始碼
Demo連結
github.com/yulyu2008/Q…
注意Demo裡面的task都抽取到了config目錄下的quality.gradle中,所以需要在專案的build.gradle新增
apply from: '../config/quality.gradle'
Demo是在他人的基礎上修改的,由於已經無法找到源頭,所以在這裡宣告一下