iOS BitCode

做iOS開發很多年了,對BitCode這個詞很熟悉,但要我說卻說不明白這個具體是什麼,所以今天就藉着看到的兩篇介紹文章來做個簡單總結。

首先聲明,本文是大神文章的彙總,如果你只想對Bitcode有個大概瞭解,可以閱讀本文;如果想有個深入的瞭解,建議閱讀 關於bitcode, 知道這些就夠了

一. BitCode是什麼

Bitcode是由LLVM引入的一種中間代碼IR(Intermediate Representation), 它是源代碼被編譯爲二進制機器碼過程中的中間表示形態,它既不是源代碼,也不是機器碼。

    1. 上圖是XCodeLLVM編譯器架構圖,編譯器前端(Frontend),負責把各種類型語言的源代碼編譯爲中間代碼,也就是bitcode
    1. 優化器(Optimizer),負責對bitcode進行各種類型的優化,包括進行一些邏輯等價的轉換,使得代碼的執行效率更高,體積更小。
    1. 編譯器後端(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文件中。
    1. 進行其他類型的Build(非Archive)時,編譯器只會檢查是否滿足開啓bitcode的條件,但並不會真正生成bitcode
三. 爲什麼蘋果要強推bitcode

開發者把bitcode提交到App Store Connect之後,如果蘋果發佈了使用新芯片的iPhone,支持更高效的指令,開發者不需要做任何操作,App Store Connect自己就可以編譯出針對新產品優化過的app,並通過App Store分發給用戶,不需要開發者自己重新打包上架,這樣一來蘋果的Store生態就不需要依賴開發者的積極性了。

四. Xcode14棄用Bitcode,導致應用體積大幅增加

詳情可查看文章,已經總結得很好了。Xcode14棄用Bitcode,導致應用體積大幅增加

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章