iOS坑:IPA可執(zhí)行文件大小限制

我遇到了什么問題?

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,Payload/MicroMessenger.app/MicroMessenger就是微信的可執(zhí)行文件了

如何查看我的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
可執(zhí)行文件大小是指其中的__TEXT部分

可以看到,命令會列出32位和64位的程序信息,其中__TEXT部分相加,才是我們所說的執(zhí)行文件大小。

上圖,執(zhí)行文件大小85MB,因為我們使用最低的iOS版本是6.0,因此在iOS 6下,就是超過限制了。

真相

蘋果的規(guī)定是怎樣的呢?

可執(zhí)行文件限制

總結(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代碼生成。 下回分解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容