提高代码质量之静态代码检查

2023-11-09

http://www.jianshu.com/p/2b8d34b2267c

前言

在团队Android项目开发过程中,难免会出现一些比较不容易发现,但是又比较低级的bug。而且因为每个开发人员的编码习惯不同,写出的代码也会有差异。为了保证团队开发中代码的规范以及尽量避免低级bug,我们往往需要一些工具来进行严格的检查。下面将介绍在项目中用到的四种插件 lintfindBugsPMD、 CheckStyles 的功能和使用方式,以及如何将多个插件整合在一起,在方便使用的同时尽量做到与项目工程解耦。

一、lint

Lint是Android Studio提供的一个代码检测工具,通过它开发者不用运行或者写测试代码,就可以发现和纠正问题,优化代码结构。每个被检测到的问题,都会生成一条描述信息并指明相应的严重性级别,当然这个严重性级别我们也可以自己设置的。

检测范围

  • 潜在的bug
  • 可优化的代码
  • 安全性
  • 性能
  • 可用性
  • 可访问性
  • 国际化

插件安装

Android Studio自带,无需安装。

插件使用

通过Gradle运行lint

在工程的根目录下运行相应的gradle task。

  • Windows
gradle lint
  • Linux 或者 MAC
./gradlew lint

当运行上面的命令执行完后,就会在项目目录/app/build/outputs/lint-results-debug.html生成相应的文件,可用浏览器打开查看。

手动运行lint

有时我们可能只针对某个文件或者某个目录进行检测,这时使用gradle的方式就比较麻烦了,所以Android Studio提供给我们手动运行lint的方式。

  • 在AS的工程下选择module、目录或者文件
  • 右键选择Analyze > Inspect Code.
  • 此时会出现一个选择“指定检测范围”的dialog

  • 配置完成后,点击OK按钮,进行检测。检测结果如下图所示,左边是检测类型的树形结构,右边则展示详细的信息。

注:详细的使用,请看官网文档 Improve Your Code with Lint

二、findBugs

FindBugs是一个Java静态分析工具,用来检查类或者jar文件,用来发现可能的问题。检测完成之后会生成一份详细的报告,借助这份报告可以找到潜在的bug,比如NullPointException,特定的资源没有关闭,查询数据库没有调用Cursor.close()等

检测范围

  • 常见代码错误,序列化错误
  • 可能导致错误的代码,如空指针引用
  • 国际化相关问题:如错误的字符串转换
  • 可能受到的恶意攻击,如访问权限修饰符的定义等
  • 多线程的正确性:如多线程编程时常见的同步,线程调度问题。
  • 运行时性能问题:如由变量定义,方法调用导致的代码低效问题

插件安装

在Android Studio中选择Preferences -> Plugins,输入查找findBugs进行插件安装。

插件使用

在build.gradle文件中,按照下面步骤进行设置:

  1. 添加plugin apply plugin:'findbugs'
  2. 定义任务,指定输出格式
task findbugs(type: FindBugs, dependsOn: "assembleDebug") {
    ignoreFailures = true
    effort = "max"
    reportLevel = "high"
    excludeFilter = new File("$configDir/findbugs/findbugs-filter.xml")
    classes = files("${project.rootDir}/app/build/intermediates/classes")

    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    reports {
        xml.enabled = false
        html.enabled = true
        xml {
            destination "$reportsDir/findbugs/findbugs.xml"
        }
        html {
            destination "$reportsDir/findbugs/findbugs.html"
        }
    }

    classpath = files()
}

这里要注意因为findBugs是检查class文件,所以在定义task的时候,我们是dependsOn: "assembleDebug",确保运行findbugs的task能够成功检测。

通过gradle findbugs方式,在工程目录下运行命令,检测完成后,会在制定的目录下生成报告文档。文档支持xml和html两种格式,本文设置的是html格式,可以直接用浏览器打开。
当然,和lint一样,findBugs也支持手动检测的方式。在工程里,右键 FindBugs -> (选择检测的范围)。检测完之后,底部工具栏会跳到FindBugs-IEDA下,如图所示。

三、PMD

PMD是一个很有用的工具,它跟Findbugs类似,但是它不是检测字节码,它是直接检测源代码。它使用静态分析来发现错误。为什么要将它们同时使用呢?因为它们的检测方法不同,可以取到互补的作用。

检测范围

  • 可能的bug——空的try/catch/finally/switch块。
  • 无用代码(Dead code):无用的本地变量,方法参数和私有方法。
  • 空的if/while语句。
  • 过度复杂的表达式——不必要的if语句,本来可以用while循环但是却用了for循环。
  • 可优化的代码:浪费性能的String/StringBuffer的使用。

