iOS坑:IPA可执行文件大小限制

我遇到了什么问题?

Unity要支持IOS 64位,就要用到IL2CPP。而IL2CPP会将IL代码转换成C++代码。在我的项目中,这些C++代码达到5000万行。没错,5000万行C++代码!具体各个版本IL2CPP生成C++代码对比可参考之前的文章《Unity:IOS可执行程序超过80MB问题及各版本IL2CPP对比》。

iOS坑:IPA可执行文件大小限制_第1张图片

我们的Xcode工程设置为最小iOS SDK版本为6.0。当向Xcode上传IPA时,就会提示执行文件超过限制,无法上传。

可执行文件(Executable)是什么?

这里不是说IPA!不是说IPA!不是说IPA!
可执行文件大小,并不是指IPA安装包的大小,这个在沟通时经常没搞清楚的问题。

众所周知,iOS开发中,是采用静态库的方式,所以第三方库,都会编译进一个执行文件。所谓可执行文件,是指ipa里的,通过Xcode静态编译Objective-C出来的一个文件。

拿微信的ipa来举例:

iOS坑:IPA可执行文件大小限制_第2张图片
用压缩软件打开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下,就是超过限制了。

真相

苹果的规定是怎样的呢?

iOS坑:IPA可执行文件大小限制_第3张图片
可执行文件限制

总结:

  • 执行文件大小是指执行文件的__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代码生成。 下回分解。

你可能感兴趣的:(iOS坑:IPA可执行文件大小限制)