还不会用FindBugs?你的代码质量很可能令人堪忧
前言
项目中代码质量,往往需要比较有经验的程序员的审查来保证。但是随着项目越来越大,代码审查会变得越来越复杂,需要耗费越来越多的人力。而且程序员的经验和精力都是有限的,能审查出问题必定有限。而在对代码质量要求越来越严格的当今IT界,这无疑是个矛盾点。幸运的是,不少公司发布了代码扫描工具,来检测代码中存在的问题。尽管它们无法扫描出所有的bug,但仍然能够为我们的工作带来极大的便利。其中FindBugs就是这其中的佼佼者,本文将结合Android Studio来介绍该工具的使用。
一、FindBugs简介
FindBugs是一款Java缺陷检测工具,它通过分析静态字节码可以查找出200多种错误模式,例如空指针取消引用、无限递归循环、Java库的错误使用和死锁等。
二、安装FindBugs插件
Android Studio默认是没有安装FindBugs插件的,需要我们自己进行安装。所幸Android Studio提供了丰富的插件,可以直接从库插件库中进行安装。当然也可以自己手动从网上下载好该插件,然后安装。这里将两种方法都简单介绍一下。
1、从Android Studio插件库中安装
点击面板中主菜单Files > Settings > Plugs 就可以 进入到插件中心,如下图所示:
②处可以输入要查找的插件名,如果安装了,并满足③处筛选条件,会显示在④处列表中。
③处选择筛选范围,
④处用于显示在②处和③处所指定条件下查询到的插件列表,右边的选择框可选中表示该插件可以用,否则表示不可用。
⑤处显示选择的插件的相关信息
⑥处是一个入口,可以跳转去安装JetBrains提供的插件。
⑦处用于跳转到从仓库中浏览并安装插件。
⑧处用于安转下载到本地的插件。
这里我们选择从“Browse Repositories”进入安装,进入后搜索“FindBugs”会显示如下界面,我们选择“FindBugs-IDEA”进行安装。(我这里是已经安装过了,如果没有安装,右边会显示“install”按钮。)
安装完成后,返回到Plugs主面板,搜索“FindBugs”就会显示如下界面,如果不想用了,可以点击“Uninstall”来卸载。
当安装完成后,会提示重启AS,重启动后即可使用了。
2、从磁盘安装
首先手动下载该插件,这里提供下一个链接:https://pan.baidu.com/s/1qbtsnCby-xpmbC9jBdfMSg ,提取码:fuae。
仍然是从上述的插件面板中操作,选择第⑧点击“Install plugin from disk”后选择下载好的插件,按照提示操作即可。
三、FindBugs的启动
安装成功后,有两种方式可以启动FindBugs的分析功能。
1、从控制面板中启动
在AS界面的左下角有个“FindBugs-IDEA”按钮,如下图红框所示,通过点击该按钮,可以调起工具窗口面板,通过该窗口可以开始启动分析(工具窗口面板及其使用,后面会介绍)。
2、通过右键菜单启动
在AS界面点击右键,在弹出的菜单栏中可以看到“FindBugs”选项,子菜单栏中可以选择要分析的文件范围(AS的不同区域点击右键,“FindBugs”选项的位置和子菜单也会略有不同)。
四、FindBugs的基本使用
分析完成后,默认会显示如下界面。这里对该面板各个区域进行介绍。
1、工具窗口
该区域提供了众多的选项,可以方便设置分析范围和展示分析结果。
这里对其中几项再详细进行说明。
(1)bug的类型
按照第12点根据bug类型分组后,会显示如下界面:
当前模块分析结果只展示了部分类型的bug,实际上FindBugs可以展示9中类型:
1)Bad practice
不好的实践。比如不规范的类、方法、变量的命名;调用有返回值的方法时没有正确使用返回值等。
2)Dodgy code
可疑的代码。比如使用switch/case语法,没有使用default;数据计算后的精度丢失等。
3)Malicious code vulnerability
恶意的代码漏洞,如果代码公开,可能导致恶意的修改和攻击。比如该使用final修改的常量没有使用final,导致该常量可能被修改;该使用protected修饰的,却使用public修饰,这不利于对成员的保护;
4)Correctness
正确性问题,不正确使用会导致报错。比如该判断空指针的地方没有判空,这会导致空指针异常;构造函数中使用了没有复制的变量,如果使用时对该变量有判空,该语句不会执行,而如果没有判空,则会报空指针异常。
5)Performance
性能问题。比如定义了某些变量却从未被读取过;定义的变量从未被使用过等,在执行过程中会占用空间和时间,建议删掉;内部类应该加上static修饰符;可以采用更高效的函数来实现功能等。
6)Multithreaded correctness
多线程正确性,主要是多线程环境下线程安全问题。比如volatile的不正确使用;该使用syncronized关键字的地方没有使用等。
7)Experimental
实验。
8)Security
安全性问题。要扫描到安全方面的bug,需要在设置>FindBugs-IDEA >General > Plugins中添加Find Security Bugs插件。这里主要聚焦于安全方面的问题,比如向sdcard等存储卡中写数据,其中可能包含私人信息;写入sdcard等存储器数据容易被其它程序读取;使用的加密算法不够安全等。
9)Internationalization(I18N)
国际化问题。比如字符串与字节相互转换时的字符集问题等,有些地方需要显示指定字符集,因为不同平台或语言使用的字符集有差异。
这里仅对这几个大类简单的介绍,由于能检测到的错误项非常多,无法一一举例。在实际使用过程中,可以查看具体项,根据提示来解决问题。当然,有些问题,FindBugs报出来了,但我们实际工作中可能想忽略掉,不希望被检测,可以在设置中选择要分析的项,后面会介绍该设置项。
(2)Bug的严重级别
第15点中,按照bug严重级别进行排列,分析结果会以如下形式展示,每一项点击后可以查看更详细的列表:
其严重级别分为分为如下4个等级:
1)Of Concren 建议, 如果遵循能更好的完善代码
2)Troubling 不好的, 可能会引发不良后果
3)Scary 严重问题, 在某种情况下一定会出现问题
4)Scariest 非常严重, 已经影响到当前程序功能
(3)设置
进入到FindBugs的高阶设置面板。
2、分析结果显示区
以树状结构展示分析后的结果,可以通过工具窗口中的选择,来决定该区域是展开还是关闭,以什么对结果进行分组,需要显示哪些内容等。
3、bug预览区
当选择具体某一个bug时,此处会显示问题点所在的上下文环境。
4、bug详情区
这部分展示了选中的bug的详细信息,比如所在的类,方法,有问题的字段,当期bug是什么样的问题,为什么需要修改,修改建议等。
五、FindBugs的高阶使用
控制面板中提供了“设置”入口,从这个入口可以配置FindBlugs的一些更高阶的用法。比如添加安全相关问题的扫描,过滤哪些文件不扫描,设置报告文档中不包含那些问题项等。这一节介绍其中比较常用的一些功能点。该设置面板的路径为:设置 > FindBugs-IDEA。
1、General
这一栏总共有六项
(1)Compile affected files before analyze 在分析之前进行编译
(2)Analyze affected files affter comlplie 在变动的文件编译之后分析
(3)Analyze affected files after auto make 在自动Make之后分析变动的文件 自动
(4)Run analyze in background 在后台分析,不显示进度条窗口
(5) Active toolwindow on run
(6)Plugins
这部分可以再添加一些加强FindBugs功能的插件,前面提到过的“Security”,就需要用到这里的“find Security Bugs”插件来扫描。
2、Report
这一项中有多个选项,用于选择报告文件中要包含的内容。
3、Filter
过滤器,用于过滤哪些文件需要扫描,哪些不用扫描。
4、Detector
用于配置检测器列表,选中的检测器将参与到扫描中。
5、Annotate
注解相关的设置,这一部分均选择默认即可。
6、Share
共享设置文件,一般可以忽略。
结语
本文只介绍了FindBugs常见的一些使用方法,一定还有很多很牛的功能,希望读者们多多探索,多多交流,共同进步,谢谢!
还不会用FindBugs?你的代码质量很可能令人堪忧的更多相关文章
- 提高代码质量 CheckStyle FindBugs PMD
提高代码质量-工具篇 注:这是一篇翻译文章,原文:How to improve quality and syntax of your Android code,为了理解连贯,翻译过程中我修改了一些陈述 ...
- idea 安装findBugs 可以做代码扫描,也可以导出扫描结果生成扫描报告
idea 安装findBugs 可以做代码扫描,也可以导出扫描结果生成扫描报告 https://my.oschina.net/viakiba/blog/1838296 https://www.cnbl ...
- 测试框架:使用SONAR分析代码质量
介绍 Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd.checkstyl ...
- 用 Eclipse 插件提高代码质量
如果能在构建代码前发现代码中潜在的问题会怎么样呢?很有趣的是,Eclipse 插件中就有这样的工具,比如 JDepend 和 CheckStyle,它们能帮您在软件问题暴露前发现这些问题.在 让开发自 ...
- 使用JSLint提高JS代码质量
随着富 Web 前端应用的出现,开发人员不得不重新审视并重视 JavaScript 语言的能力和使用,抛弃过去那种只靠“复制 / 粘贴”常用脚本完成简单前端任务的模式.JavaScript 语言本身是 ...
- 提高 Android 代码质量的4个工具
在这篇文章中,我将通过不同的自动化工具如CheckStyle,FindBugs,PMD以及Android Lint来介绍(如何)提高你的安卓代码质量.通过自动化的方式检查你的代码非常有用,尤其当你在一 ...
- ESLint 检查代码质量
利用 ESLint 检查代码质量 其实很早的时候就想尝试 ESLint 了,但是很多次都是玩了一下就觉得这东西巨复杂,一执行检查就是满屏的error,简直是不堪入目,遂放弃.直到某天终于下定决心深入看 ...
- 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...
- RubyCritic:一款不错的检测代码质量工具
关注代码质量是高效开发必须要做的一件事,那么在 Ruby 开发的过程中,是否有什么好的代码质量检测工具呢?下面由 Ruby 工程师路英瑞介绍一下 RubyCritic--一款还不错的代码质量检测工具. ...
随机推荐
- jar包冲突了?如何确定是和哪个jar包冲突了?
导读:工程编译的时候好好地,怎么一运行就报各种的NoSuch***Error,猜测可能是jar包冲突了,但是究竟是和哪个jar包冲突了呢. 关键词:jar包冲突,NoSuchFileldError,N ...
- ES 32 - Elasticsearch 数据建模的探索与实践
目录 1 什么是数据建模? 2 如何对 ES 中的数据进行建模 2.1 字段类型的建模方案 2.2 检索.聚合及排序的建模方案 2.3 额外存储的建模方案 3 ES 数据建模实例演示 3.1 动态创建 ...
- HttpClient连接池的一些思考
前言 使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclien ...
- Locomotion和Navigation的区别
Locomotion和navigation两者都是移动.漫游的意思.但是locomotion是一个比navigation更大的概念,它指的是所有的第一人称视角的变换(first-person moti ...
- CSS 预处理语言之 Scss 篇
简介 1. Sass 和 Scss Sass 和 Scss 其实是同一种东西,我们平时都称之为 Sass:Scss 是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强 ...
- mobaxterm和CRT的文件上传
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/submarineas/article/de ...
- html、css以及javascript的注释方式
HTML:<!--注释内容 -->; CSS:/* 注释内容*/ JS: //注 释内容; 或者块/* 注释内容 */, sublime中注释方法:选中注释内容+ctrl+/ , ...
- 重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源
作者: OAM 项目负责人 导读:2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Op ...
- MySQL生僻函数
0X01 字符串函数 STRCMP STRCMP(expr1,expr2) 若所有的字符串均相同,则返回STRCMP(),若根据当前分类次序,第一个参数小于第二个,则返回 -1,其它情况返回 1 . ...
- python学习-类的继承
1.继承的语法 2.多继承 3.override(子类重写父类的方法) 4.子类调用父类中被重写的实例方法 5.使用super函数调用父类的构造方法