Jenkins构建Android项目持续集成之findbugs的使用
Findbugs简介
关于findbugs的介绍,可以自行百度下,这里贴下百度百科的介绍。findbugs是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。这组缺陷模式是可配置的,通过配置,可以过滤掉一些我们不想或不需要检测的问题。
findbugs在gradle中的配置
理论的部分就不多阐述了,我们直接来看看项目中怎么使用findbugs吧。
首先,在build.gradle引入findbugs插件
<code
class="hljs
bash">apply
plugin: 'findbugs'</code>
然后,添加一个task
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<codeclass="hljs>task"connectedAndroidTest")// ignoreFailurestrue effort"default" reportLevel"medium" //这里填写项目classes目录 classes"${project.rootDir}/andbase-core/build/intermediates/classes") source'src/main/java') classpath reports //只能开启一个 xml.enabledfalse html.enabledtrue }}</code> |
注意:凡是task有依赖connectedAndroidTest的,都需要连接着模拟器或者真机,否则会报错
以下是我build.gradle的内容:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<codeclass="hljs>apply'com.android.library'//代码覆盖率插件apply'jacoco'//findbugsapply'findbugs'android compileSdkVersion22 buildToolsVersion'22.0.1' defaultConfig minSdkVersion8 targetSdkVersion22 versionCode1 versionName"1.0" } buildTypes release minifyEnabledtrue proguardFiles'proguard-android.txt'),'proguard-rules.pro' } debug{ testCoverageEnabledtrue } } lintOptions abortOnErrorfalse } packagingOptions exclude'META-INF/NOTICE' exclude'META-INF/LICENSE' } jacoco{ version"0.7.4.201502262128" }}task"connectedAndroidTest")// ignoreFailurestrue effort"default" reportLevel"medium" //这里填写项目classes目录 classes"${project.rootDir}/andbase-core/build/intermediates/classes") source'src/main/java') classpath reports //只能开启一个 xml.enabledfalse html.enabledtrue }}task//,dependsOn:"connectedAndroidTest" group"Reporting" description"Generate reports{ xml.enabledfalse html.enabledtrue csv.enabledfalse } classDirectories dir"$buildDir/intermediates/classes/debug", excludes '**/*Test.class', '**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*' ] ) def'src/main/java'] additionalSourceDirs sourceDirectories additionalClassDirs executionData"$buildDir/outputs/code-coverage/connected/coverage.ec")}dependencies compile'libs','*.jar']) compile'com.android.support:appcompat-v7:22.2.1'}</code> |
然后在Terminal输入命令
|
1
|
<codeclass="hljs>gradlew |
执行成功之后,会在项目根目录下build\reports\findbugs生成findbugs.html文件,打开就是查虫结果

这里可以看到总体的一些警告情况。
但是当你往下查看具体的某些问题时,会发现一些R$anim 之类的

