怎么通过静态分析提高iOS代码质量(ios,移动开发)

时间:2024-05-03 16:36:08 作者 : 石家庄SEO 分类 : 移动开发
  • TAG :

    %E6%80%8E%E4%B9%88%E9%80%9A%E8%BF%87%E9%9D%99%E6%80%81%E5%88%86%E6%9E%90%E6%8F%90%E9%AB%98iOS%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F

随着项目的扩大,依靠人工codereview来保证项目的质量,越来越不现实,这时就有必要借助于一种自动化的代码审查工具:程序静态分析

程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。(来自百度百科)

Swift语言对应的静态分析工具是SwiftLint,OC语言对应的静态分析工具有Infer和OCLitn。以下会是对各个静态分析工具的安装和使用做一个介绍。

怎么通过静态分析提高iOS代码质量

这种方式相当于把SwiftLint作为一个三方库集成进了项目,因为它只是调试工具,所以我们应该将其指定为仅Debug环境下生效。

我们需要在项目中的Build Phases,添加一个Run Script Phase。如果是通过homebrew安装的,你的脚本应该是这样的。

如果是通过cocoapods安装的,你得脚本应该是这样的:

怎么通过静态分析提高iOS代码质量

键入CMD + B编译项目,在编译完后会运行我们刚才加入的脚本,之后我们就能看到项目中大片的警告信息。有时候build信息并不能填入项目代码中,我们可以在编译的log日志里查看。
怎么通过静态分析提高iOS代码质量

SwiftLint规则太多了,如果我们不想执行某一规则,或者想要滤掉对Pods库的分析,我们可以对SwfitLint进行配置。

在项目根目录新建一个.swiftlint.yml文件,然后填入如下内容:

一条rules提示如下,其对应的rules名就是function_body_length

disabled_rules下填入我们不想遵循的规则。

excluded设置我们想跳过检查的目录,Carthage、Pod、SubModule这些一般可以过滤掉。

其他的一些像是文件长度(file_length),类型名长度(type_name),我们可以通过设置具体的数值来调节。

另外SwiftLint也支持自定义规则,我们可以根据自己的需求,定义自己的rule

如果我们想将此次分析生成一份报告,也是可以的(该命令是通过homebrew安装的swiftlint):

怎么通过静态分析提高iOS代码质量

xcodebuild是xcode内置的编译命令,我们可以用它来编译打包我们的iOS项目,接下来介绍的Infer和OCLint都是基于xcodebuild的编译产物进行分析的,所以有必要简单介绍一下它。

一般编译一个项目,我们需要指定项目名,configuration,scheme,sdk等信息以下是几个简单的命令及说明。

之后对xcodebuild命令的使用都需要将这些参数替换为自己项目的参数。

怎么通过静态分析提高iOS代码质量

Infer是Facebook开发的针对C、OC、Java语言的静态分析工具,它同时支持对iOS和Android应用的分析。对于Facebook内部的应用像是 Messenger、Instagram 和其他一些应用均是有它进行静态分析的。它主要检测隐含的问题,主要包括以下几条:

资源泄露,内存泄露

变量和参数的非空检测

循环引用

过早的nil操作

暂不支持自定义规则。

运行infer

我们会得到一个infer-out的文件夹,里面是各种代码分析的文件,有txt,json等文件格式,当这样不方便查看,我们可以将其转成html格式:

怎么通过静态分析提高iOS代码质量

点击trace,我们会看到该问题代码的上下文。

因为Infer默认是增量编译,只会分析变动的代码,如果我们想整体编译的话,需要clean一下项目:

再次运行Infer去编译。

Infer的静态分析主要分两个阶段:

1、捕获阶段

Infer 捕获编译命令,将文件翻译成 Infer 内部的中间语言。

2、分析阶段

在分析一个函数的时候,如果发现错误,将会停止分析,但这不影响其他函数的继续分析。

所以你在检查问题的时候,修复输出的错误之后,需要继续运行 Infer 进行检查,知道确认所有问题都已经修复。

OCLint一般通过Homebrew安装

通过Hombrew安装的版本为0.13。

我分别用Xcode11在两个项目上运行过OCLint,一个实例项目可以正常运行,另一个复杂的项目却运行失败,报如下错误:

我并不清楚原因,如果你想试试0.13能否使用的话,直接跳到安装xcpretty。如果你也遇到了这个问题,可以回来安装oclint0.15版本。

如果不关心编译过程,可以下载编译好的包,跳到设置环境变量那一步。

编译OCLint

2、clone OCLint项目

3、进入oclint-scripts目录,执行make命令

成功之后会出现build文件夹,里面有个oclint-release就是编译成功的oclint工具。

设置oclint工具的环境变量

设置环境变量的目的是为了我们能够快捷访问。然后我们需要配置PATH环境变量,注意OCLint_PATH的路径为你存放oclint-release的路径。将其添加到.zshrc,或者.bash_profile文件末尾:

执行source .zshrc,刷新环境变量,然后验证oclint是否安装成功:

出现这个介绍就说明我们已经完成了安装。

xcpretty是一个格式化xcodebuild输出内容的脚本工具,oclint的解析依赖于它的输出。它的安装方式为:

在使用OCLint之前还需要一些准备工作,需要将编译项COMPILER_INDEX_STORE_ENABLE设置为NO。

1、进入项目根目录,运行如下脚本:

会将xcodebuild编译过程中的一些信息记录成一个文件compile_commands.json,如果我们在项目根目录看到了该文件,且里面是有内容的,证明我们完成了第一步。

2、我们将这个json文件转成方便查看的html,过滤掉对Pods文件的分析,为了防止行数上限,我们加上行数的限制:

最终会产生一个oclintReport.html文件。

怎么通过静态分析提高iOS代码质量

OCLint支持自定义规则,因为其本身规则已经很丰富了,自定义规则的需求应该很小,也就没有尝试。

封装脚本

OCLint跟Infer一样都是通过运行几个脚本语言进行执行的,我们可以将这几个命令封装成一个脚本文件,以OCLint为例,Infer也类似:

oclint-json-compilation-database命令的几个参数说明:

-e 需要忽略分析的文件,这些文件的警告不会出现在报告中

-disable-rule 需要忽略的规则,根据项目需求设置

因为OCLint提供了xcode格式的输出样式,所以我们可以将它作为一个脚本放在Xcode中。

1、在项目的 TARGETS 下面,点击下方的 “+” ,选择 cross-platform 下面的 Aggregate。输入名字,这里命名为 OCLint

怎么通过静态分析提高iOS代码质量

2、选中该Target,进入Build Phases,添加Run Script,写入下面脚本:

可以看出该脚本跟上面的脚本一样,只不过 将oclint-json-compilation-database命令的-report-typehtml改为了xcode。而OCLint作为一个target本身就运行在特定的环境下,所以xcodebuild可以省去配置参数。

3、通过CMD + B我们编译一下项目,执行脚本任务,会得到能够定位到代码的warning信息:

怎么通过静态分析提高iOS代码质量

本文:怎么通过静态分析提高iOS代码质量的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Android studio有哪些使用小技巧下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18