如何提高安卓代码的质量和语法

本文讲的是如何提高安卓代码的质量和语法,

在这篇文章中,我会介绍几种不同的方式,让你通过自动化工具提高你的Android代码质量,包括 Checkstyle, Findbugs,PMD, 当然,还有我们最熟悉的Android Lint。 为了让你的代码保持缜密的语法,同时避免一些糟糕的实现和错误,使用自动化的方式测试你的代码十分有用,尤其是当你和队友一起工作时。我会细心地解释如何直接通过你的Gradle构建脚本使用这些工具,和怎么方便地配置它们。

Fork这个例子

我强烈建议你fork此项目,因为我将介绍的所有例子均来自于它。同时,你也能自己测试这些质量控制工具。

关于Gradle任务

理解任务在Gradle中的概念是理解这篇文章的基础(广义上,也是学会撰写Gradle脚本的基础)。我强烈建议你先阅读一下Gradle文档中关于任务的部分(这个和这个)。 文档中包含许多例子,非常容易理解。好了,那现在我就假设你已经fork了我的仓库,将项目导入了你的Android Studio,同时也已经熟悉了Gradle的任务。如果没有也不必担心,我会尽我所能解释得通俗易懂。

Demo项目的层次结构

你能将gradle脚本分离在很多文件中,目前我分了3个gradle文件:

  • 一个在根目录,这个文件是关于项目的一些配置(比如使用的maven仓库和使用的Gradle版本);
  • 一个在子文件夹app中,这是一个典型的构建Android应用的Gradle文件。
  • 一个在子文件夹config中,这个才是我们所关注的,我用它来为我的项目集成并配置所有的质量控制工具。

Checkstyle

简介

Checkstyle是一个帮助程序员坚持规范化编写Java代码的开发工具.它自动检查Java代码,将程序员从这项乏味(但重要)的工作中解放出来.

正如Checkstyle的开发者所说,这个工具帮助你在一个项目中,精确并灵活地定义和保持编码规范。当你运行Checkstyle时,它会分析你的Java代码,根据你的配置找出所有错误并提示你。

通过Gradle配置

以下代码展示了在你项目中使用Checkstyle的基本配置(作为一个Gradle任务):

task checkstyle(type: Checkstyle) {configFile file("${project.rootDir}/config/quality/checkstyle/checkstyle.xml") // Where my checkstyle config is...configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath // Where is my suppressions file for checkstyle is...source 'src'include '**/*.java'exclude '**/gen/**'classpath = files()
}

配置完后,这个任务就会根据checkstyle.xmlsuppressions.xml两个文件来分析你的代码。只需要在Gradle面板中启动这个任务,Android Studio就会自动执行此任务。

checkstyle

运行Checkstyle后,你会得到一份报告,上面纪录了在你项目中找到的所有问题。而且它非常易于理解。

如果你想更个性化地配置Checkstyle,请参考这篇文档。

Checkstyle使用技巧

Checkstyle会探测到大量问题,尤其当你使用了很多规则--比如你想要一个精确的语法。虽然我通过Gradle脚本来使用Checkstyle(比如在我push代码之前),但我建议你同时使用Checkstyle的IntellJ/Android Studio插件(你能直接通过工具栏File/Settings/Plugins安装它们。译者注:mac版是Android Studio/Preferences/Plugins)。这种方式也是根据你之前为Gradle指定的那两个配置文件在你的项目中应用Checkstyle。这样的好处是能直接在Android Studio中查看结果。更实用的是,结果可以直接链接到错误所在代码(Gradle的那种方式仍然很重要,因为你能通过Jenkins这样的自动化构建系统来使用它)。

FindBugs

简介

Findbugs 需要简介吗?它的名字已经说明了一切。

Findbugs 通过静态分析来检查Java字节码中的错误模式。

Findbugs 基本上只需要项目的字节码文件来做分析,因此它十分易用。它会检测出诸如错误使用布尔运算符这样常见的错误。同时,它还能检测出一些由于误解语言特性所导致的错误,比如Java中方法参数的重新赋值(实际上是无效的,因为Java中方法的参数是值传递)。

通过Gradle配置

以下代码展示了在你项目中使用Findbugs的基本配置(作为一个Gradle任务):

