iOS底層探索之LLVM(二)——自定義Clang插件(上)

1. 寫在前面

現(xiàn)在出去面試受神,啟動優(yōu)化是繞不開的抛猖,到底我們的 APP 該如何去進行優(yōu)化呢 ?在優(yōu)化之前我們必須要先了解 LLVM鼻听,在上篇博客中已經介紹了LLVMClang命令的使用财著。

LLVM.png

本篇博客將手把手教大家税朴,自定義一個 Clang 插件庆尘。

2. LLVM下載

編寫Clang插件之前,需要先下載LLVM偷遗,ClangLLVM的子項目醉拓,然后再進行LLVM的編譯伟姐。

2.1 下載LLVM

有些人下載LLVM完成之后,可能會遇到cmake編譯報錯的情況亿卤,報錯信息如下:

cmake編譯報錯

cmake編譯報錯是因為鏡像地址變了愤兵,由原來的git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm/llvm.git變成了git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project.git,通過在 GitHub 上面搜索 llvm也可以發(fā)現(xiàn)確實是地址變了排吴。如下圖所示:

GitHub 搜索 LLVM

llvm GitHub地址: https://github.com/llvm/llvm-project

由于受到我們國內網絡的限制秆乳,我們需要借助鏡像下載LLVM的源碼。

https://mirror.tuna.tsinghua.edu.cn/help/llvm-project.git/

  • 下載LLVM

2.1.1 完整版,包含子倉庫

使用如下命令下載LLVM完整版


git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project.git

llvm GitHub.png
下載完整版 LLVM包含子倉庫

2.1.2 不完整版屹堰,不包含子倉庫

git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project/llvm.git

下載 LLVM

我這里是下載的完整版肛冶,不完整版的下載找不到對應的倉庫,但有的人可以下載双藕,目前我還找不到具體的原因淑趾。

2.2 下載Clang

??下載完整版不需要下面的這些步驟,這是針對不包含子倉庫的操作

  1. LLVMtools目錄下下載Clang

cd llvm/tools
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project/clang.git

  1. LLVMprojects目錄下忧陪,還需要去下載compiler-rtlibcxx近范,libcxxabi嘶摊。

cd ../projects
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project/compiler-rt.git
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project/libcxx.git
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project/libcxxabi.git

  1. Clangtools下安裝clang-tools-extra工具

cd clang/tools
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project/clang-tools-extra.git

3.LLVM編譯

由于最新的LLVM只支持cmake來編譯了,所以我們還需要安裝brewcmake來支持我們的編譯工作评矩。

  • 檢查是否安裝了cmake

檢查是否安裝了cmake

從圖中可以看出叶堆,我電腦上是沒有安裝cmake的,那么現(xiàn)在就去安裝一下斥杜,使用 brew install cmake虱颗。

  • 安裝cmake

安裝cmake報錯

安裝cmake報錯了,對于上面圖中的問題蔗喂,我們應嘗試回收權限忘渔,解決方案如下:

  • 首先打開終端,然后輸入:

sudo chown -R whoami:admin /usr/local/bin

  • 接著系統(tǒng)會提醒你輸入密碼缰儿,輸入密碼回車之后接著輸入:

sudo chown -R whoami:admin /usr/local/share

安裝 cmake

回收權限之后畦粮,安裝cmake 成功了,接下來就是去編譯 llvm了乖阵。

3.1 不完整版編譯


mkdir llvm_build       // 在llvm所在目錄新建文件夾
cd    llvm_build          // 進入llvm_build
cmake -G Xcode ../llvm  // 編譯成Xcode項目

3.2 完整版編譯

完整版編譯使用如下命令:


cd llvm-project                // 進入完整llvm文件夾
mkdir llvm_build             // 新建文件llvm_build
cd llvm_build                 // 進入llvm_build
cmake -G <generator> [options] ../llvm // 編譯成Xcode項目宣赔,具體命令看下面

  • LLVM GitHub 編譯配置
LLVM GitHub 編譯配置.png

比較常見的構建系統(tǒng)生成器(generator):

  • Ninja:大多數(shù)LLVM開發(fā)人員都使用Ninja。
  • Unix Makefiles:用于生成與make兼容的并行makefile瞪浸。
  • Visual Studio:用于生成Visual Studio項目和解決方案儒将。
  • Xcode:用于生成Xcode項目。

這里generator我們選擇Xcode对蒲,-DLLVM_ENABLE_PROJECTS就是需要編譯的子項目钩蚊,這里我們需要加上clangcompiler-rt齐蔽,libcxx两疚,libcxxabiclang-tools-extra含滴。

