我遇到了什么問題?
Unity要支持IOS 64位,就要用到IL2CPP。而IL2CPP會將IL代碼轉(zhuǎn)換成C++代碼。在我的項目中,這些C++代碼達到5000萬行。沒錯,5000萬行C++代碼!具體各個版本IL2CPP生成C++代碼對比可參考之前的文章《Unity:IOS可執(zhí)行程序超過80MB問題及各版本IL2CPP對比》。

我們的Xcode工程設(shè)置為最小iOS SDK版本為6.0。當(dāng)向Xcode上傳IPA時,就會提示執(zhí)行文件超過限制,無法上傳。
可執(zhí)行文件(Executable)是什么?
這里不是說IPA!不是說IPA!不是說IPA!
可執(zhí)行文件大小,并不是指IPA安裝包的大小,這個在溝通時經(jīng)常沒搞清楚的問題。
眾所周知,iOS開發(fā)中,是采用靜態(tài)庫的方式,所以第三方庫,都會編譯進一個執(zhí)行文件。所謂可執(zhí)行文件,是指ipa里的,通過Xcode靜態(tài)編譯Objective-C出來的一個文件。
拿微信的ipa來舉例:

如何查看我的ipa的執(zhí)行文件大小?
千萬別以為執(zhí)行文件大小=可執(zhí)行文件的解壓后大小
可執(zhí)行文件大小 ≠ 可執(zhí)行文件的解壓后大小
可執(zhí)行文件大小 ≠ 可執(zhí)行文件的解壓后大小
可執(zhí)行文件大小 ≠ 可執(zhí)行文件的解壓后大小
這是一個超級重點。要查看蘋果所說的可執(zhí)行文件大小,需要在Mac下使用size命令:
unzip /XXX/AppName.ipa Payload/AppName.app/AppName
size Payload/AppName.app/AppName

可以看到,命令會列出32位和64位的程序信息,其中__TEXT部分相加,才是我們所說的執(zhí)行文件大小。
上圖,執(zhí)行文件大小85MB,因為我們使用最低的iOS版本是6.0,因此在iOS 6下,就是超過限制了。
真相
蘋果的規(guī)定是怎樣的呢?

總結(jié):
- 執(zhí)行文件大小是指執(zhí)行文件的__TEXT部分
- 當(dāng)IOS最低版本小于7.0,32位+64位最多為80MB;
- 當(dāng)IOS大于等于7.0,每個分區(qū)是60MB(并不是指32位+64位最多為120MB,當(dāng)32位分區(qū)占用50MB,64位分區(qū)占用61MB,總111MB也不行,因為64位分區(qū)超出了);
- 當(dāng)IOS大于等于9.0,總限制400MB;
起初,我把項目的最低iOS版本設(shè)置成7.0,就解決問題了;
但是,3個月后,經(jīng)過各種版本更新后,我們再一次觸犯了大小超過限制的規(guī)定,這時候我們針對IL2CPP的機理進行C#代碼優(yōu)化,減少了大量的IL2CPP代碼生成。 下回分解。