安卓 常用静态代码分析工具(CheckStyle,findbugs,pmd,lint)

静态代码分析工具介绍:

1.CheckStyle

CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来.

CheckStyle检验的主要内容

·Javadoc注释

·命名约定

·标题

·Import语句

·体积大小

·空白

·修饰符

·块

·代码问题

·类设计

·混合检查(包括一些有用的比如非必须的System.out和printstackTrace)

从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范的检查

使用配置:

1.写规则文件

1.1.规则文件demo/config/quality/checkstyle/square-picasso-checkstyle.xml(demo/config/quality/checkstyle是我自定义的文件夹路径)

点击下载:https://pan.baidu.com/s/1boXFrxt

了解规则文件配置:http://blog.csdn.net/yang1982_0907/article/details/18086693

1.2.抑制警告规则demo/config/quality/checkstyle/suppressions.xml

点击下载:https://pan.baidu.com/s/1dE7mOYd

2.在工程的检查项目的build.gradle下配置

apply plugin: 'checkstyle'

task checkstyle(type: Checkstyle) {

    configFile file("${project.rootDir}/config/quality/checkstyle/square-picasso-checkstyle.xml")//指定规则     configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath

    source 'src'

    include '**/*.java' //这里选择了所有的文件,你也可以选定单个文件,如果选定多个文件,就用逗号隔开就行,例如'**/MainActivity.java','**/User.java'

    exclude '**/gen/**'

    classpath = files()

}


执行gradle之后,在build目录下生成报告


2.findbugs

FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式(请参阅参考资料

在FindBugs的GUI中,需要先选择待扫描的.class文件(FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果你拥有这些.class档对应的源文件,可把这些.java文件再选上,这样便可以从稍后得出的报告中快捷的定位到出问题的代码上面。此外,还可以选上工程所使用的library,这样似乎可以帮助FindBugs做一些高阶的检查,藉以发现一些更深层的bug。

选定了以上各项后,便可以开始检测了。检测的过程可能会花好几分钟,具体视工程的规模而定。检测完毕可生成一份详细的报告,藉由这份报告,可以发现许多代码中间潜在的bug。比较典型的,如引用了空指针(null pointer dereference), 特定的资源(db connection)未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作…当除掉了这些典型的(classic) bug后,可以确信的是,我们的系统稳定度将会上一个新的台阶。

使用配置:

2.1.配置过滤文件

点击下载:https://pan.baidu.com/s/1jHHmdBg

2.2.在工程的检查项目的build.gradle下配置

task findbugs(type: FindBugs, dependsOn: assembleDebug) {

    ignoreFailures = false

    effort = "max"

    reportLevel = "high"

    excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")//配置过滤文件

    classes = files("${project.rootDir}/datacollect/build/intermediates/classes")

    //这里选择的是所有的class,你也可以只选单个或者多个文件,例如

    // files("${project.rootDir}/bsgamesdk_library/build/intermediates/classes/debug/com/example/demo/MainActivity .class") +                     //files("${project.rootDir}/bsgamesdk_library/build/intermediates/classes/debug/com /example/demo/User.class") 

    source 'src'

    include '**/*.java' //配置源文件,这里配置的所有文件,你也可以配置单个或者多个

    // '**/ MainActivity .java','**/User.java'

    exclude '**/gen/**'

    //报告导出

    reports {

        xml.enabled = false

        html.enabled = true

        xml {

            destination "$project.buildDir/reports/findbugs/findbugs.xml"//配置report输出路径

        }

        html {

           destination "$project.buildDir/reports/findbugs/findbugs.html"//配置report输出路径

        }

    }

    classpath = files()

}

执行gradle之后,在build目录下生成报告,类似CheckStyle,这里不再放图

3.pmd

PMD是一种开源分析Java代码错误的工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如:

® 潜在的bug:空的try/catch/finally/switch语句

® 未使用的代码:未使用的局部变量、参数、私有方法等

® 可选的代码:String/StringBuffer的滥用

® 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环

® 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs

® 循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象

@ 资源关闭:Connect,Result,Statement等使用之后确保关闭掉

此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象的操作

3.1.配置规则文件

点击下载:https://pan.baidu.com/s/1ge7iNPD

3.2.在工程的检查项目的build.gradle下配置

task pmd(type: Pmd) {

    ignoreFailures = false

    ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")

    ruleSets = [] //这里其实没有配置订制的规则

    source 'src'

    include '**/*.java'//指定文件检查,这里是所有文件,可以指定单个或者多个,例如:'**/MainActivity.java','**/User.java'

    exclude '**/gen/**'

    reports {

        xml.enabled = false

        html.enabled = true

        xml {

            destination "$project.buildDir/reports/pmd/pmd.xml"

        }

        html {

            destination "$project.buildDir/reports/pmd/pmd.html"

        }

    }

}

执行gradle之后,在build目录下生成报告,类似CheckStyle,这里不再放图

4.lint

Android Lint是一个静态的代码分析工具,它可以检测Android项目源文件中潜在的bug,也可以在正确性、安全性、性能、可用性、可访问性和国际化等方面进行优化。正如官方网站所说,Android Lint是另一种静态分析工具,专门为Android服务。它是非常强大的,能给你大量的建议以提高你的代码质量。

规则下载:https://pan.baidu.com/s/1dFxZAEH

android {

    lintOptions {

        abortOnError true

        xmlReport false

        htmlReport true

        lintConfig file("${project.rootDir}/config/quality/lint/lint.xml") //配置lint检查项

        htmlOutput file("$project.buildDir/reports/lint/lint-result.html")

        xmlOutput file("$project.buildDir/reports/lint/lint-result.xml")

    }

}

执行gradle之后,在build目录下生成报告,类似CheckStyle,这里不再放图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容