我遇到了什么問題县袱?
Unity要支持IOS 64位浑娜,就要用到IL2CPP。而IL2CPP會將IL代碼轉換成C++代碼式散。在我的項目中筋遭,這些C++代碼達到5000萬行。沒錯暴拄,5000萬行C++代碼漓滔!具體各個版本IL2CPP生成C++代碼對比可參考之前的文章《Unity:IOS可執(zhí)行程序超過80MB問題及各版本IL2CPP對比》。
我們的Xcode工程設置為最小iOS SDK版本為6.0乖篷。當向Xcode上傳IPA時响驴,就會提示執(zhí)行文件超過限制,無法上傳撕蔼。
可執(zhí)行文件(Executable)是什么豁鲤?
這里不是說IPA!不是說IPA鲸沮!不是說IPA琳骡!
可執(zhí)行文件大小,并不是指IPA安裝包的大小讼溺,這個在溝通時經常沒搞清楚的問題楣号。
眾所周知,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ī)定是怎樣的呢?
總結:
- 執(zhí)行文件大小是指執(zhí)行文件的__TEXT部分
- 當IOS最低版本小于7.0豺妓,32位+64位最多為80MB惜互;
- 當IOS大于等于7.0,每個分區(qū)是60MB(并不是指32位+64位最多為120MB琳拭,當32位分區(qū)占用50MB训堆,64位分區(qū)占用61MB,總111MB也不行白嘁,因為64位分區(qū)超出了)坑鱼;
- 當IOS大于等于9.0,總限制400MB絮缅;
起初姑躲,我把項目的最低iOS版本設置成7.0,就解決問題了盟蚣;
但是,3個月后卖怜,經過各種版本更新后屎开,我們再一次觸犯了大小超過限制的規(guī)定,這時候我們針對IL2CPP的機理進行C#代碼優(yōu)化马靠,減少了大量的IL2CPP代碼生成奄抽。 下回分解。