插件安装

同样可以通过AS的plugin进行安装,推荐安装QAPlug-PMD。

插件使用

在build.gradle文件中进行如下配置

  • 导入Plugin:apply plugin: 'pmd'
  • Task配置
task pmd(type: Pmd) {
    ignoreFailures = false
    ruleSetFiles = files("$configDir/pmd/pmd-ruleset.xml")
    ruleSets = []

    source 'src'
    include '**/*.java'
    exclude '**/gen/**'
    exclude 'androidTest/**'
    exclude 'test/**'

    reports {
        xml.enabled = false
        html.enabled = true
        xml {
            destination "$reportsDir/pmd/pmd.xml"
        }
        html {
            destination "$reportsDir/pmd/pmd.html"
        }
    }
}

四、CheckStyles

这个工具用来自动检测java源码。启动之后,可以按照制定的规则对java源码进行检查,被将所有的不符合规范的地方生成报告通知给你。

检测范围

  • 注解
  • javadoc注释
  • 命名规范
  • 文件头
  • 导入包规范
  • 尺寸设置
  • 空格
  • 正则表达式
  • 修饰符
  • 代码块
  • 编码问题
  • 类设计问题
  • 重复、度量以及一些杂项

总而言之,是一些代码规范问题!!

插件安装

通过AS的Plugin进行安装

插件使用

  • 导入Plugin
apply plugin: 'checkstyle'
  • 设置CheckStyle的版本
checkstyle {
    toolVersion '6.1.1'
    showViolations true
}
  • 配置任务
task checkstyle(type: Checkstyle) {
    configFile file("$configDir/checkstyle/k12_checkstyle.xml")
    configProperties.checkstyleSuppressionsPath = file("$configDir/checkstyle/suppressions.xml").absolutePath
    source 'src'
    include '**/*.java'
    exclude '**/gen/**'
    exclude 'androidTest/**'
    exclude 'test/**'
    ignoreFailures true
    classpath = files()
}

五、插件的接入与使用

检测范围

lint、PMD、findBugs和CheckStyle检测范围之和。

插件安装

  • 下载整合插件的文件包,和app工程目录同级放置。
  • 在app的build.gradle文件导入整合插件脚本
apply from: '../config/quality.gradle'

插件使用

  • 修改quality.gradle 的appDir字段,设置检测的工程目录
// 应用目录名称
def appDir = "app-k12"
  • 进入工程根目录,运行gradle check,检测完成后,会在build/reports下生成相应的检测报告文件。当然也可以按照每个插件的使用方式单独使用。

总结

最后,随文附上插件的git地址,欢迎fork和star。
config

再推荐之前封装的两个好用的组件:

参考文章

  1. How to improve quality and syntax of your Android code
  2. Improve Your Code with Lint
  3. Android 进阶之工具的使用 Findbugs
  4. Android静态代码检测
  5. 使用 CheckStyle 检查代码
  6. 详解CheckStyle的检查规则(共138条规则)
  7. 用 PMD 铲除 bug

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高代码质量之静态代码检查 的相关文章

  • C++:这门语言优势在哪?命名空间以及缺省参数?

    文章目录 C 的优势 解决命名空间的问题 缺省参数 C 的优势 C 和C语言比起来有许多优势 这里我们先举一个例子 后续进行补充 解决命名空间的问题 首先看这样的代码 include
  • docker ubuntu 使用apt安装vim--报错Unable to locate package vim

    docker ubuntu 安装vim 报错Unable to locate package vim 前言 想修改从vulhub拉取运行的docker容器里的配置文件 使用vim时报错bash vim command not found 发
  • nest:[TypeOrmModule] Unable to connect to the database. Retrying

    有可能是刚开机的时候 mysql服务还没有开启导致的
  • 百度 AI Studio——《高层API助你快速上手深度学习》课程学习1

    百度 AI Studio 高层API助你快速上手深度学习 课程学习1 该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 相关链接 飞桨 飞桨开源框架 PaddlePaddle 是一个易用 高效 灵活 可扩展的深度学习
  • c++学生信息管理系统(window控制台实现鼠标点击操作)

    翻起大一时写过的作业代码 一个学生信息管理系统 当时不会使用QT 不会MFC等库 只会c 但是又想做一个有界面的 能够实现鼠标操作的程序 于是绞尽脑汁查资料 自己造轮子 最终写出来了下面的这个现在连我自己也看不懂的代码 代码虽然有些长 单文
  • 图书管理系统服务器,图书管理系统的服务器

    图书管理系统的服务器 内容精选 换一换 eBackup备份管理系统支持对VMware环境下虚拟机的保护 您需要在系统中增加VMware受保护环境 从而对受保护环境中的虚拟机进行备份和恢复 增加VMware受保护环境时 如果虚拟机名称中包含
  • 回文序列

    题目描述 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列 例如 1 2 1 15 78 78 15 112 是回文序列 1 2 2 15 78 87 51 112 2 11 不是回文序列 现在给出一个数字序列 允许使用
  • Unity3D的断点调试功能

    Unity3D的断点调试功能 2013 03 14 16 27 51 分类 Unity教程 标签 unity monodevelop 断点调试 debug 举报 字号 订阅 断点调试功能可谓是程序员必备的功能了 Unity3D支持编写js和
  • C#获取字符串中括号中内容的正则表达式

    正则表达式为 lt w 2 如 string str1 发送奥点奥点 66 dasaa213434esdf Regex rex new Regex lt w 2 Match m rex Match str1 Console WriteLin
  • 【自然语言处理】ChatGPT 相关核心算法

    ChatGPT 相关核心算法 ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合 本文将分别介绍作为其实现基础的 Transformer 模型 激发出其所蕴含知识的 Prompt Instruction Tuning 算法 其涌
  • 使用jq让页面滚动到顶部

    以下是完整代码
  • 求任何时间下不同纬度太阳高度角的计算公式

    太阳高度角简称太阳高度 其实是角度 对于地球上的某个地点 太阳高度是指太阳光的入射方向和地平面之间的夹角 太阳 高度是决定地球表面获得太阳热能数量的最重要的因素 我们用h来表示这个角度 它在数值上等于太阳在天球地平坐标系中的地平高度 太阳高
  • 【111】支持向量机原理及python实现

    内容目录 一 基本概念二 鸢尾花实验三 乳腺癌检测实验 一 基本概念 024 SVM有监督学习LinearSVC LinearSVR SVC SVR参数解释 线性支持向量机 在超平面确定的情况下 可以相对地表示点距离超平面的远近 对于两类分
  • sublime Text3 自定义配色方案

    自定义配色方案地址 使用引导 首先 点击General gt background gt 修改一般 txt文件的默认背景 护眼的RGB值 豆沙绿的rgb颜色 199 237 204 色调 85 饱和度 1 2 3 亮度 2 0 5 对应成1
  • 504. Base 7

    Given an integer return its base 7 string representation Example 1 Input 100 Output 202 Example 2 Input 7 Output 10 Note
  • Mysql实现行列转换

    mysql数据库如何实现行列转换 1 行转列 方案一 select name sum case when course java then grade end as java sum case when course C then grad

