相对于早期Android开发目前有很多的技术以及工具用于提高代码的质量其中就包含有静态代码分析技术,我们之前介绍过的Lint也是属于这类静态代码分析工具,它不仅能够找到Java代码层次的问题,还可帮你找到布局等XML文件中的问题,在工作中我们每次开发出一个新特性并释放版本的时候就有一个硬性的指标每个类型的Lint问题必须达到什么范围才能申请释放版本。
除了Lint我们今天将要介绍一款静态代码分析工具FindBugs,从字面意思很容易看出它的用处就是通过静态代码分析找出潜在的Bug。这个工具十分好用,我自己在开发中也在使用这个工具,并且可以减少很多因为一时疏忽倒置的bug。

官方网址

FindBugs Intellij 插件下载地址

Gradle FindBugs 插件使用说明

在Android Studio中安装FindBug:

FindBug在Android Studio中的安装方式和AS的其他插件一样就是到插件库里面搜索Findbug.点击Install,安装结束后重启一次AS即可。

安装完就会在AS的底部多出一个选项卡如下所示:

其中最左边的按钮有三大类,一类是FindBug寻找问题的范围,一类是查找完问题后显示问题的形式,这两个都可以分成文件级,类级别,包级别,模块级别,项目级别。还有一类是常用工具类以及导出结果的工具。

要启动FindBug可以通过上面面板的第一类按钮,或者通过右键弹出的菜单中找到FindBug选项。

下面是为了介绍FindBug的使用做出的一个简单的Bug。
通过FindBug就可以找到这个Bug并按照如下的形式显示出来:

Android 添加过滤

如果我们在没有进行任何过滤的情况下找到的结果可能会令人失望,它会把自动生成的代码也考虑在内。因此我们在进行Bug查找的时候首先需要添加过滤。
下面是过滤掉Android自动生成的代码的配置:

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!-- ignore all issues in resource generation -->
<Class name="~.*\.R\$.*"/>
</Match>
<Match>
<Class name="~.*\.Manifest\$.*"/>
</Match>
</FindBugsFilter>

另一个需要过滤的可能就是你测试用例的警告,可以使用如下方式进行过滤

<!-- ignore all bugs in test classes, except for those bugs specifically relating to JUnit tests -->
<Match>
<Class name="~.*\.*Test" />
<!-- test classes are suffixed by 'Test' -->
<Not>
<Bug code="IJU" /> <!-- 'IJU' is the code for bugs related to JUnit test code -->
</Not>
</Match>

在编写完这些过滤条件就可以在Android Studio中的(File > Settings->FindBugs-IDEA. -> filter选项卡中添加,下面是对应的页面:

我们还可以自动化运行FindBug静态代码分析,只要将如下的任务写到项目的gradle.build中:

apply plugin: 'findbugs'
task findbugs(type: FindBugs) {
ignoreFailures = false
effort = "default"
reportLevel = "medium"
excludeFilter = new File("${project.rootDir}/findbugs/findbugs-filter.xml")
classes = files("${project.rootDir}/app/build/intermediates/classes")
source = fileTree('src/main/java/')
classpath = files()
reports {
xml.enabled = true
html.enabled = true
xml {
destination "$project.buildDir/findbugs/findbugs-output.xml"
}
html {
destination "$project.buildDir/findbugs/findbugs-output.html"
}
}
}

具体的配置可以查看https://gradle.org/docs/current/dsl/org.gradle.api.plugins.quality.FindBugs.html。

结果分析

在结果的展示方面FindBug和Lint做的都不错,能够做到很详细得罗列出具体的原因,一般一看就明白很清晰,实在看不明白点击下每个项,从代码中也可以推测出具体的意思,这里就不展开介绍了。

Contents
  1. 1. 在Android Studio中安装FindBug:
  2. 2. Android 添加过滤
  3. 3. 结果分析