Java静态代码检测工具,主要用于代码的编码规范检测 。
通过分析源码,与已知的编码约定进行对比,以html的形式将结果展示出来。能检测什么?代码规范
目前不支持用户自定义检测规则,已有的规则中,有一部分规则是有属性的,例如设置ParameterNumber,可以设置最大参数个数max = ?
这里是支持的格式检测
apply plugin: 'checkstyle' task checkstyle(type: Checkstyle) { description 'Check code standard' group 'verification' configFile file('./code_quality_tools/checkstyle.xml') source 'src' include '**/*.java' exclude '**/gen/**' classpath = files() ignoreFailures = false }
其中,configFile属性就是用户指定的规则描述文件
Android Studio 提供的代码扫描工具
能检测什么?是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进,帮助我们发现代码结构/质量问题,同时提供一些解决方案
每个问题都有信息描述和等级
主要包括以下几个方面
Correctness:不够完美的编码,比如硬编码、使用过时 API 等
Performance:对性能有影响的编码,比如:静态引用,循环引用等
Internationalization:国际化,直接使用汉字,没有使用资源引用等
Security:不安全的编码,比如在 WebView 中允许使用 JavaScriptInterface 等
用户可以通过配置文件来自定义lint检测的内容,需要在主项目目录下,创建名为lint.xml的文件,构建时会自动识别,文件中
android { ... lintOptions { // 指定禁用哪些issue的检测 disable 'TypographyFractions','TypographyQuotes' // 指定除了默认issue外,还支持哪些issue enable 'RtlHardcoded','RtlCompat', 'RtlEnabled' // To enable checks for only a subset of issue IDs and ignore all others, // list the issue IDs with the 'check' property instead. This property overrides // any issue IDs you enable or disable using the properties above. check 'NewApi', 'InlinedApi' // 为true的情况下,遇到lint问题后退出检测 quiet true // 为true的情况下,出现error则停止构建 abortOnError false // 忽略警告信息 ignoreWarnings true } }
LintOptions所有的属性
执行
Java静态代码检测工具,通过字节码与已知错误模式列表进行对比匹配来查找潜在问题
主页
基于给定的问题列表,更多的是用于提前检测编码过程中潜在的,会导致运行异常的问题,例如使用了未初始化的引用,clone()方法的实现中没有调用父类的同名方法等,拥有GUI
错误模式列表
apply plugin: 'findbugs' task findbugs(type: FindBugs) { description 'Run findbugs' group 'verification' classes = files("$project.buildDir/intermediates/classes") source 'src' classpath = files() effort 'max' reportLevel = "high" excludeFilter file('./code_quality_tools/findbugs-exclude.xml') reports { xml.enabled = false html.enabled = true } ignoreFailures = false }
其中,excludeFilter指定的是过滤集合,此处的过滤是符合正则表达式的文件忽略哪些错误模板;
effort,指定值应为min,default或max其中之一。级别越高精度越高,发现的错误越多,不过代价是需要运行时间和消耗内存;
reportLevel,报告错误的优先级阈值。如果reportLevel设置为低,则会报告所有错误。如果设置为中等(默认),会报告中、高优先级错误。如果设置为高,则仅报告高优先级的错误
静态代码检测工具,目的是寻找编码过程中的代码缺陷,例如未使用过的变量,空的catch捕捉块,不必要的对象创建等等
主要适用于Java和Apex,同时也支持其他六种语言,xml方面支持比较鸡肋
支持通过gradle插件集成
提供了很多内建的检测规范,包括以下几个方面
编程最佳实践,例如AvoidPrintStackTrace,避免使用printStackTrace()方法,建议使用logger调用等代码结构方面、方法调用的实践 编码规范,例如CallSuperInConstructor子类构造函数中要求调用父类构造方法,必须在文件中声明包名等等 设计,代码结构方面,例如AvoidDeeplyNestedIfStmts要求避免if-else深层嵌套影响理解和逻辑问题,catch捕捉块避免再次抛出异常等 文档方面 隐患错误(error prone),例如AssignmentInOperand避免使用多元运算符赋值,这会使得代码变得复杂且难以理解 多线程规范,例如AvoidSynchronizedAtMethodLevel,使用代码块级别的同步,而不是方法级别的同步,方法级别的同步可能会在方法中增加新代码时出现问题 性能,例如AvoidArrayLoops数组之间的复制避免使用for循环,建议使用Arrays.copyOf或者其他api 安全性,授权码等信息建议使用外部文件调用而不是硬编码 额外的规则集
支持自定义规则,custom Rules,包括Java和XPath两种方式,pmd不会直接使用源码,使用的是JavaCC生成解析器来解析源码并且生成AST(Abstract Syntax Tree),提供有图形化编辑器bin/designer.bat
但是有一定的学习成本
对比 | 检测范围 | 支持扩展自定义规则集 | 支持规则集 | 检测范围 | 开源 | gradle插件 |
---|---|---|---|---|---|---|
styleCheck | java | 否 | 是 | 窄,单纯的编码规范 | 开源 | 支持 |
lint | java xml | 否 | 是 | 广,代码结构/质量问题 | 开源 | 支持 |
findbugs | java | 否 | 是 | 窄,基于问题模板的匹配 | 开源 | 支持 |
pmd | java | 是 | 是 | 广,是对比中最广的 | 开源 | 支持 |