随机推荐

  • React 封装组件的一些心得(一)

    起因 最近公司业务不是那么多 就抽空写了下组件库的东西 然后看了很多组件库的源码 由于我这里封装的主要是 taro 移动端的组件 所以主要是参考了 antd mobile react vant tard 等组件库 然后根据他们的源码 整合出
  • openGL贝塞尔曲面细分

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 贝塞尔曲面细分原理 二 代码 1 主程序c 效果 前言 现在让我们扩展我们的程序 使它将我们简单的矩形网格转换为贝塞尔曲面 细分网格 应该为我们提供了足够的顶点来对曲面
  • Sublime Text 2 添加到右键

    转载于 把Sublime Text 2 加入右键菜单 带图标 Edit with Sublime Text Sublime Text 2 是现在很受大家欢迎的编辑器了 不仅是在web前端 在书定简单的php Js等代码时 也是相当的好用 再
  • 注册ChatGPT时提示Oops! The email you provided is not supported

    问题描述 今天本想出一个ChatGPT的注册与使用的教程 结果上来吃了个闭门羹 之前我通过微软账号登录验证是没有问题的 但这次想使用另一个微软账号 结果提示Oops The email you provided is not support
  • JDBC编程的六大步骤

    1 注册驱动 把驱动程序类加载到内存中 利用反射机制 这里是利用反射机制去加载某个类的特性 并不是要获取这个镜像对象来操作 加载这个类就会让这个类中的static 被执行 这个静态代码块中的代码就是注册驱动的代码 String driver
  • top5数据高级分析必备的Python库

    top5数据高级分析必备的Python库 1 Pandas 2 Numpy 3 Matplotlib https blog csdn net qq 40985985 article details 119676953 4 Scikit 学习
  • 【 Python 全栈开发 - 语法基础篇 - 19 】模块和包

    文章目录 一 模块 二 包 在 Python 中 模块指的是一个包含 Python 代码的文件 它可以被其他 Python 程序导入和使用 模块通常包括一些函数 类和变量 可以用于执行特定的任务或实现特定的功能 而包指的是一个包含多个模块的
  • 抖音短视频矩阵系统多账号管理,功能框架及开发逻辑

    目录 文章目录 前言 一 矩阵号系统是什么 二 使用步骤 1 创建推广项目 2 多账号授权 3 企业号智能客服系统 总结 前言 短视频多账号矩阵系统 通过多账号一键授权管理的方式 为运营人员打造功能强大及全面的 矩阵式 管理平台 使用矩阵系
  • MOS管、BJT 饱和区 不同

    1 深刻理解并记住工作在开关状态下 两种器件工作在何种工作区 三极管 从左到右 依次为 饱和 放大 截至 开关状态下是工作在截至与饱和区之间 MOS 从左到右 依次为可变电阻 非饱和区 完全导通区 饱和 横流区 放大区 有源区 线性区 截至
  • Vue3报错Property “xxx“ was accessed during render but is not defined on instance.

    使用Vue3重构自己项目时遇到报错 Property xxx was accessed during render but is not defined on instance 碰到这个报错已经不是一次两次了 写篇文章记录一下 翻译 Pro
  • 软件缺陷的管理

    目录 1 软件缺陷产生的原因 1 1 需求不明确 1 2 软件结构复杂 1 3 编码问题 1 4 项目期限太短 1 5 使用新技术 2 软件缺陷的分类 2 1 从测试种类划分缺陷 2 2 从缺陷严重程度划分 2 3 从缺陷的优先级划分 2
  • 【计算机视觉

    文章目录 一 检测相关 18篇 1 1 Neural Network Training Strategy to Enhance Anomaly Detection Performance A Perspective on Reconstru
  • Ubuntu更换源-清华大学源

    文章目录 前言 备份原来的源 更换源 更新源 前言 安装好ubuntu系统后 默认的软件更新源是国外的 在国内使用速度很慢 安装软件时可能出现 各种各样的错误 所以我们需要更换成国内的源 这样才能更快更安全的安装和更新软件 此次我们选用的是
  • scratch 鼠标控制角色移动

    scratch 鼠标控制角色 本程序使用鼠标操作 机器人 角色跟随鼠标 距离较小时暂停移动 小狗 角色连续在随机位置生成 水平移动 碰到边缘反弹 碰到 机器人 角色时删除 目前scratch程序的制作已经告一段落了 进一步开发需要更多规划
  • 多路ADC的采集——stm32

    在对实际应用过程中 ADC的采集大多是多个通道同时采集的 比如同时采集多个传感器的数据 就可能需要我们配置多个通道的ADC采集了 而多通道的ADC采集大多用到了DMA 笼统的讲通过DMA来传输数据不经过CPU 可以有效的为CPU减负 我们在
  • Linux开发工具

    目录 Linux 软件包管理器 yum 如何安装软件 如何卸载软件 Linux编辑器 vim使用 1 vim的基本概念 2 vim的基本操作 3 vim正常模式命令集 4 vim末行模式命令集 5 vim操作总结 7 一些小指令 Linux
  • TypeError:__init__() got an unexpected keyword argument ‘xxx‘

    检查一下通常是某个关键字打错了
  • 排序算法:冒泡排序

    基本思想 相邻的两个元素进行比较 按照要求进行交换 思路 以升序为例 进行第一趟排序 第一个元素和第二个元素进行比较 将较大的放在第二个元素的位置上 然后第二个和第三个元素进行比较 将较大的放在第三个元素的位置上 依次类推 直到 第一趟排序
  • 2023.05-B卷-华为OD机试 - 阿里巴巴找黄金宝箱(I)-”新加题型“(100分值)

    www codefun2000 com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据 挂载到我们的OJ上 供大家学习交流 体会笔试难度 现已录入200 道互联网大厂模拟练习题 还在极速更新中 欢迎关注公众号 塔子哥学算
  • 提高代码质量之静态代码检查

    http www jianshu com p 2b8d34b2267c 前言 在团队Android项目开发过程中 难免会出现一些比较不容易发现 但是又比较低级的bug 而且因为每个开发人员的编码习惯不同 写出的代码也会有差异 为了保证团队开