而在Android中,R文件是自动生成,我们查虫是不需要检查该文件的。这时候过滤配置就派上用场了。
findgbugs过滤器配置
在项目根目录下新建一个findbug_filter.xml文件,内容如下
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<codeclass="><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%2D%2D%3E--><findbugsfilter> <match> <!--{cke_protected}{C}%3C!%2D%2D%20ignore%20all%20issues%20in%20resource%20generation%20%2D%2D%3E--> <class"~.*\.R\$.*"> </class></match> <match> <class"~.*\.Manifest\$.*"> </class></match> <match> <class"~.*\.*Test"> <!--{cke_protected}{C}%3C!%2D%2D%20test%20classes%20are%20suffixed%20by%20'Test'%20%2D%2D%3E--> <not> <bug"IJU">20'IJU'%20is%20the%20code%20for%20bugs%20related%20to%20JUnit%20test%20code%20%2D%2D%3E--> </bug></not> </class></match></findbugsfilter></code> |
上面match到的是要过滤掉,而不是要捕捉的,所以我们过滤掉了R文件、manifest文件和测试用例类。
相应的,我们需要修改gradle配置,让过滤器生效,在task findbugs 配置如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<codeclass="hljs>task"connectedAndroidTest")// ignoreFailurestrue effort"default" reportLevel"medium" //过滤器 excludeFilternew"${project.rootDir}/findbug_filter.xml") //这里填写项目classes目录 classes"${project.rootDir}/andbase-core/build/intermediates/classes") source'src/main/java') classpath reports //只能开启一个 xml.enabledfalse html.enabledtrue }}</code> |
然后在Teminal再执行gradlew findbugs,重新查看报告,之前的那些关于‘R$’的警告都没有了,说明过滤器生效了。
再者,我们可能有这样的需求,可能每个人的查看报告的侧重点不同,所以想,报告是否可以更个性化一些。同样的,我们可以根据过滤器实现。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<codeclass="><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%2D%2D%3E--><findbugsfilter> <match> <!--{cke_protected}{C}%3C!%2D%2D%20ignore%20all%20issues%20in%20resource%20generation%20%2D%2D%3E--> <class"~.*\.R\$.*"> </class></match> <match> <class"~.*\.Manifest\$.*"> </class></match> <match> <class"~.*\.*Test"> <!--{cke_protected}{C}%3C!%2D%2D%20test%20classes%20are%20suffixed%20by%20'Test'%20%2D%2D%3E--> <not> <bug"IJU">20'IJU'%20is%20the%20code%20for%20bugs%20related%20to%20JUnit%20test%20code%20%2D%2D%3E--> </bug></not> </class></match> <!--{cke_protected}{C}%3C!%2D%2D%E8%BF%87%E6%BB%A4%E6%8E%89%E4%B8%80%E4%BA%9Bbug%2D%2D%3E--> <match> <!--{cke_protected}{C}%3C!%2D%2D1%E3%80%81%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%2D%2D%3E--> <!--{cke_protected}{C}%3C!%2D%2D%3CBug%20category%3D%22PERFORMANCE%22%20%2F%3E%2D%2D%3E--> <!--{cke_protected}{C}%3C!%2D%2D2%E3%80%81%E4%B8%80%E8%88%AC%E6%AD%A3%E7%A1%AE%E6%80%A7%E9%97%AE%E9%A2%98%2D%2D%3E--> <!--{cke_protected}{C}%3C!%2D%2D%3CBug%20category%3D%22CORRECTNESS%22%20%2F%3E%2D%2D%3E--> <!--{cke_protected}{C}%3C!%2D%2D3%E3%80%81%E5%A4%9A%E7%BA%BF%E7%A8%8B%E6%AD%A3%E7%A1%AE%E6%80%A7%E9%97%AE%E9%A2%98%2D%2D%3E--> <!--{cke_protected}{C}%3C!%2D%2D%3CBug%20category%3D%22MT_CORRECTNESS%22%20%2F%3E%2D%2D%3E--> <!--{cke_protected}{C}%3C!%2D%2D4%E3%80%81%E6%81%B6%E6%84%8F%E4%BB%A3%E7%A0%81%EF%BC%8C%E6%9C%89%E5%8F%AF%E8%83%BD%E6%88%90%E4%B8%BA%E6%94%BB%E5%87%BB%E7%82%B9%2D%2D%3E--> <!--{cke_protected}{C}%3C!%2D%2D%3CBug%20category%3D%22MALICIOUS_CODE%22%20%2F%3E%2D%2D%3E--> <or> <!--{cke_protected}{C}%3C!%2D%2DField%20names%20should%20start%20with%20a%20lower%20case%20letter%2D%2D%3E--> <bugcode"Nm"> <!--{cke_protected}{C}%3C!%2D%2DMethod%20ignores%20exceptional%20return%20value%20or%20Return%20value%20of%20method%20without%20side%20effect%20is%20ignored%2D%2D%3E--> <bugcode"RV"> <!--{cke_protected}{C}%3C!%2D%2D%E5%9B%BD%E9%99%85%E5%8C%96%2D%2D%3E--> <bugcode"Dm"> </bugcode></bugcode></bugcode></or> </match></findbugsfilter></code> |
其中,
|
1
|
<codeclass="hljs><bug"MT_CORRECTNESS"></bug></code> |
是以一大类bug相关的来设置过滤器的,category的值有哪些呢?有PERFORMANCE(性能问题)、CORRECTNESS(一般正确性问题)、MT_CORRECTNESS(多线程正确性问题)、MALICIOUS_CODE(恶意代码),这四大类。
|
1
|
<codeclass="hljs><bugcode"Dm"></bugcode></code> |
而BugCode是category类下的细分,而它们的name值有哪些呢,这里可以从报告中查看得知:

上图是Performance Category,Code列就是BugCode name的可选值。
通过过滤器的配置,我们可以个性化的定制报告了。
Jenkins配置findbugs
增加构建后操作步骤


看说明,该路径配置是获取xml文件的,但是,之前我们获取到的是html文件,怎么办?所以,这里我们要修改一下gradle配置。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<codeclass="hljs>task"connectedAndroidTest")// ignoreFailurestrue effort"default" reportLevel"medium" //过滤器 excludeFilternew"${project.rootDir}/findbug_filter.xml") //这里填写项目classes目录 classes"${project.rootDir}/andbase-core/build/intermediates/classes") source'src/main/java') classpath reports //只能开启一个 xml.enabledtrue html.enabledfalse }}</code> |
我们将xml.enabled设置为true,html.enabled设置为false。
然后,构建命令也要添加findbugs

邮箱也相应添加findbugs报告

保存配置,立即构建。如果运行正常的话,可以看到如下的报告

你也可以从邮箱内容打开链接查看报告