cmake -G Xcode -DLLVM_ENABLE_PROJECTS='libcxx;libcxxabi;clang;clang-tools-extra;compiler-rt' -DLLDB_USE_SYSTEM_DEBUGSERVER=ON -DLLDB_TEST_COMPILER=clang++ -DCMAKE_OSX_SYSROOT=$OSX_COMMANDLINE_SDKROOT ../llvm

編譯報錯

我這里編譯時報錯的诱渤,因為我不完整版下載不了,完整版下載了又編譯出錯谈况,搞了一天了勺美,都不知道怎么弄递胧,聽網上說是要設置 默認的shellzsh,命令如下:
進入終端執(zhí)行


echo 'export OSX_COMMANDLINE_SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"' >> ~/.zshrc

然后再執(zhí)行:

source ~/.zshrc

但是我這樣操作是有問題的赡茸,如下:

shell 設置

按這種操作不起作用缎脾,我檢查了我的電腦默認的就是/bin/zsh
shell默認的就是/bin/zsh

反正折騰了一天也沒有找到方法來解決,有可能是 zsh的配置有問題占卧,既然不完整的下載不了遗菠,完整的又編譯不了,那么我何不綜合一下华蜒,看看能否解決問題呢辙纬!于是我就嘗試的去做了如下操作。

因為我是下載的完整版的 LLVM叭喜,里面已經包含了各種子倉庫了贺拣,如下圖:

完整版的 LLVM

上面??已經介紹過了不完整的配置過程,那么我就按照這個流程捂蕴,把完整版里面的子倉庫譬涡,拷貝到對應的目錄里面去。

  • Clang 拷貝到llvm/tools目錄下
  • compiler-rt啥辨,libcxx涡匀,libcxxabi,拷貝到LLVMprojects目錄下
  • clang-tools-extra工具拷貝到Clangtools里面

其實也就是相當于走了一遍不完整LLVM的下載流程委可,只是不是去網絡下載了渊跋,只是我本地拷貝了需要的子倉庫到對應的目錄下面,那么現(xiàn)在就是萬事俱備只欠東風了着倾,下面??就是見證奇跡的時刻了拾酝。

見證奇跡的時刻

llvm-project/llvm_build目錄下敲入如下cmake編譯命令:

cmake -G Xcode ../llvm

奇跡發(fā)生了,在進行編譯了卡者,是的 ! 你沒有看錯蒿囤,它沒有報錯了。

cmake編譯
厲害表情@2x.png

cmake編譯命令一回車崇决,就開始編譯了材诽,這個過程半個小時起步,看你的電腦性能了恒傻。這時候風扇慢慢的開始呼呼的響起來了脸侥,CPU 溫度直線上升,如下圖感知一下吧盈厘!

CPU 工作情況

過了半個多小時睁枕,編譯完成了,當我想把編譯成功的界面截圖下來的時候。外遇。注簿。。意外發(fā)生了跳仿。诡渴。。菲语。當我沉浸在編譯成功的喜悅之時妄辩,電腦突然就黑屏了,掛了山上,電腦掛了恩袱,就很突然,電腦直接關機了胶哲。。潭辈。鸯屿。
難受,想哭

難受把敢,想哭寄摆,我下意識的用手去摸了一下電腦的散熱區(qū)域,好家伙修赞,我直呼好家伙吧裟铡!可以煎雞蛋了柏副,真 TM燙手肮窗睢!溫度太高了割择,電腦觸發(fā)了保護機制眷篇,直接就關機了。

過了幾分鐘荔泳,待電腦溫度降下來蕉饼,我重新開機了,打開了 LLVM 的編譯目錄llvm_build玛歌,里面有編譯成功的 Xcode工程了昧港,這表明是真的編譯成功了,這時候還是有一絲絲的得到安慰的??支子。如下圖所示:

LLVM編譯成功的工程

3.3 LLVM的工程編譯

雙擊打開LLVM編譯后的工程创肥,會彈出如下彈窗(第一次打開會有)

首次打開LLVM工程出現(xiàn)彈窗

?? 項目“LLVM”包含大量target,可能會導致自動創(chuàng)建大量scheme。 如果您愿意瓤的,您可以改為僅手動創(chuàng)建您需要的方案休弃。

我們選擇第二個,手動去創(chuàng)建圈膏,就彈出如下界面

手動去創(chuàng)建界面

