iOS代碼靜態(tài)分析平臺搭建(一)之OCLint集成

前言

每一個項目在一開始的時候代碼都是非常規(guī)整柱查,結構清晰明了的,但是隨著項目的不斷迭代虐急,需求不斷的增加,團隊逐漸壯大后滔迈,慢慢我們的項目就開始出了問題止吁,長期下來就會造成我們不愿意面對的“屎山代碼”,所以制定一套代碼分析系統(tǒng)是十分必要的燎悍。

xcodebuild

這個無需特意安裝敬惦,只要電腦中有Xcode就會自帶xcodebuild,使用命令行編譯項目并不是什么難事谈山,現(xiàn)在幾乎所有的公司都采用腳本進行打包操作俄删,如果我們要進行靜態(tài)代碼分析就更加的簡單,只需要保證編譯過程即可奏路,OCLint的原理就是通過分析我們app的build日志來進行規(guī)范性檢查畴椰,無需像打包一樣考慮后續(xù)的步驟。

平時我們編寫代碼后編譯運行都要選擇對應的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操作秽褒,以防發(fā)生一些意外的錯誤壶硅,這個命令也很常見xcodebuild clean

xcodebuild clean

接下來就是選擇對應的workspace销斟,scheme以及Configurations進行構建操作

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

這時你會發(fā)現(xiàn)編譯可能會失敗并報出以下錯誤

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 **

這是因為我們沒有指定對應的編譯設備導致出現(xiàn)問題庐椒,可以通過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是分析編譯過程的日志來進行規(guī)范化掃描,實際上就是需要使用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

執(zhí)行完命令我們的項目工程目錄中就會生成一個名為compile_commands.json的文件


接下來就可以著手準備OCLint的安裝了育苟。

OCLint

OCLint 是一種靜態(tài)代碼分析工具较鼓,用于通過檢查 C、C++ 和 Objective-C 代碼并查找潛在問題來提高質量并減少缺陷宙搬,靜態(tài)代碼分析是檢測編譯器不可見的缺陷的關鍵技術笨腥。OCLint 通過高級功能自動執(zhí)行此檢查過程:

  • 依托源碼的抽象語法樹,準確性和效率更高勇垛;誤報被減少脖母,以避免有用的結果陷入其中。
  • 即使在運行時闲孤,也可以將規(guī)則動態(tài)加載到系統(tǒng)中谆级。
  • 靈活且可擴展的配置,用戶可自定義檢查規(guī)則讼积。
  • 有利于開發(fā)過程中代碼的持續(xù)集成和持續(xù)檢查肥照,盡早修復技術債務,降低維護成本勤众。

以上就是OCLint官網(wǎng)的說明舆绎。可以使用終端來進行OCLint的安裝们颜。

brew install oclint

也可以從GitHub官方鏈接下載安裝吕朵。


可惜現(xiàn)在從官網(wǎng)下載安裝也安裝不到最新的版本了??猎醇,它只支持到Xcode13,但是目前大家用的肯定都是Xcode14以上努溃,如果使用官網(wǎng)版本去運行會報非常多的錯誤硫嘶。因此,14以下的可以官網(wǎng)下載安裝梧税,14以上可以去到這個鏈接進行下載安裝沦疾,一位大神修復了OCLint在Xcode14上的問題。

直接從鏈接把源碼下載下來第队,使用終端cd到oclint-scripts文件夾下哮塞,執(zhí)行./make即可,完成后找到以下內(nèi)容斥铺,全部拷貝到你想要存放的路徑中比如/Users/Documents/OCLint彻桃。

最后配置環(huán)境變量

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條檢查規(guī)則晾蜘,詳情可以參考官方文檔,使用OCLint檢查代碼的時候會查出來非常多不規(guī)范的內(nèi)容眠屎,因此我們最好把范圍縮小剔交,比如不檢查Pods目錄下的第三方庫,或者系統(tǒng)的Application文件改衩,就可以使用-e來進行忽略岖常。

-e Pods -e Application

也可以指定輸出報告的格式

-report-type html -o oclintReport.html

完整的指令如下,在compile_commands.json目錄下執(zhí)行葫督,執(zhí)行完畢就會多出一個oclintReport.html文件竭鞍,輸出報告的時間取決于項目的大小。

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

這樣的報告輸出會檢查出來非常多的代碼不規(guī)范橄镜,我們也可以指定哪些規(guī)則不檢測偎快,或者只檢測某些規(guī)則,這些留到下一篇文章去講解洽胶。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晒夹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姊氓,更是在濱河造成了極大的恐慌丐怯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔横,死亡現(xiàn)場離奇詭異读跷,居然都是意外死亡,警方通過查閱死者的電腦和手機禾唁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門效览,熙熙樓的掌柜王于貴愁眉苦臉地迎上來些膨,“玉大人,你說我怎么就攤上這事钦铺《┪恚” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵矛洞,是天一觀的道長洼哎。 經(jīng)常有香客問我,道長沼本,這世上最難降的妖魔是什么噩峦? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮抽兆,結果婚禮上识补,老公的妹妹穿的比我還像新娘。我一直安慰自己辫红,他們只是感情好凭涂,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贴妻,像睡著了一般切油。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上名惩,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天澎胡,我揣著相機與錄音,去河邊找鬼娩鹉。 笑死攻谁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的弯予。 我是一名探鬼主播戚宦,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熙涤!你這毒婦竟也來了阁苞?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤祠挫,失蹤者是張志新(化名)和其女友劉穎那槽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體等舔,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡骚灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了慌植。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甚牲。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡义郑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丈钙,到底是詐尸還是另有隱情非驮,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布雏赦,位于F島的核電站劫笙,受9級特大地震影響,放射性物質發(fā)生泄漏星岗。R本人自食惡果不足惜填大,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俏橘。 院中可真熱鬧允华,春花似錦、人聲如沸寥掐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曹仗。三九已至榨汤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怎茫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工妓灌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轨蛤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓虫埂,卻偏偏與公主長得像祥山,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掉伏,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容