我遇到了什么问题?
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的执行文件大小?
千万别以为执行文件大小=可执行文件的解压后大小
可执行文件大小 ≠ 可执行文件的解压后大小
可执行文件大小 ≠ 可执行文件的解压后大小
可执行文件大小 ≠ 可执行文件的解压后大小
这是一个超级重点。要查看苹果所说的可执行文件大小,需要在Mac下使用size命令:
unzip /XXX/AppName.ipa Payload/AppName.app/AppName
size Payload/AppName.app/AppName
可以看到,命令会列出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代码生成。 下回分解。