task findbugs(type: FindBugs) {ignoreFailures = falseeffort = "max"reportLevel = "high"excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")classes = files("${project.rootDir}/app/build/classes")source 'src'include '**/*.java'exclude '**/gen/**'reports {xml.enabled = falsehtml.enabled = truexml {destination "$project.buildDir/reports/findbugs/findbugs.xml"}html {destination "$project.buildDir/reports/findbugs/findbugs.html"}}classpath = files()
}

这和Checkstyle的任务很像。Findbugs支持HTMLXML格式的报告,我选择了HTML,因为其可读性更强。除此以外,你只需要标记一下报告的路径来快速读取它。如果Findbugs中的错误被检测到,任务会失败(仍然产生报告)。执行Findbugs的方式和Checkstyle完全一样(只是名字变成了"Findbugs")。

Findbugs使用技巧

由于Android项目与Java项目有轻微不同,我强烈建议大家使用findbugs-filter。例子点这里(示例项目的其中之一)。它一般会忽略掉R文件和清单文件。另外,由于Findbugs是分析你的字节码,你至少需要编译一次项目来测试它。

PMD

简介

这个工具十分有趣:PMD并没有一个真正的名字。在官方网站上你会发现一些有趣的命名建议:

  • Pretty Much Done
  • Project Meets Deadline

实际上,PMD是一个非常强大的工具。它的工作方式有点像Findbugs,但它直接检查源码而非字节码(另外,PMD支持大量语言)。目标也和Findbugs高度相似--通过静态分析找出能导致bug的模式。那么为什么我们还要同时使用FindbugsPMD呢?好吧,尽管FindbugsPMD的目标一致,但它们的检查方法并不同。因此PMD有时可以找到Findbugs找不到的bug,反过来也一样。

通过Gradle配置

以下代码展示了在你项目中使用PMD的基本配置(作为一个Gradle任务):

task pmd(type: Pmd) {ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")ignoreFailures = falseruleSets = []source 'src'include '**/*.java'exclude '**/gen/**'reports {xml.enabled = falsehtml.enabled = truexml {destination "$project.buildDir/reports/pmd/pmd.xml"}html {destination "$project.buildDir/reports/pmd/pmd.html"}}
}

PMD的结果同样与Findbugs有许多相同之处。PMD的报告同样支持HTMLXML,因此我再次选择了HTML的格式。我强烈建议使用你自己的自定义规则集文件,就像我在例子中做的这样(参照这个文件)。当然,你还需要看一下自定义规则集的文档。我这么建议是因为PMD相比Findbugs而言更具争议。比如,如果你没有折叠if条件语句或写了一个空的if条件语句,它一般就会警告你。我认为应该由你或你的同事为你们的项目来定义这些规则是否正确。像我自己就喜欢不折叠if条件语句,因为这样更具可读性。执行PMD的方式和Checkstyle完全一样(只是名字变成了"PMD")。

PMD使用技巧

由于我推荐你不要使用默认的规则集,你需要加上这行代码(上面已经加上了)

ruleSets = []

不加的话,由于默认值是基本的规则集,那些默认的规则集会始终伴随你自定义的规则集一起执行。这样即使你在自定义的规则集中指明不使用基础规则集中的规则,它们仍然会被考虑在内。

Android Lint

简介

Android lint 工具是一个静态代码分析工具。它通过你Android项目的源码检测出潜在的错误,并为项目在正确性,安全性,性能,可用性, 易用性和国际化等方面提供最佳的改进方案。

正如其官网所说,Android Lint是一款专注于Android的静态分析工具。它非常强大,能给出大量建议来提高你代码的质量。

通过Gradle配置

