做iOS開發很多年了,對BitCode
這個詞很熟悉,但要我說卻說不明白這個具體是什麼,所以今天就藉着看到的兩篇介紹文章來做個簡單總結。
首先聲明,本文是大神文章的彙總,如果你只想對Bitcode有個大概瞭解,可以閱讀本文;如果想有個深入的瞭解,建議閱讀 關於bitcode, 知道這些就夠了
一. BitCode是什麼
Bitcode
是由LLVM
引入的一種中間代碼IR(Intermediate Representation)
, 它是源代碼被編譯爲二進制機器碼過程中的中間表示形態,它既不是源代碼,也不是機器碼。
- 上圖是
XCode
的LLVM
編譯器架構圖,編譯器前端(Frontend)
,負責把各種類型語言的源代碼編譯爲中間代碼,也就是bitcode
。
- 上圖是
-
優化器(Optimizer)
,負責對bitcode
進行各種類型的優化,包括進行一些邏輯等價的轉換,使得代碼的執行效率更高,體積更小。
-
-
編譯器後端(Backend)
,負責把優化後的bitcode
編譯爲指定目標架構的機器碼。
-
通過命令行可將代碼生成bitcode
,證明了它確實是中間代碼。
// test.c中的代碼
#include <stdio.h>
int main(void) {
printf("hello, world.\n");
return 0;
}
// 下面是命令行
$ clang -emit-llvm -c test.c -o test.bc # 將源代碼編譯爲bitcode
$ file test.bc # file命令用來探測給定文件的類型
test.bc: LLVM bitcode, wrapper x86_64 # 可以看到是LLVM的 bitcode文件
二. BitCode開啓不開啓有何異同
Xode中不開啓BitCode編譯設置:
首先,打包時bitcode
爲不開啓,導出ipa時也不要勾選包含bitcode
。
然後最終ipa
包會直接使用Archive
時編譯出的二進制代碼。
開啓後:
首先,要以bitcode
方式上傳app
,必須在開啓bitcode
的狀態下,進行Archive
打包, 並且在導出ipa時需要勾選包含bitcode
。
- 1.進行
Archive
時,bitcode
會被嵌入到鏈接後的二進制文件中,用於提交給App Store
。從編譯日誌中可以看出,Archive
時多了一個編譯參數-fembed-bitcode
,跟不開啓的區別就是會將未經任何加密或者壓縮的bitcode
文件嵌入到.o
文件中。 - 進行其他類型的Build(非Archive)時,編譯器只會檢查是否滿足開啓
bitcode
的條件,但並不會真正生成bitcode
。
- 進行其他類型的Build(非Archive)時,編譯器只會檢查是否滿足開啓
三. 爲什麼蘋果要強推bitcode
開發者把bitcode
提交到App Store Connect
之後,如果蘋果發佈了使用新芯片的iPhone,支持更高效的指令,開發者不需要做任何操作,App Store Connect
自己就可以編譯出針對新產品優化過的app,並通過App Store
分發給用戶,不需要開發者自己重新打包上架,這樣一來蘋果的Store生態就不需要依賴開發者的積極性了。
四. Xcode14棄用Bitcode,導致應用體積大幅增加
詳情可查看文章,已經總結得很好了。Xcode14棄用Bitcode,導致應用體積大幅增加