美文网首页
iOS代码静态分析平台搭建(一)之OCLint集成

iOS代码静态分析平台搭建(一)之OCLint集成

作者: MichealXXX | 来源:发表于2023-09-24 16:58 被阅读0次

    前言

    每一个项目在一开始的时候代码都是非常规整,结构清晰明了的,但是随着项目的不断迭代,需求不断的增加,团队逐渐壮大后,慢慢我们的项目就开始出了问题,长期下来就会造成我们不愿意面对的“屎山代码”,所以制定一套代码分析系统是十分必要的。

    xcodebuild

    这个无需特意安装,只要电脑中有Xcode就会自带xcodebuild,使用命令行编译项目并不是什么难事,现在几乎所有的公司都采用脚本进行打包操作,如果我们要进行静态代码分析就更加的简单,只需要保证编译过程即可,OCLint的原理就是通过分析我们app的build日志来进行规范性检查,无需像打包一样考虑后续的步骤。

    平时我们编写代码后编译运行都要选择对应的scheme,使用命令行编译代码也一样,cd到工程目录下,我们可以通过xcodebuild -list命令查看工程的target以及scheme还有Configurations

    imac0823@imac TestDemo % xcodebuild -list
    Command line invocation:
        /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -list
    
    User defaults from command line:
        IDEPackageSupportUseBuiltinSCM = YES
    
    Information about project "TestDemo":
        Targets:
            TestDemo
            TestDemoQ
    
        Build Configurations:
            Debug
            DebugPro
            Release
            ReleasePro
    
        If no build configuration is specified and -scheme is not passed then "Release" is used.
    
        Schemes:
            TestDemo
            TestDemoQ
    

    在编译之前最好进行一遍clean操作,以防发生一些意外的错误,这个命令也很常见xcodebuild clean

    xcodebuild clean
    

    接下来就是选择对应的workspacescheme以及Configurations进行构建操作

    xcodebuild build -scheme <your_scheme> -workspace <your_workspace>.xcworkspace -configuration Debug
    

    这时你会发现编译可能会失败并报出以下错误

    note: Building targets in dependency order
    /Users/imac0823/Desktop/TestDemo/TestDemo.xcodeproj: error: Provisioning profile "iOS Team Provisioning Profile: com.xxxx.xxxxx" doesn't include the currently selected device "Xxxxx的iMac" (identifier 000000-000000A000D0000E). (in target 'TestDemoQ' from project 'TestDemo')
    warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'TestDemoQ' from project 'TestDemo')
    ** BUILD FAILED **
    

    这是因为我们没有指定对应的编译设备导致出现问题,可以通过xcodebuild -showsdks查看可选择的编译设备

    imac0823@iMac TestDemo % xcodebuild -showsdks
    DriverKit SDKs:
        DriverKit 22.2                  -sdk driverkit22.2
    
    iOS SDKs:
        iOS 16.2                        -sdk iphoneos16.2
    
    iOS Simulator SDKs:
        Simulator - iOS 16.2            -sdk iphonesimulator16.2
    
    macOS SDKs:
        macOS 13.1                      -sdk macosx13.1
        macOS 13.1                      -sdk macosx13.1
    
    tvOS SDKs:
        tvOS 16.1                       -sdk appletvos16.1
    
    tvOS Simulator SDKs:
        Simulator - tvOS 16.1           -sdk appletvsimulator16.1
    
    watchOS SDKs:
        watchOS 9.1                     -sdk watchos9.1
    
    watchOS Simulator SDKs:
        Simulator - watchOS 9.1         -sdk watchsimulator9.1
    

    直接指定使用iOS SDKs进行编译即可,编译前再加上clean就是完整的编译命令

    xcodebuild clean build -scheme TestDemoQ -workspace TestDemo.xcworkspace -configuration Debug -sdk iphoneos16.2
    

    编译成功

    warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'TestDemoQ' from project 'TestDemo')
    ** BUILD SUCCEEDED **
    

    xcpretty

    命令行编译的过程中我们可以看到控制台整个日志的打印是非常杂乱无章的。
    ️此处需要插入图片️
    xcpretty的作用就是格式化我们的build日志,让整个编译过程的日志看起来更加的清晰明了。

    首先需要通过控制台进行安装

    gem install xcpretty
    

    如果安装遇到权限相关问题可以参考我的上一篇文章,安装成功之后他的使用也很简单,直接在我们编译命令后面跟上xcpretty即可

    xcodebuild clean build -scheme TestDemoQ -workspace TestDemo.xcworkspace -configuration Debug -sdk iphoneos16.2 | xcpretty
    

    使用了xcpretty之后整个打印过程就会清晰明了很多

    之前说过OCLint是分析编译过程的日志来进行规范化扫描,实际上就是需要使用xcpretty格式化之后的日志,因此我们要输出格式化之后的报告。

    -r //设置输出报告的格式,junit,html,json-compilation-database,推荐使用json-compilation-database
    -o //输出文件的名称,必须设置为compile_commands.json,不然OCLint分析的时候会报错
    ️编译命令要添加COMPILER_INDEX_STORE_ENABLE=NO,OCLint分析的时候会报oclint: error: one compiler command contains multiple jobs错误

    完整命令如下:

    xcodebuild clean build -scheme TestDemoQ -workspace TestDemo.xcworkspace -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO -sdk iphoneos16.2 | xcpretty -r json-compilation-database -o compile_commands.json
    

    执行完命令我们的项目工程目录中就会生成一个名为compile_commands.json的文件


    接下来就可以着手准备OCLint的安装了。

    OCLint

    OCLint 是一种静态代码分析工具,用于通过检查 C、C++ 和 Objective-C 代码并查找潜在问题来提高质量并减少缺陷,静态代码分析是检测编译器不可见的缺陷的关键技术。OCLint 通过高级功能自动执行此检查过程:

    • 依托源码的抽象语法树,准确性和效率更高;误报被减少,以避免有用的结果陷入其中。
    • 即使在运行时,也可以将规则动态加载到系统中。
    • 灵活且可扩展的配置,用户可自定义检查规则。
    • 有利于开发过程中代码的持续集成和持续检查,尽早修复技术债务,降低维护成本。

    以上就是OCLint官网的说明。可以使用终端来进行OCLint的安装。

    brew install oclint
    

    也可以从GitHub官方链接下载安装。


    可惜现在从官网下载安装也安装不到最新的版本了😂,它只支持到Xcode13,但是目前大家用的肯定都是Xcode14以上,如果使用官网版本去运行会报非常多的错误。因此,14以下的可以官网下载安装,14以上可以去到这个链接进行下载安装,一位大神修复了OCLint在Xcode14上的问题。

    直接从链接把源码下载下来,使用终端cd到oclint-scripts文件夹下,执行./make即可,完成后找到以下内容,全部拷贝到你想要存放的路径中比如/Users/Documents/OCLint

    最后配置环境变量

    export PATH="/Users/Documents/OCLint/bin:$PATH"
    source ~/.zshrc
    

    输入oclint --version,查看是否配置成功

    imac@iMac ~ % oclint --version
    OCLint (https://oclint.org):
      OCLint version 23.0.
      Built Sep 21 2023 (16:21:47).
    

    OCLint自带了72条检查规则,详情可以参考官方文档,使用OCLint检查代码的时候会查出来非常多不规范的内容,因此我们最好把范围缩小,比如不检查Pods目录下的第三方库,或者系统的Application文件,就可以使用-e来进行忽略。

    -e Pods -e Application
    

    也可以指定输出报告的格式

    -report-type html -o oclintReport.html
    

    完整的指令如下,在compile_commands.json目录下执行,执行完毕就会多出一个oclintReport.html文件,输出报告的时间取决于项目的大小。

    oclint-json-compilation-database -e Pods -e Applications -- -report-type html -o oclintReport.html
    

    这样的报告输出会检查出来非常多的代码不规范,我们也可以指定哪些规则不检测,或者只检测某些规则,这些留到下一篇文章去讲解。

    相关文章

      网友评论

          本文标题:iOS代码静态分析平台搭建(一)之OCLint集成

          本文链接:https://www.haomeiwen.com/subject/kvhavdtx.html