当前位置: 首页 > 科技观察

使Android代码质量翻倍的四个工具!

时间:2023-03-16 19:09:37 科技观察

在本文中,我将介绍(如何)通过CheckStyle、FindBugs、PMD和AndroidLint等不同的自动化工具来提高您的Android代码质量。以自动化方式检查您的代码非常有用,尤其是当您在团队中工作时,以便在您的代码中保持严格的语法并避免许多不良习惯和错误。我将介绍如何在闲暇时通过Gradle构建脚本直接使用这些工具以及如何配置它们。fork这个例子,我强烈建议你复制这个项目,虽然我要介绍的案例都是来自它。同时,您将能够测试您对这些工具的了解。关于Gradle任务Gradle任务的概念(它在Gradle中的含义)是理解本文(以及如何以通用方式编写Gradle脚本)的基础。我强烈建议您查看关于Gradle任务的这两个文档(this和this)。该文档包含大量示例,因此非常容易上手。现在,我假设你复制了我的repo,你将这个项目导入你的AndroidStudio,并且你熟悉Gradle任务。如果没有,请不要担心,我会尽我所能使我的演讲更有意义。关于示例项目的层次结构,您可以将gradle脚本文件拆分为多个文件,我现在有3个gradle文件:根文件夹中的一个或多或少与该项目的配置有关(与WhichMavenRepos,哪个版本使用Gradle)。App子文件夹中的文件,这些文件是典型的用于创建Android应用程序的gradle文件。config子文件夹下的文件,这里的文件是我们关系的重点,因为我用这里的文件来保存和配置项目中的所有工具。Checkstyle简介“Checkstyle是一款帮助程序员编写符合代码规范的Java代码的开发工具,它可以自动检查Java代码,供闲人执行这项枯燥(但重要)的任务。”正如Checkstyle的开发者所说,这是一个帮助您在项目中定义和维护非常精确和灵活的代码规范形式的工具。当您启动CheckStyle时,它??会根据提供的配置文件分析您的Java代码,并告诉您它发现的任何错误。以下代码以Gradle的形式向您展示了在您的项目中使用Checkstyle的最基本的配置(例如Gradle任务):checkstyle.xml")//Whereismycheckstyleconfigis...configProperties.checkstyleSuppressionsPath=file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath//Whereismysuppressionsfileforcheckstyleis...source'include'**/*.classpath=files()}所以,基本上这个任务会基于checkstyle.xml和suppressions.xml分析您的代码。通过AndroidStudio执行它只是从工具面板中的CheckStyle启动它的问题。启动CheckStyle后,您将收到一份报告,显示在您的项目中发现的每个错误。这是非常直接的方式。如果想对checkstyle做更多的配置,可以参考这篇文档。Checkstyle提示Checkstyle会发现很多问题,尤其是当你使用大量规则配置时,因为你设置了非常精确的语法。即使我通过Gradle使用checkstyle,例如在我推送之前,我仍然建议你使用IntellJ/AndroidStudio的checkstyle插件(你可以直接通过AndroidStudio的工作面板Files/Settings/Plugins安装插件)。这样,你就可以在你的项目中根据为Gradle配置的相同文件使用checkstyle,但不仅如此,你可以直接在AndroidStudio中使用超链接获得结果,这些结果在你的代码中超链接,这是非常有用(Gradle这种方式仍然很重要,因为您可以使用它来自动化构建系统,如Jenkins)。Findbugs简介Findbugs需要介绍吗?我认为它的名字已经很清楚了。“FindBugs使用静态分析方法来检查Java字节码的错误模式”。FindBugs基本上只需要一个程序来做字节码分析,所以非常容易使用。它检测常见错误,例如错误的布尔运算符。FindBugs还能够检测由于对Java参数调整等语言特性的误解而导致的错误(这实际上是不可能的,因为它的参数是按值传递的)。以下代码以Gradle形式向您展示了在您的项目中使用Findbugs的最基本配置(以Gradle任务为例):=newFile("${project.rootDir}/config/quality/findbugs/findbugs-filter.source'include'**/*.报告{xml.enabled=falsexml{destination"$project.buildDir/reports/findbugs/findbugs.xml"}html{目的地"$project.buildDir/reports/findbugs/findbugs.html"}}类path=files()}太像Checkstyle任务了虽然Findbugs同时支持HTML和XML报告格式,我还是选择HTML格式,因为这种形式更具可读性。而且,您可以通过简单地为报告位置添加书签来快速访问它的位置。如果发现Findbgus错误(也会生成报告),此任务也会失败。像执行CheckStyle任务一样执行FindBugs任务(除了任务名称是“FindBugs”)。Findbugs使用技巧由于Android项目与Java项目略有不同,我强烈推荐使用Findbugsfilters(规则配置)。您可以在此找到示例(例如其中一个项目)。它基本上忽略了R文件和您的清单文件。顺便说一下,由于(使用)FindBugs来分析您的代码,您需要至少编译一次代码才能对其进行测试。关于PMD关于此工具有一个有趣的事实:PMD没有确切的名称。(So)在官网上可以找到很有意思的名字,例如:PrettyMuchDoneProjectMeetsDeadline实际上,PMD是一个功能强大的工具,它的工作方式有点像Findbugs,但是(PMD)直接检查源代码而不是检查字节码(顺便说一句,PMD支持多种语言)。(PMD和Findbugs)的核心目标是一样的,都是通过静态分析的方法找出哪些模式导致了bug。那么为什么要同时使用Findbugs和PMD呢?好的!尽管Findbugs和PMD具有相同的目标,但(但)它们的检查方法不同。所以PMD有时会检查出错误,但Findbugs无法检查出它们,反之亦然。以下代码以Gradle形式向您展示了在您的项目中使用PMD的最基本配置(以Gradle任务为例):taskpmd(type:Pmd){ruleSetFiles=files("${project.rootDir}/config/quality/pmd/pmd-ruleset.ignoreFailures=falseruleSets=[]source'include'**/*.报告{xml.enabled=falsexml{destination"$project.buildDir/reports/pmd/pmd.xml"}html{destination"$project.buildDir/reports/pmd/pmd.html"}}}就PMD而言,它和Findbugs几乎一样。PMD同时支持HTML和XML报告格式,所以我再次选择HTML格式。我强烈建议您使用自己的通用配置集文件,就像我在这个例子中所做的那样(检查这个文件)。所以,您当然应该看看这些常用配置文件。我建议你,因为PMD可能比FindBugs更具争议性,例如:如果你不声明“if语句”或“if语句”为空,它基本上会给你一个警告信息。如果这些规则是正确的,或者这对你的项目来说是正确的,我真的很感谢你和你的队友所做的工作。不想程序因为“if语句”而崩溃,我觉得程序的可读性很差。执行PMD任务类似于(执行)CheckStyle任务(除了任务名称为“PMD”)。PMD使用技巧建议大家不要使用默认的规则配置集,需要添加这行代码(已经添加):ruleSets=[]否则,因为默认值就是这些基本规则配置集,基本规则配置set和你定义的规则集一起执行。因此,如果您的自定义规则集不在那些基本配置集中,它们仍会执行。AndroidLint简介“Androidlint工具是一种静态代码分析工具,用于检查Android项目源文件是否存在潜在缺陷,并针对正确性、安全性、性能、可用??性、可访问性和国际化进行优化改进。”正如官网所说,AndroidLint是另外一款专门针对Android的静态分析工具。它非常强大,可以给你很多提高代码质量的建议。Gradle表单android{lintOptions{abortOnErrortruelintConfigfile("${project.rootDir}/config/quality/lint/lint.//iftrue,generateanHTMLreport(withthisissueexplanations,sourcecode,etc)//optionalpathtoreport(defaultwillbelint-results.htmlinthebuilddir)htmlOutputfile("$project.buildDir/reports/lint/lint.html")}我建议你使用单独的文件来定义应该使用哪些配置,不应该使用哪些配置。该网站根据最新的ADT版本定义了所有配置。我的演示项目中的lint文件包含所有这些规则(ADT21),包括“忽略”严重性”:IconDensities:此规则配置确保您在每个图像资源(ldpi除外)中定义(分辨率)密度。IconDipSize:此规则配置确保您为每个dip定义适当的资源(在其他工作中ds,如果你没有为每个密度设置相同的图像资源,你不需要调整图像的大小)。所以你可以重用这个lint文件并激活你想要的所有规则。执行AndroidLint任务,就像执行CheckStyle任务一样(除了任务名为“lint”)。使用AndroidLint的提示AndroidLint没有特别提示,请记住AndroidLint将测试所有配置规则,除了那些具有“严重性”和“忽略”级别的配置。因此,如果发布了新版本ADT下的新配置规则,它们将被检查,而不是被忽略。示例演示现在您已经掌握了在您的项目中使用这四种工具的所有方法。显然,如果我们能同时使用这四种工具就更好了。你可以在你的gradle任务之间添加依赖关系,比如当你执行一个任务时,其他任务先完成后执行。通常在Gradle中,工具之间的相互关系是通过让工具具有“检查”任务来实现的:check.dependsOn'checkstyle','findbugs','pmd','lint'、Findbugs、PMD、AndroidLint会同时执行。这是在执行/提交/推送/询问合并请求之前进行质量检查的好方法。您可以在此Gradle文件中找到所有任务的完整示例。你可以把你看到的demo例子中的所有质量配置文件和Gradle文件分开,都放在“config/quality”文件夹下。小结在本文中,通过Gradle非常容易的使用Android的代码质量检查工具。与在您自己的计算机上使用质量工具在本地检查您的项目相比,这些工具可用于通过Jenkins/Hudson等平台自动构建,让您在自动化构建过程的同时自动化QA。要执行我从CLI公开的所有测试,就像在Jenkins/Hudson上一样,只需执行: