Advertisement
  1. Code
  2. Android SDK

使用静态分析工具SAT来确保高质量的安卓代码

by
Read Time:12 minsLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

在今天的教程中,我们将学习如何使用一些静态代码分析工具来确保项目中高品质的Android代码。我们将研究Checkstyle,FindBugs,PMD和Android Studio Lint,它们都是免费和开源的!

什么是静态代码分析工具?

静态代码分析工具是解析和分析代码而不实际执行代码的工具。它的目的是找出潜在的漏洞,例如错误和安全漏洞。 一个受欢迎的免费静态代码分析器(如FindBugs)可以根据你代码应遵循的一组规则来检查你的代码 - 如果代码不遵循这些规则,那么可能是某些地方出错了。 可以将静态代码分析工具看作在最终编译成系统语言之前运行的附加编译器。

除了在构建过程中进行代码审查和单元测试以为,许多软件公司都要求项目通过静态代码分析测试。 甚至开源项目的维护者通常也会在构建过程中引入静态代码分析。所以学习静态分析是编写高质量代码的重要一步。 请注意,静态代码分析(也称为“白盒”)测试不应代替源代码的单元测试。

在本教程中,我们将学习一些可用于Android和Java的流行静态分析工具。但我们先来看看使用静态分析的好处。

好处

  • 即使单元测试或手动测试可能错过的潜在错误,静态代码分析也能帮助检测到。
  • 定义与项目相关的特定规则。例如,作为构建链中一部分的静态分析可以帮助新手加快新团队的代码标准化。
  • 帮助你提高对新语言的了解。
  • 扫描整个项目,包括您可能没有阅读过的文件。

设置

我们将在本教程中学到的所有代码分析工具都可以作为Gradle插件,所以我们可以为每个插件创建单独的Gradle任务。 我们使用包含静态分析工具的单一Gradle文件。但在此之前,让我们创建一个文件夹,里面包含我们所有的静态代码分析文件。

打开Android Studio和app module(在Project视图中),创建一个新文件夹,将其命名为code_quality_tools。该文件夹将包含用于代码分析工具的XML文件和一个Gradle文件quality.gradle,后者将运行我们的静态分析任务。

Android studio project structure screenshotAndroid studio project structure screenshotAndroid studio project structure screenshot

最后,打开app module文件夹中的build.gradle,并将此行添加在文件末尾:

在这里,我们的quality.gradle Gradle脚本正在应用于其本地文件位置的引用。

Checkstyle

在XML文件中指定规则以强制执行项目的编码标准,Checkstyle通过分析源代码来执行这些规则,并将其与已知的编码标准或约定进行比较。

Checkstyle是一个由社区积极维护的开源工具。这意味着您可以通过创建自己的自定义检查或修改现有的检查以满足您的需要。 例如,Checkstyle可以对类中的常量名称(final,static或both)进行检查。 如果您的常数名称不符合大写字母被下划线分隔的的规则,问题就会被标记出来。

集成Checkstyle

我将展示如何将Checkstyle集成到我们的Android Studio项目中,并演示一个具体的例子。

首先,我们需要创建我们的编码规则。在checkstyle.xml中,我们创建了一些检查代码的Checkstyle配置规则。

在上面的代码中,我们引入了希望Checkstyle检查源代码的规则。 一个规则是AvoidStarImport,望文生义,这个规则用来检查您的源代码是否包含像java.util.*的import语句。 (相反,您应该明确指定要导入的包,例如java.util.Observable。)

一些规则是有属性的,这些属性可以设置,就像设置ParameterNumber一样,这限制了一个方法或构造函数的参数数量。 默认情况下,属性max为7,但我们修改为6。看看 other checks on the Checkstyle website

要运行此检查,我们需要创建一个Gradle任务。所以访问quality.gradle文件并创建一个名为checkstyle的任务:

注意,在上面的代码中,我们首先用了Checkstyle Gradle插件。然后我们给它一个描述,并将其添加到已经预定义的叫verification的Gradle组。

我们关心的Checkstyle Gradle任务的关键属性是:

  • configFile:要使用的Checkstyle配置文件。
  • IgnoreFailures:如果有警告,是否允许继续操作。
  • include:引入的模式集合
  • exclude:排除的属性集合。在这种情况下,我们不扫描产生的类。

最后,您可以通过访问Android Studio上的Gradle工具窗口来运行Gradle脚本,然后打开verification组,然后单击checkstyle来运行任务。

Gradle toolbar open to run checkstyle taskGradle toolbar open to run checkstyle taskGradle toolbar open to run checkstyle task

另外一种方法是使用命令行:

任务运行完成后会生成一份报告,在app module > build > reports > checkstyle查看该报告。 您可以打开checkstyle.html查看报告具体内容。

Android Studio Checkstyle report folder locationAndroid Studio Checkstyle report folder locationAndroid Studio Checkstyle report folder location

Checkstyle插件在Android Studio或IntelliJ IDEA中是免费的。 它提供对Java文件的实时扫描。

PMD

PMD是另一个开源代码分析工具,主要用于分析源代码。 它可以发现常见的缺陷,比如未使用的变量,空的catch块,不必要的对象创建等等。 PMD有许多可以选择的规则集。  Design Rules 集合中的一个例子是:

  • SimplifyBooleanExpressions:避免在布尔表达式中进行不必要的比较,这会使简单的代码复杂化。 比如:

PMD配置了pmd.xml文件。在那个文件里面,我们将引入一些配置规则,例如Android命名设计

就像Checkstyle一样,我们还需要创建一个PMD Gradle任务,以便在quality.gradle文件中执行检查。

PDM也是一个Gradle 插件

我们创建的任务的关键属性是:

  • ruleSetFiles:要使用的自定义规则集文件。
  • source:任务来源。
  • 报告:任务生成的报告。

最后,您可以通过打开Gradle工具窗口运行Gradle脚本,打开验证组文件夹,然后单击pmd来运行该任务来。或者您可以通过如下命令行运行它:

任务执行完后生成的报告在app module > build > reports > pmd。还有一个适用于IntelliJ或Android Studio的PMD插件可供您下载并集成(如果需要)。

FindBugs

FindBugs是另一个免费的静态分析工具,它通过将您的字节码与已知的错误模式列表匹配来查找潜在问题。其中一些是:

  • 类定义了hashCode()方法,但没有定义equals()方法:一个类实现了hashCode()方法,而没有实现equals()方法 - 因此两个没有相同的哈希码实例也可能相等。这属于不良做法。
  • int值与长整型常数的比较:将int值与长整型常数比较,而长整型常数超出了int值的表示范围。 这种比较可能会产生意想不到的结果。不过这属于正常范畴。
  • TestCase没有测试:JUnit TestCase没有实现任何测试方法。这种模式也是正确的。

FindBugs是一个开源项目,因此您可以查看,贡献或监控GitHub上源代码的进度。

findbugs-exclude.xml文件中,我们希望阻止FindBugs在我们的项目中扫描一些类(使用正则表达式),例如自动生成的资源类和自动生成的清单类。 此外,如果您使用Dagger,我们希望FindBugs不检查生成的Dagger类。我们也可以告诉FindBugs忽略一些规则。

最后,在quality.gradle中引入findbugs任务。

在上面的第一行,我们把FindBugs作为Gradle插件使用,然后创建一个名为findbugs的任务。我们真正关心的findbugs任务的关键属性是:

  • classes:要分析的类。
  • effort:分析effort水平。指定值应为mindefaultmax其中之一。级别越高精度越高,发现的错误越多,不过代价是需要运行时间和消耗内存。
  • reportLevel:报告错误的优先级阈值。如果reportLevel设置为低,则会报告所有错误。如果设置为中等(默认),会报告中、高优先级错误。如果设置为高,则仅报告高优先级的错误。
  • excludeFilter:排除指定错误的过滤器名。

然后,您可以通过访问Gradle工具窗口运行Gradle脚本,打开verification组文件夹,然后单击findbugs来运行该任务。或者从命令行启动它:

当任务执行完成时,生成的报告在app module> build> reports> findbugs中找到。 FindBugs插件免费,可在与IntelliJ IDEA或Android Studio下载和集成。

Android Lint

Lint是另一个代码分析工具,Android Studio默认自带。它检查您的Android项目源文件是否有潜在的错误和优化的正确性,安全性,性能,可用性,可访问性和国际化。

要配置Lint,您必须在module级的build.gradle文件中引入lintOptions {}块:

我们关心的关键Lint选项是

  • abortOnError:如果发现错误,lint是否应该设置进程的退出代码。
  • quiet:是否关闭分析进度报告。
  • lintConfig:要使用的默认配置文件。

您的lint.xml文件可以包含您希望Lint忽略或修改的主题,例如下面的示例:

Android Studio手动运行Lint的步骤,单击Analyze菜单,选择Inspect Code....(检查范围是整个项目),然后单击确定按钮继续。

Android studio inspect code menu Android studio inspect code menu Android studio inspect code menu
Android Studio lint inspect whole project code dialogAndroid Studio lint inspect whole project code dialogAndroid Studio lint inspect whole project code dialog

您还可以通过打开Gradle工具窗口,打开verification组,然后单击lint来运行Lint。最后,您可以通过命令行运行它。

在Windows系统上:

在Linux或Mac系统上:

当任务运行完成后会生成一个报告,该报告可以在app module> build> outputs> lint-results.html中找到。

Bonus: StrictMode

StrictMode是开发者工具,可防止开发者在主线程上执行意外的闪存I / O或网络I / O,因为这可能导致应用程序缓慢或无响应。 它也有助于防止出现ANR(App Not Responding)对话框。 使用StrictMode后,您的APP将变得更加丝滑,用户将享受更流畅的体验。 StrictMode使用两组策略来执行其规则:

  • VM策略:防止不良编码,例如不关闭SQLiteCursor对象或不关闭Closeable对象。
  • 线程策略:查找在主线程而不是后台线程上执行的Flash I / O和网络I / O等操作。

上面的代码可以在你的Application,Activity或其他Activity组件的onCreate()方法中。

您可以在Envato Tuts +上了解更多关于StrictMode的信息。

在文章GitHub repo中,可以找到上面所有的代码示例,包括Android代码项目工具的规则集。

结语

在本教程中,你学到了如何使用静态代码分析工具确保高质量的Android代码:它们是什么,使用它们的好处,以及如何在应用程序中使用Checkstyle,FindBugs,Lint,PMD和StrictMode。 继续使用这些工具 - 你可能会发现一些您从未意识到的代码问题。

与此同时,请查看其他关于Android应用程序开发的教程!

关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.