Android-使用FindBugs
在開發(fā)Android的過程中,會出現(xiàn)一些比較不容易發(fā)現(xiàn)的Bug,比如沒有對null做判斷,會出現(xiàn)'NullPointException'的崩潰,下面的代碼就會出現(xiàn)崩潰:
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();復(fù)制代碼開頭的時候判斷ta不為null,但是在調(diào)用ta.recycle()的時候是在if之后,在使用的時候,如果傳入的參數(shù)ta為null的話就會出現(xiàn)NullPointException的Bug,當(dāng)然好的代碼編寫習(xí)慣,以及進(jìn)行code review,還有充分的測試都可以避免這種Bug的出現(xiàn)。如果換一種思路能夠通過工具檢查出這種潛在的Bug就最好不過的。還好有一種工具可以解決這個問題:FindBugs。
FindBugs
FindBugs是一個Java靜態(tài)分析工具,用來檢查類或者jar文件,查找代碼可能存在的問題。FindBugs官網(wǎng)地址:findbugs.sourceforge.net/。
檢測完成之后會生成一份詳細(xì)的報告,借助這份報告可以找到潛在的Bug,比如前面說到的NullPointException,還可以檢查特定的資源沒有關(guān)閉,例如:查詢數(shù)據(jù)庫沒有調(diào)用Cursor.close()等。
如果采用人工的方式很難發(fā)現(xiàn)類似的bug,或者有一些Bug不會發(fā)現(xiàn),直到運行時才出現(xiàn),還有可能是一直沒有出現(xiàn),別人調(diào)用的時候沒有做檢查就直接使用了.....
FindBugs可以自動化化的分析代碼,幫助開發(fā)者提高代碼質(zhì)量,當(dāng)然它可以無難度的在Android上面運行,通過FindBugs的檢查可以讓App的運行更加的穩(wěn)定。
Gradle插件
FindBugs在Gradle中做一個插件存在的,可以在Android Studio中直接使用:
apply plugin: "findbugs"task findbugs(type: FindBugs,dependsOn:'assembleDebug') {ignoreFailures= trueeffort= "default"reportLevel= "high"println( "$project.buildDir")classes = files("$project.buildDir/intermediates/classes")source= fileTree("src/main/java/")classpath= files()reports{xml.enabled=falsehtml.enabled=truexml {destination "$project.buildDir/findbugs.xml"}html{destination "$project.buildDir/findbugs.html"}} }復(fù)制代碼代碼解釋:
- 引入FindBugs的插件:apply plugin: "findbugs"。
- 定義一個task任務(wù),這個任務(wù)的類型是FindBugs,指定依賴assembleDebug是為了先生成.classe文件,才能對代碼進(jìn)行靜態(tài)分析。
- ignoreFailures:有警告錯誤的時候也是允許構(gòu)建。
- reportLevel:報告的級別,Low,Medium,High一般來說我們首先關(guān)注的是高級別的報告,再關(guān)注低一級別的報告。
- classes和source分別是對應(yīng)的.classe文件夾地址,和源代碼文件地址。
- repoets指定報告類型,有兩種方式xml和html,只允許一種輸出格式。
定義完成之后,同步下Gradle,之后在右側(cè)的Gradle的菜單中找到對于的Module,就可以在Tasks中找到對應(yīng)的findBugs任務(wù),點擊即可運行。
FindBugs報告
運行完成之后,會得到對應(yīng)的一個類似下圖的報告:
報告更多的內(nèi)容解讀可以點擊詳情,看到錯誤對應(yīng)的代碼行號,和錯誤詳情,以及相關(guān)檢測錯誤的解釋。
常見的FindBugs的警告:
- NP:Possible null pointer dereference,可能出現(xiàn)null的代碼。
- HE:重寫對戲那個的equals()方法,但是沒有重寫它的hashCode方法,或者相反的情況。
- SE:serializable錯誤
- ...其他常見錯誤可以參考文檔
什么時候運行?
什么時候運行是一個問題,一般情況下在原有的項目中加入FindBugs之后,可以檢測出一些以前的代碼存在的問題,所以在剛剛使用FindBugs的時候應(yīng)該做一次全面的檢查,解決掉對應(yīng)的問題。
之后的運行,一般可以在完成一個版本對應(yīng)功能開發(fā)完成之后可以檢查一次,防止新修改的代碼有潛在的bug,另一個時間點就是在每次修復(fù)完Bug之后,再運行一次,防止修復(fù)Bug的時候,造成了新的Bug。
總結(jié)
以上是生活随笔為你收集整理的Android-使用FindBugs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 天气预报
- 下一篇: 即使是一个技术人员,也需要知道沟通的重要