总结
至此,本系列也差不多讲完了。这套持续集成是我们公司正在用的,所以实用性还是蛮高的,用起来有很多好处,不管是对开发、测试都有很大的便利性,大大的提高了项目的质量和可控性。往大的说,它也为敏捷开发提供了可行性基础。第一次写这样的系列,有什么错的或者建议,希望能看到你的提出。
看下其他文章:
1、Jenkins构建Android项目持续集成之简介篇
2、Jenkins构建Android项目持续集成之Jenkins的安装篇
3、Jenkins构建Android项目持续集成之系统配置篇
4、Jenkins构建Android项目持续集成之创建项目
5、Jenkins构建Android项目持续集成之单元测试及代码覆盖率
6、Jenkins构建Android项目持续集成之findbugs的使用
Jenkins构建Android项目持续集成之findbugs的使用的更多相关文章
- Jenkins构建Android项目持续集成之单元测试及代码覆盖率
单元测试 在软件开发中一直在推崇TDD(测试驱动开发),但是一直不能被有效的执行或者并不是真正的测试驱动开发(先开发后写单元测试),因为我们懒!而Android开发又是大多应用层面的开发,很多都是和视 ...
- 使用jenkins进行Android的持续集成
关于持续集成的定义和意义可以参考它的 百度百科 主要意义有以下几点: 减少风险 减少重复过程 任何时间.任何地点生成可部署的软件 增强项目的可见性 建立团队对开发产品的信心 持续集成的实施 持续集成的 ...
- jenkins部署github项目持续集成
一.先介绍正向代理和反向代理 正向代理 反向代理 二.安装反响代理得到固定域名 http://www.xiaomiqiu.cn/ 三.Jenkins与Github集成 配置前要求: 1.Jenkins ...
- Jenkins + testNg + maven 项目持续集成
搞了一整天,梳理下关键点: 1.项目的pom.xml要配置插件,同时指定testng.xml文件的位置.就被这个卡了好久 <properties> <maven-surefire-p ...
- Net 项目构建基于Jenkins + Github + Mono 的持续集成环境
Net 项目构建基于Jenkins + Github + Mono 的持续集成环境 阅读目录 1 安装 2 配置 3 测试 在Redhat enterprise 6.5 的服务器上,为在gutub 上 ...
- Jenkins +Maven+Tomcat+SVN +Apache项目持续集成构建
详解Jenkins +Maven+Tomcat+SVN +Apache项目持续集成 一:前言 1. Jenkins jenkins版本大全http://mirrors.jenkins-ci.org/ ...
- Framework项目持续集成(jenkins)及集合SonarQube
目录 Framework项目持续集成及集合SonarQube - 前言 CI/CD是什么 -- jenkins 什么是sonarqube?什么是CodeReview? 什么是sonarqube? 什么 ...
- Selenium Web 自动化 - 项目持续集成(进阶)
Selenium Web 自动化 - 项目持续集成(进阶) 2017-03-09 目录 1 背景及目标2 环境配置 2.1 SVN的安装及使用 2.2 新建Jenkins任务3 过程分析 1 背景 ...
- Selenium Web 自动化 - 项目持续集成
Selenium Web 自动化 - 项目持续集成 2017-02-13 目录 1环境准备 1.1 安装git 1.2 安装jenkins 1.3 安装jenkins插件 1.4 jekins ...
随机推荐
- Android图像数据传递到C++的一些坑
最近在做一个Android图象识别的app, 通过相机预览或者是拍照功能获取图像数据,然后将图像数据传递到本地C++的图像识别so库.在这个过程中花的时间最多的就是数据传输问题.谨以此坑,警示未来! ...
- java编码GBK的不可映射字符
编译java文件时,提示编码GBK的不可映射字符. 主要原因:windows 默认编码方式为GBK,用javac编译时,中文按照GBK解析,但是文件内容编码格式不是GBK. 解决:若编译单个文件指定编 ...
- Object对象和function对象
Obejct对象 1.ECMAScript 中的 Object 对象与 Java 中的 java.lang.Object 相似. 2.ECMAScript中的所有对象都由Object对象继承而来,Ob ...
- 用ASOS建立自定义的OpenID 服务(一)-----------简介
翻译文章 原文地址 这一系列共包括9个部分,这是第一部分,下面是英文原文地址: Introduction Choosing the right flow(s) Registering the midd ...
- linux下的打包与压缩
linux压缩或解压缩工具有很多,除了已经很少有人使用的compress外,现在常用的还有tar,bzip2,xz 和gziplinux压缩或解压缩工具有很多,除了已经很少有人使用的compress外 ...
- python之闭包与装饰器
python闭包与装饰器 闭包 在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数. 示例: #-------------------------------- ...
- pandas读取各类sql数据源
大数据分析中,我们经常需要使用pandas工具读取各类数据源并将结果保存到数据库中. 本文总结了一些读取和写入常用数据库数据的一些方法,包括mysql,oracle,impala等. 其中读取数据库数 ...
- install atom markdown preview plus error
Installing "markdown-preview-enhanced@0.15.2" failed.Hide output- npm ERR! Darwin 17.2.0 n ...
- centos 手动增加swap分区
SWAP是Linux中的虚拟内存,用于扩充物理内存不足而用来存储临时数据存在的.它类似于Windows中的虚拟内存.在Windows中,只可以使用文件来当作虚拟内存.而linux可以文件或者分区来当作 ...
- FFT模板(多项式乘法)
FFT模板(多项式乘法) 标签: FFT 扯淡 一晚上都用来捣鼓这个东西了...... 这里贴一位神犇的博客,我认为讲的比较清楚了.(刚好适合我这种复数都没学的) http://blog.csdn.n ...