android {lintOptions {abortOnError truelintConfig file("${project.rootDir}/config/quality/lint/lint.xml")// if true, generate an HTML report (with issue explanations, sourcecode, etc)htmlReport true// optional path to report (default will be lint-results.html in the builddir)htmlOutput file("$project.buildDir/reports/lint/lint.html")
}

我推荐你使用一个单独的文件来定义哪些规则应该使用。这个网站定义了所有来自最新ADT版本的规则。除了"ignore"中"severity"级别的规则外,我的demo中的Lint文件包含了所有规则:

  • IconDensities:这个规则确保你为每一种分辨率都设置了对应的图片资源(除ldpi外)。
  • IconDipSize:这个规则确保你正确地定义了资源的每种尺寸。(换句话说,检查你是否为不同分辨率定义了完全相同的图片,而没有重新设置图片大小)。

所以你能直接复用这份lint文件并激活所有你想要的规则。执行Android Lint任务的方式和Checkstyle完全一样(只是名字变成了"lint")。

Android Lint使用技巧

Android Lint没有什么特殊的使用技巧,你只需要记住,Android Lint总是会测试除"ignore"中"severity"级别的规则外的所有规则。所以如果随着ADT的新版本出现了新的规则,它们会被检查,而不会被忽略。

通过一个任务管理以上所有工具

现在你已经掌握了为你项目使用4个质量控制工具的关键。但如果你能同时使用4个工具就更好了。你能在你的Gradle任务之间添加依赖,比如当你执行一个任务时,另外一个会在第一个任务完成后执行。一般在Gradle中,你通过"check"任务为你的质量工具添加依赖:

check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint'

现在,当你执行"check"任务,Checkstyle, Findbugs, PMD, 和Android Lint 都会被执行。这是一个非常好的方式来在你commit/push/请求合并之前检查代码质量。

你能在这个Gradle文件中获得所有这些任务的示例。你能在demo源码的config/quality文件夹中找到所有关于质量控制的配置和gradle文件。

总结

正如这篇文章介绍的,Android的质量控制工具配合Gradle使用非常简单。质量控制工具不仅仅能检查你电脑中的本地项目,还能检查一些自动化构建平台上的代码,比如Jenkins/Hudson等。这使你能将质量控制的工作依附于自动构建系统,实现自动化。执行所有测试的命令与执行Jenkins和Hudson相同,最简单的命令是:

gradle check

请自由评论这篇文章,或者咨询任何与Android代码质量相关的问题!:wink:

快去实践吧!





原文发布时间为:2016年01月07日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

grep 命令的 12 个实例

2019独角兽企业重金招聘Python工程师标准>>> 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧。 grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具。无论何种原因,…

Linux : shell基础(慕课网Linux达人养成计划课程笔记)

Shell概述 shell是Linux中的命令行解释器,为用户提供了一个向Linux内核发送请求一边运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至编写一些程序。shell还是一个功能相当强大的编程语言,易编写,易调试&#xff…

php图型分析插件,IMAGE缩略图插件

应用信息 名称: IMAGE缩略图插件 售价: (免费) 应用ID: IMAGE 最低要求: Z-BlogPHP 1.5.1 Zero Build 151740版 本: 2 发布日期: 2014-08-27PHP最低版本要求: 5.3 更新日期: 2018-05-21立即购买 加入购物车作者信息 开发者ID: 十五楼的鸟儿 本站用户组: 管理员 联系邮箱: adm…

2017.9.5 postgresql加密函数的使用

需要安装的插件的名字:pgcrypto官网地址:https://www.postgresql.org/docs/9.4/static/pgcrypto.htmlstackoverflow:https://stackoverflow.com/questions/8000740/how-do-i-install-pgcrypto-in-postgresql-9-1-on-windows/46046367#46046367https://st…

php 序列化方法,PHP序列化操作方法分析

本文实例讲述了PHP序列化操作方法。分享给大家供大家参考,具体如下:序列化就是将变量数据转换为字符串(跟类型转换机制不同),一般应用于存储数据(文件),然后在别的情形下恢复(反序列化)序列化:$val serialize($var);f…

Redis入门到精通-Redis数据类型

2019独角兽企业重金招聘Python工程师标准>>> 登录Redis数据库 [rootlocalhost bin]# /usr/local/redis/bin/redis-cli String类型 ​ String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字,是包含很多种类型…

装机之 BIOS、EFI与UEFI详解

在我们的电脑中,都有一块黑色的小芯片。但是请千万不要小看它,如果它损坏或者数据错误乱套的话,恭喜,如果不会“救回”这个小芯片,那么这台电脑可以挂闲鱼卖零件了…… 这个小芯片是什么呢?对,…

php 模板 php + mysql + myodbc,连接MySQL数据库在ASP中,就用MyODBC

我们大家都知道ASP与MySQL连接现在应用最为广泛的两种办法是,一是使用组件,经常使用的是MySQL(和PHP搭配之最佳组合)X,可惜价格很贵。另一个就是用MyODBC来连接MySQL数据库,下面我们就来看看第二种方式。 试验的平台: …

Android Gradle和Gradle插件区别

2019独角兽企业重金招聘Python工程师标准>>> 一、引言 1、什么是Gradle?什么是Gradle插件? build.gradle中依赖的classpath com.android.tools.build:gradle:2.1.2和gradle-wrapper.properties中的distributionUrlhttps\://services.gradle.org/distributions/gra…

装机之MBR和GPT

MBR分区 MBR的意思是“主引导记录”,是IBM公司早年间提出的。它是存在于磁盘驱动器开始部分的一个特殊的启动扇区。这个扇区包含了已安装的操作系统系统信息,并用一小段代码来启动系统。如果你安装了Windows,其启动信息就放在这一段代码中—…

实验报告3

中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验三 密码破解技术 学生姓名 陆圣宇 年级 2014 区队 三 指导教师 高见 信息技术与网络安全学院 2016年11月7日 实验任务总纲 2016—2017 学年 第 一 学期 一、实验目的 1&am…

装机之windows10和ubuntu双系统

制作系统U盘 下载Ubuntu16.04 我们首先去Ubuntu的官网下载一个Ubuntu16.04的iso镜像文件。当然里面也有优麒麟,其实就是把Ubuntu16.04汉化了一下,个人推荐安装Ubuntu16.04 体验上可能好一些。 利用软碟通制作 不会的可以查看此教程https://blog.csdn…

matlab var std,Matlab var std cov 函数解析

在Matlab中使用var求样本方差,使用std求标准差!首先来了解一下方差公式:p [-0.92 0.73 -0.47 0.74 0.29; -0.08 0.86 -0.67 -0.52 0.93]p -0.9200 0.7300 -0.4700 0.7400 0.2900-0.0800 0.8600 -0.6700 -0.5200 0.9300…

Java中什么是匿名对象,空参构造方法输出创建了几个匿名对象,属性声明成static...

package com.swift; //使用无参构造方法自动生成对象,序号不断自增 public class Person {private static int count; //如果在定义类时,使用的是静态的属性,则得到的结果是不同的。count生命周期长,与类相同public int id;public…

装机之制作系统U盘

工具:UltraISO(软碟通),iso镜像 在制作系统U盘的时候我们需要去下一个软件——UltraISO(软碟通),这个自己去百度搜索一下应该就能出来的。下载安装完以后,我们打开软碟通的界面打开…

李飞飞:为什么计算机视觉对机器人如此重要?

根据Guide2Research的排名,IROS是计算机视觉领域排名第四的学术会议,前三名分别为CVPR、ICCV、ECCV。计算机视觉在机器人的发展史中起着非常重要的作用,与之相关的“感知”也正是历年IROS大会上的重要内容,随着机器人研究的发展和…

linux 命令 which whereis locate find

0、概述 * which:在PATH变量指定的路径中,搜索与指定名字匹配的系统命令的位置,并且返回第一个搜索结果。 * whereis:搜索与指定名字匹配的二进制文件、源文件和帮助手册文件所在的路径。二进制文件(参数-b&…

python 转 exe -- py2exe库实录

本文基于windows 7 python 3.4 把python程序打包成exe,比较好用的库是py2exe 其操作步骤是: --> 编写python程序 --> 再额外编写一个导入了py2exe的python脚本(不妨如:setup.py)存在同一目录下 --> 运行这个脚本,打包生成的exe文件…

如何让电脑成为看图说话的高手?计算机视觉顶会ICCV论文解读

ICCV,被誉为计算机视觉领域三大顶级会议之一。作为计算机视觉领域最高级别的会议之一,其论文集代表了计算机视觉领域最新的发展方向和水平。阿里巴巴在今年的大会上有多篇论文入选,本篇所解读的论文是阿里iDST与多家机构合作的入选论文之一&a…

php汽车找车位,遭遇到车多车位少 教你如何快速找到停车位

[摘要]车主们大多时间会穿梭在市区,到了目的地后那就先找停车位,现在市区寸土寸金,一个停车位面积要占几平米呢,所以停车位基本是不够用的。下面和大家聊聊怎么找合适的停车位。车主们大多时间会穿梭在市区,去商场购物…