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

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

在这篇文章中,我会介绍几种不同的方式,让你通过自动化工具提高你的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,一经查实,立即删除!

相关文章

洛谷 U3357 C2-走楼梯

https://www.luogu.org/problem/show?pidU3357 题目背景 在你成功地解决了上一个问题之后,方方方不禁有些气恼,于是他在楼梯上跳来跳去,想要你求出他跳的方案数。.. 题目描述 方方方站在一个n阶楼梯下面,他每次可以往上跳一步或两…

Liunx 系统调优

Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现。 命令格式:sysctl [-n] [-e]-w # 临时改变某个指定参数的值,如sysctl -w net.ipv4.ip_forward1-a # 显示…

php多文件上传存储到表,PHP 实现一种多文件上传的方法

搜索热词之前在实现表单中file类型input选择多图片的时候找到一种方式 也许不是最好的但亲测可行且支持ie7以上以及chrome浏览器在表单中使用正常多文件选择multiple属性PHP;">然后使用AjaxFileUpload或其他方式提交将对应命名的file文件 $file[‘image] 转化为 json打…

CentOS7设置自定义开机启动,添加自定义系统服务

Centos 系统服务脚本目录: /usr/lib/systemd/ 有系统(system)和用户(user)之分,如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即&#xf…

成功应聘Intel的真实经历

编者按:INTEL(英特尔)公司创建于1968年,是全球最大的芯片制造商,Intel研究中心更是汇聚了全球无数的精英,一批年轻人抱着梦想走入了这里,过去我们谈到了太多关于Intel技术与市场方面&#xff0c…

Kotlin学习记录1

参考我的博客:http://www.isedwardtang.com/2017/09/02/kotlin-primer-1/转载于:https://www.cnblogs.com/EdwardTang/p/7476787.html

Keepalived配置文件详解

keepalivedkeepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。keepalived工作原理keepalived是以VRRP(Virtual Router Redundancy Protocol,即虚拟路由冗余协议)协议为实现…

php高等数学,中国大学《高等数学(四)》期末答案高校邦《PHP语言程序设计》见面课答案...

参考答案如下Conversation 2Pretco-A12.9-10.mp3:9、中国 A) Some shoes are missing. B) Itsdelivery is delayed.C) The order is cancelled. D) Some packages are damaged.10、中国 A) Giving an additional discount. B) Renewing the contract.C) Sending the goods by a…

深入剖析ThreadLocal实现原理以及内存泄漏问题

关于ThreadLocalMap<ThreadLocal, Object>弱引用问题&#xff1a; 当线程没有结束&#xff0c;但是ThreadLocal已经被回收&#xff0c;则可能导致线程中存在ThreadLocalMap<null, Object>的键值对&#xff0c;造成内存泄露。&#xff08;ThreadLocal被回收&#xf…

解读《普通大学应届毕业生如何成功应聘微软》

《普通大学应届毕业生如何成功应聘微软》这篇文章很有实践性&#xff0c;我所要提的&#xff0c;是最后一道面试&#xff0c;也就是唐骏本人对作者的面试&#xff0c;这一轮看似平常的面试大有门道。仔细想想&#xff0c;为什么这些问题由唐骏本人来问&#xff0c;他为什么要这…

grep 命令的 12 个实例

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

php 怎么从memcache缓存数据中统计某一字段总数,php和memcache统计在线人数的方法...

$mc new Memcache ();// 连接memcache$mc->connect("127.0.0.1", 11211);// 获取 在线用户 IP 和 在线时间数据$online_members $mc->get(online_members);// 如果为空&#xff0c;初始化数据if (!$online_members) {$online_members array();}// 获取用户i…

ubuntu之ufw防火墙

UFW是Ubuntu下的一个主机端的iptables类防火墙配置工具(底层调用iptables来处理)。这个工具的目的是提供给用户一个可以轻松驾驭的界面&#xff0c;就像包集成和动态检测开放的端口一样。虽然功能较简单&#xff0c;但对桌面型应用来说比较实用&#xff0c;基本常用功能都有&am…

background-size在IE8不兼容问题

background-size在IE8及以下浏览器不兼容&#xff1b;要解决的话要用滤镜&#xff1a; filter: progid: DXImageTransform.Microsoft.AlphaImageLoader( src, sizingMethodscale); 注意&#xff1a;此处src的路径必须是绝对路径&#xff0c;相对路径不可以&#xff01; 当写完…

程序员 大牛 面试

水 滴 石 穿 -- 找工作记 -- yurking&#xff08;yurkinggmail.com&#xff09; 一日一钱&#xff0c;千日千钱&#xff0c;绳锯木断&#xff0c;水滴石穿! 这个东西写出来有一段时间了&#xff0c;但是一直没发&#xff0c;想着等有时间了再好好的看一看&#xff0c;改一…

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

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

基于matlab的大米,大米颗数计算MATLAB软件

应用背景大米是人类的主食之一&#xff0c;是稻谷经清理、砻谷、碾米、成品整理等工序后制成的成品。人们购买米大多采用直接称量的方法&#xff0c;市面上也有许多仪器采用光电传感器等方式用于生产加工时米粒的计数。然而这样的方法都比较依赖于设备&#xff0c;不方便人们日…

ubuntu17.04之apt-get源

不要问我这么简单的也要写&#xff0c;我只想说在网上百度了一堆源&#xff0c;在笔者这里只有一个能用&#xff0c;悲伤的表情&#xff0c;还是记录一下吧 这个是清华的apt-get源&#xff0c;适用于ubuntu17.04apt-get源文件目录 /etc/apt/sources.list &#xff0c;记得先备份…

HttpClient通过Post方式发送Json数据

服务器用的是Springmvc&#xff0c;接口内容&#xff1a; [java] view plaincopy print?ResponseBody RequestMapping(value"/order",methodRequestMethod.POST) public boolean order(HttpServletRequest request,RequestBody List<Order> orders) throws …

openssl、ssh

PKI&#xff1a;公钥基础设施&#xff0c;保证服务器向客户端发送的证书的可靠性&#xff1b;签证机构&#xff1a;CA注册机构&#xff1a;RA证书吊销列表&#xff1a;CRL证书存取库&#xff1a;CAB威瑞信——verisignGlobalSign赛门铁克AsiaCOM国际标准化组织定义了证书的标准…