我遇到了什么問題?
Unity要支持IOS 64位,就要用到IL2CPP。而IL2CPP會將IL代碼轉換成C++代碼。在我的項目中,這些C++代碼達到5000萬行。沒錯,5000萬行C++代碼!具體各個版本IL2CPP生成C++代碼對比可參考之前的文章《Unity:IOS可執行程序超過80MB問題及各版本IL2CPP對比》。
我們的Xcode工程設置為最小iOS SDK版本為6.0。當向Xcode上傳IPA時,就會提示執行文件超過限制,無法上傳。
可執行文件(Executable)是什么?
這里不是說IPA!不是說IPA!不是說IPA!
可執行文件大小,并不是指IPA安裝包的大小,這個在溝通時經常沒搞清楚的問題。
眾所周知,iOS開發中,是采用靜態庫的方式,所以第三方庫,都會編譯進一個執行文件。所謂可執行文件,是指ipa里的,通過Xcode靜態編譯Objective-C出來的一個文件。
拿微信的ipa來舉例:
用壓縮軟件打開IPA,Payload/MicroMessenger.app/MicroMessenger就是微信的可執行文件了
如何查看我的ipa的執行文件大小?
千萬別以為執行文件大小=可執行文件的解壓后大小
可執行文件大小 ≠ 可執行文件的解壓后大小
可執行文件大小 ≠ 可執行文件的解壓后大小
可執行文件大小 ≠ 可執行文件的解壓后大小
這是一個超級重點。要查看蘋果所說的可執行文件大小,需要在Mac下使用size命令:
unzip /XXX/AppName.ipa Payload/AppName.app/AppName
size Payload/AppName.app/AppName
可執行文件大小是指其中的__TEXT部分
可以看到,命令會列出32位和64位的程序信息,其中__TEXT部分相加,才是我們所說的執行文件大小。
上圖,執行文件大小85MB,因為我們使用最低的iOS版本是6.0,因此在iOS 6下,就是超過限制了。
真相
蘋果的規定是怎樣的呢?
可執行文件限制
總結:
- 執行文件大小是指執行文件的__TEXT部分
- 當IOS最低版本小于7.0,32位+64位最多為80MB;
- 當IOS大于等于7.0,每個分區是60MB(并不是指32位+64位最多為120MB,當32位分區占用50MB,64位分區占用61MB,總111MB也不行,因為64位分區超出了);
- 當IOS大于等于9.0,總限制400MB;
起初,我把項目的最低iOS版本設置成7.0,就解決問題了;
但是,3個月后,經過各種版本更新后,我們再一次觸犯了大小超過限制的規定,這時候我們針對IL2CPP的機理進行C#代碼優化,減少了大量的IL2CPP代碼生成。 下回分解。