我們需要添加 clangclangTooling塔猾,可以通過輸入我們需要的 clangclangTooling直接下拉選擇。
添加 clang 和 clangTooling

添加完了 clangclangTooling之后稽坤,需要在XcodeScheme里面分別去選擇clangclangTooling進行編譯丈甸,這個過程也是比較漫長的,至少得 1 個小時以上尿褪,你可以去干點別的事情來打發(fā)時間了睦擂。
Xcode Scheme

  • clangTooling編譯

內存情況

clangTooling還是比較快的,我這花了差不多半個小時吧杖玲,內存還有 22G左右顿仇,CPU 負載比較高,溫度也比較高摆马,我這插上了外接的風扇來降溫了臼闻。

  • clang編譯

clang編譯

clang編譯的時間比較長,得一個多小時囤采,由于編譯之后的體積增大述呐,內存嚴重不足了,發(fā)出了警告??蕉毯。連微信也發(fā)出了內存警告乓搬。
內存不足警告??

  • 微信發(fā)出電腦空間不足的警告??
微信發(fā)出電腦空間不足的警告

發(fā)出內存不足的警告之后,大概二十分鐘左右代虾,內存是真的不足了进肯,編譯報錯(No space left on device)設備內存不足了,設備上沒有剩余空間褐着,我趕緊把一些不需要的東西卸載掉坷澡,又騰出了五六個G 的空間,又開始編譯含蓉,由于之前編譯過了频敛,這次并沒有從零開始,而是很快就編譯完成了馅扣。

llvm工程編譯完成之后的大小

llvm工程編譯完成之后的大小為 23.38G斟赚,這是真大啊差油!不是一般的大稗志任洞!

4. 總結

  • LLVM 下載的地址變了,可以去 GitHub 直接搜索找到最新的地址
  • LLVM 編譯注意事項??:
    • 電腦空間一定要留足夠发侵,保險起見留個30G
    • 編譯時插上外接風扇給電腦降溫交掏,這個很重要,不然溫度過高刃鳄,電腦會關機的盅弛。
  • 我的 Xcode 版本是Version 12.5
  • macOS Big Sur 11.4
  • 以上內容僅供參考,每個人的電腦環(huán)境不一樣叔锐,可能有差別
  • 以上內容只是我自己在編譯 LLVM的過程中的記錄過程挪鹏,也許你們的過程會比較順利,不會出現(xiàn)我遇到的各種問題愉烙。

5. 寫在后面

未完待續(xù)讨盒。。步责。返顺。。關注我蔓肯,更多內容持續(xù)輸出创南!

下篇將開始自定義Clang插件(下)——代碼的編寫

敬請期待!

?? 喜歡就點個贊吧????

?? 覺得有收獲的省核,可以來一波 收藏+關注,以免你下次找不到我????

??歡迎大家留言交流昆码,批評指正气忠,轉發(fā)請注明出處,謝謝支持赋咽!??

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末旧噪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脓匿,更是在濱河造成了極大的恐慌淘钟,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陪毡,死亡現(xiàn)場離奇詭異米母,居然都是意外死亡,警方通過查閱死者的電腦和手機毡琉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門铁瞒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桅滋,你說我怎么就攤上這事慧耍∩肀妫” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵芍碧,是天一觀的道長煌珊。 經常有香客問我,道長泌豆,這世上最難降的妖魔是什么定庵? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮践美,結果婚禮上洗贰,老公的妹妹穿的比我還像新娘。我一直安慰自己陨倡,他們只是感情好敛滋,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兴革,像睡著了一般绎晃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杂曲,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天庶艾,我揣著相機與錄音,去河邊找鬼擎勘。 笑死咱揍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的棚饵。 我是一名探鬼主播煤裙,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼噪漾!你這毒婦竟也來了硼砰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤欣硼,失蹤者是張志新(化名)和其女友劉穎题翰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诈胜,經...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡豹障,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了焦匈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沼填。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖括授,靈堂內的尸體忽然破棺而出坞笙,到底是詐尸還是另有隱情岩饼,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布薛夜,位于F島的核電站籍茧,受9級特大地震影響,放射性物質發(fā)生泄漏梯澜。R本人自食惡果不足惜寞冯,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晚伙。 院中可真熱鬧吮龄,春花似錦、人聲如沸咆疗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽午磁。三九已至尝抖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迅皇,已是汗流浹背昧辽。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留登颓,地道東北人搅荞。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像框咙,于是被迫代替她去往敵國和親取具。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內容