简评: 作者在文中提到的三个静态代码分析工具不是互相替代的关系,各有各的侧重点,如果有需要完全可以同时使用。

静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。

对于 Android 来说用得最多的三个静态代码分析工具当属:

  • Lint
  • PMD
  • Findbugs

Lint

Lint 是 Google 提供给 Android 开发者的静态代码分析工具,能帮助开发者优化代码和找到潜在的 bug。

配置:

在项目中创建 script-lint.gradle 文件:

android {
lintOptions {
lintConfig file("$project.rootDir/tools/rules-lint.xml")
htmlOutput file("$project.buildDir/outputs/lint/lint.html")
warningsAsErrors true
xmlReport false
}
}

其中两个重要的属性:

  • lintConfig : lint 规则文件的路径。
  • htmlOutput : html 报告生成的路径。

之后在 build.gradle 文件中引用:

apply plugin: 'com.android.application'
apply from: "$project.rootDir/tools/script-lint.gradle" ...

测试:

运行 ./gradlew lint 命令,就可以在上面设置的 htmlOutput 路径下找到 lint.html 文件,打开后就会看到类似下面的提示:

Findbugs

Findbugs 分析的是 Java 字节码,能识别出上百种的潜在错误。

配置:

创建 script-findbugs.gradle文件:

apply plugin: 'findbugs'

task findbugs(type: FindBugs) {
excludeFilter = file("$project.rootDir/tools/rules-findbugs.xml")
classes = fileTree("$project.buildDir/intermediates/classes/dev/debug/com/dd")
source = fileTree("$project.rootDir/src/main/java/com/dd/")
classpath = files() reports {
xml.enabled = false
html.enabled = true
html.destination = "$project.buildDir/outputs/findbugs/findbugs.html"
}
}

属性:

  • excludeFilter:Findbugs 规则文件的路径。
  • classes:classes 文件的路径。
  • source:源码的路径。
  • html.destination:html 报告的生成地址。

同样需要在 build.gradle 中进行引用:

apply plugin: 'com.android.application'
apply from: "$project.rootDir/tools/script-findbugs.gradle" ...

测试:

下面的这段代码:

// MainActivity.java

...

private void someMethod(int variable) {
switch (variable) {
case 1:
System.out.println("1");
case 2:
System.out.println("2");
}
} ...

运行./gradlew findbugs命令,findbugs.html 中就会生成检测结果,类似于下面这样:

PMD

PMD 能发现常见的编程缺陷,比如未使用的变量、空的 catch 块、不必要的对象等等。

配置:

创建 script-pmd.gradle文件:

apply plugin: 'pmd'

task pmd(type: Pmd) {
ruleSetFiles = files("$project.rootDir/tools/rules-pmd.xml")
source = fileTree('src/main/java/') reports {
xml.enabled = false
html.enabled = true
html.destination = "$project.buildDir/outputs/pmd/pmd.html"
}
}

属性:

  • ruleSetFiles:规则文件路径。
  • source:源码路径。
  • html.destination:检测结果的 html 文件所在路径。

同样,再在 build.gradle 文件中引用:

apply plugin: 'com.android.application'
apply from: "$project.rootDir/tools/script-pmd.gradle" ...

测试:

// MainActivity.java

...

private void someMethod(int a, int b, int c, int d) {
if (a > b) {
if (b > c) {
if (c > d) {
if (d > a) {
// some logic
}
}
}
}
} ...

执行 ./gradlew pmd 命令,在 html.destination 设置的路径下找到 pmd.html,就能够看到如下的检测结果:

上面提到的所有文件,和配置项都可以在作者的这个项目中找到:dmytrodanylyk/template


原文链接:Configuring Android Project — Static Code Analysis Tools

推荐阅读聊聊 Android StateListAnimator

欢迎关注微信号「极光开发者」,不定期赠书活动!

Android 静态代码分析工具的更多相关文章

  1. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  2. C++静态代码分析工具推荐——PVS-Studio

    长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...

  3. 来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧.

  4. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  5. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  6. java静态代码分析工具infer

    infer是一个静态代码分析工具,探测bugs. 主要支持Java.C/C++ 安装:brew install infer 在线展示:https://codeboard.io/projects/115 ...

  7. Https与Http,SSL,DevOps, 静态代码分析工具,RFID, SSH, 非对称加密算法(使用最广泛的一种是RSA), 数字签名, 数字证书

    在URL前加https://前缀表明是用SSL加密的. 你的电脑与服务器之间收发的信息传输将更加安全. Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定. http和h ...

  8. Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)

    目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...

  9. 常用Java静态代码分析工具的分析与比较

    给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...

随机推荐

  1. golang中,unsafe.sizeof到底是干嘛的?

    https://www.golangtc.com/t/5ad833404ce40d2654053485 小生初学Go,有一点不懂,今天为了知道空结构体到底占多大的空间的时候,去百度说用unsafe.s ...

  2. 代码实现:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

    package com.loaderman.Coding; import java.util.Scanner; /*利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分 ...

  3. 阶段3 2.Spring_02.程序间耦合_6 工厂模式解耦

    使用类加载器去加载文件 定义getBean的方法 运行测试方法报错. 在工厂类里面打印输出BeanPath 删除dao的实现类 没有dao的实现类.再次运行程序.编译不报错.运行时报错 以上就是工厂模 ...

  4. 配置pip镜像源(转)

    使用pip安装python扩展时,如若没有配置国内镜像源,在未翻墙的情况下,其下载速度将会特别缓慢.因此,有些时候我们必须使用国内镜像源,来解决pip下载安装速度慢的问题,比较常用的国内镜像包括: 阿 ...

  5. Python学习之==>Socket网络编程

    一.计算机网络 多台独立的计算机通过网络通信设备连接起来的网络.实现资源共享和数据传递.在同一台电脑上可以将D盘上的一个文件传到C盘,但如果想从一台电脑传一个文件到另外一台电脑上就要通过计算机网络 二 ...

  6. 【疑难杂症】new Date() 造成的线程阻塞问题

    代码如下 package com.learn.concurrent.probolem; import java.util.Date; import java.util.concurrent.Count ...

  7. scanf("%[^\n]",str)

    题目地址 scanf()   遇到空格结束输入 可以用 scanf("%[^\n]" , str)   输入一行数据包括空格,直到遇到换行符 ' \n ' #include< ...

  8. P1596 【[USACO10OCT]湖计数Lake Counting】

    可爱的题面君~~ 个人感觉这题还是很简单的,就是一个完全不加工的找联通块个数 个人解题思路是先读入,然后循环一遍,遇到水就dfs,并把这个w所在的联通块“删除”,并在答案上加一 最后输出答案 具体注释 ...

  9. IDEA github 上传项目, 拉取, 删除

    1.IDEA登录github账号 settings -> Version Controller -> GitHub 用户名密码登录 或token登录都可以 2.VCS -> impo ...

  10. 模板中for 的使用

    from flask import Flask,render_template app = Flask(__name__) app.config.update( DEBUG = True, ) @ap ...