Android-使用FindBugs

在开发Android的过程当中,会出现一些比较不容易发现的Bug,好比没有对null作判断,会出现'NullPointException'的崩溃,下面的代码就会出现崩溃:html

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就最好不过的。还好有一种工具能够解决这个问题:FindBugsjava

FindBugs

FindBugs是一个Java静态分析工具,用来检查类或者jar文件,查找代码可能存在的问题。FindBugs官网地址:http://findbugs.sourceforge.net/
检测完成以后会生成一份详细的报告,借助这份报告能够找到潜在的Bug,好比前面说到的NullPointException,还能够检查特定的资源没有关闭,例如:查询数据库没有调用Cursor.close()等。
若是采用人工的方式很难发现相似的bug,或者有一些Bug不会发现,直到运行时才出现,还有多是一直没有出现,别人调用的时候没有作检查就直接使用了.....
FindBugs能够自动化化的分析代码,帮助开发者提升代码质量,固然它能够无难度的在Android上面运行,经过FindBugs的检查可让App的运行更加的稳定。数据库

Gradle插件

FindBugsGradle中作一个插件存在的,能够在Android Studio中直接使用:app

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文件,才能对代码进行静态分析。ui

  • ignoreFailures:有警告错误的时候也是容许构建。spa

  • reportLevel:报告的级别,Low,Medium,High通常来讲咱们首先关注的是高级别的报告,再关注低一级别的报告。.net

  • classessource分别是对应的.classe文件夹地址,和源代码文件地址。插件

  • repoets指定报告类型,有两种方式xmlhtml,只容许一种输出格式。

定义完成以后,同步下Gradle,以后在右侧的Gradle的菜单中找到对于的Module,就能够在Tasks中找到对应的findBugs任务,点击便可运行。

FindBugs报告

运行完成以后,会获得对应的一个相似下图的报告:

报告
更多的内容解读能够点击详情,看到错误对应的代码行号,和错误详情,以及相关检测错误的解释。
常见的FindBugs的警告:

  • NP:Possible null pointer dereference ,可能出现null的代码。

  • HE:重写对戏那个的equals()方法,可是没有重写它的hashCode方法,或者相反的状况。

  • SE:serializable错误

  • ...其余常见错误能够参考文档

何时运行?

何时运行是一个问题,通常状况下在原有的项目中加入FindBugs以后,能够检测出一些之前的代码存在的问题,因此在刚刚使用FindBugs的时候应该作一次全面的检查,解决掉对应的问题。
以后的运行,通常能够在完成一个版本对应功能开发完成以后能够检查一次,防止新修改的代码有潜在的bug,另外一个时间点就是在每次修复完Bug以后,再运行一次,防止修复Bug的时候,形成了新的Bug

相关文章
相关标签/搜索