FindBugs目前,主要有三种形式使用,GUI形式、插件形式、Ant脚本形式,在这里只讲述FindBugs作为插件,在Android Studio中的应用。
一、FindBugs基础知识
(1)FindBugs—代码缺陷分类
根据缺陷的性质,大致可以分为下列几类:

1)Bad practice:不好的做法,代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode方法等;
2)Malicious code vulnerbility:恶意的代码漏洞;
3)Correctness:可能不正确,比如错误的强制类型转换;
4)Performance:潜在的性能问题;
5)Security:安全性;
6)Dodgy code:糟糕的代码,FindBugs团队认为该类型下的问题代码导bug的可能性很高;
7)Experimental:实验;
8)Multithreaded correctness:关注于同步和多线程问题;
9)Internationalization:国际化
(2)在Android Studio中使用FindBugs-IDEA插件
1)安装FindBugs插件
Android Studio —> Preference —> Plugins—> Browse Repositories ...
重启
2)FindBus菜单栏和工具栏如下


3)FindBugs工具栏介绍

区域1:选择分析文件,主要包括有:Analyze Current file、Analyze Class (non-anonymous) under Cursor、Analyze Package(s) files、Analyze Module files、
Analyze Package files、Analyze Scope files等;
其中比较重要的是:Analyze Scope files(如图所示),可以设置Custom Scope,其中VCS Scope比较nice(在Code Review前,就可以利用findBugs检查代码)

区域2:FindBugs结果分类,主要包括有:Group by bug category、Group by class、
Group by package、Group by bug rank;
区域3:导入/导出分析结果(XML/HTML)
(3)实例分析
FindBugs面板主要包括三部分:1)FindBugs结果分类区、2)Select a bug to preview、3)Bug Details,如下图所示为一个SIC问题,内部类最好为static类。

同样,连遍历HashMap性能问题,findBugs也能扫出来(牛!)

结 论:使用keySet形式遍历HashMap性能不如entrySet
常见bug分类如下:

二、FindBugs使用进阶
(1)FindBugs设置部分
FindBugs设置主要包括:General、Report、Filter、Detector、Annotate、Share等及部分。
1)General add Plugins
如Add Findbugs plugin for Android

2)Report部分
FindBugs报告相关设置,报告等级、报告结果分类(是否显示相应类型)

3)Filter过滤器(相当重要)

exclude忽略指定的class/package (以xml定义过滤的命名)
include只输出指定的class/package (以xml定义过滤的命名)
filter内容如下:

使用filter前后对比如下:


很明显,RadioUtil和TouchDelegateGroup文件被过滤掉了
详见:http://findbugs.sourceforge.net/manual/filter.html#d0e1880
4)Detector
可以选择所要进行检查的相关的Bug Pattern条目,你可以根据需要选择或去掉相应的检查条件
5)Annotate
Bug注解,默认设置即可。

实例如下:左侧黄色、红色图标为GutterIcon

(2)在Gradle中添加findbugs
1)Findbugs在gradle中配置


2)在gradle中执行


3)输出Report

网友评论