在開發Android的過程中,會出現一些比較不容易發現的Bug
,比如沒有對null
做判斷,會出現'NullPointException'的崩潰,下面的程式碼就會出現崩潰:
if (ta != null) {
mPanelHeight = ta.getDimensionPixelSize(R.styleable.SlidingUpPanelLayout_umanoPanelHeight, -1);
mShadowHeight = ta.getDimensionPixelSize(R.styleable.SlidingUpPanelLayout_umanoShadowHeight, -1);
mParallaxOffset = ta.getDimensionPixelSize(R.styleable.SlidingUpPanelLayout_umanoParalaxOffset, -1);
.......
}
ta.recycle();複製程式碼
開頭的時候判斷ta不為null
,但是在呼叫ta.recycle()
的時候是在if之後,在使用的時候,如果傳入的引數ta為null
的話就會出現NullPointException
的Bug,當然好的程式碼編寫習慣,以及進行code review
,還有充分的測試都可以避免這種Bug的出現。如果換一種思路能夠通過工具檢查出這種潛在的Bug
就最好不過的。還好有一種工具可以解決這個問題:FindBugs
。
FindBugs
FindBugs
是一個Java靜態分析工具,用來檢查類或者jar檔案,查詢程式碼可能存在的問題。FindBugs官網地址:findbugs.sourceforge.net/。
檢測完成之後會生成一份詳細的報告,藉助這份報告可以找到潛在的Bug
,比如前面說到的NullPointException
,還可以檢查特定的資源沒有關閉
,例如:查詢資料庫沒有呼叫Cursor.close()
等。
如果採用人工的方式很難發現類似的bug,或者有一些Bug
不會發現,直到執行時才出現,還有可能是一直沒有出現,別人呼叫的時候沒有做檢查就直接使用了.....FindBugs
可以自動化化的分析程式碼,幫助開發者提高程式碼質量,當然它可以無難度的在Android
上面執行,通過FindBugs
的檢查可以讓App的執行更加的穩定。
Gradle外掛
FindBugs
在Gradle中做一個外掛存在的,可以在Android Studio中直接使用:
apply plugin: "findbugs"
task findbugs(type: FindBugs,dependsOn:'assembleDebug') {
ignoreFailures= true
effort= "default"
reportLevel= "high"
println( "$project.buildDir")
classes = files("$project.buildDir/intermediates/classes")
source= fileTree("src/main/java/")
classpath= files()
reports{
xml.enabled=false
html.enabled=true
xml {
destination "$project.buildDir/findbugs.xml"
}
html{
destination "$project.buildDir/findbugs.html"
}
}
}複製程式碼
程式碼解釋:
- 引入
FindBugs
的外掛:apply plugin: "findbugs"
。 - 定義一個
task
任務,這個任務的型別是FindBugs
,指定依賴assembleDebug
是為了先生成.classe檔案,才能對程式碼進行靜態分析。 ignoreFailures
:有警告錯誤的時候也是允許構建。reportLevel
:報告的級別,Low
,Medium
,High
一般來說我們首先關注的是高階別的報告,再關注低一級別的報告。classes
和source
分別是對應的.classe資料夾地址,和原始碼檔案地址。repoets
指定報告型別,有兩種方式xml
和html
,只允許一種輸出格式。
定義完成之後,同步下Gradle
,之後在右側的Gradle
的選單中找到對於的Module
,就可以在Tasks中找到對應的findBugs任務,點選即可執行。
FindBugs報告
執行完成之後,會得到對應的一個類似下圖的報告:
更多的內容解讀可以點選詳情,看到錯誤對應的程式碼行號,和錯誤詳情,以及相關檢測錯誤的解釋。
常見的FindBugs
的警告:
- NP:
Possible null pointer dereference
,可能出現null的程式碼。 - HE:重寫對戲那個的equals()方法,但是沒有重寫它的hashCode方法,或者相反的情況。
- SE:serializable錯誤
- ...其他常見錯誤可以參考文件
什麼時候執行?
什麼時候執行是一個問題,一般情況下在原有的專案中加入FindBugs
之後,可以檢測出一些以前的程式碼存在的問題,所以在剛剛使用FindBugs
的時候應該做一次全面的檢查,解決掉對應的問題。
之後的執行,一般可以在完成一個版本對應功能開發完成之後可以檢查一次,防止新修改的程式碼有潛在的bug,另一個時間點就是在每次修復完Bug
之後,再執行一次,防止修復Bug
的時候,造成了新的Bug
。