无效的可执行文件大小 – 来自iTunes Connect

我正在iTunes上上传我的iOS应用程序。 我正在使用MonoTouch来编译我的iOS LibGdx游戏。 在Android中它几乎不到7-8mb。 但是当我在iTunes AppStore上传时它会达到78 MB。 我不知道为什么? 请告诉我。

我也收到了Apple的这个错误。

亲爱的开发者,

我们发现您最近交付的“Run Panda Run:Racing”存在一个或多个问题。 要处理您的交付,必须纠正以下问题:

无效的可执行文件大小 – 72037504字节的可执行文件大小超过了允许的最大大小60 MB。

没有更多细节,很难给出明确的答案。 有很多事情会影响应用程序的大小。 让我们从基础开始吧。

你应该检查什么:

  • 首先,确保使用“不链接”构建应用程序。 这将创建非常大的应用程序,因为您将几乎完全支持Xamarin.iOS提供的完整.NET框架;

  • 其次,确保您构建单一架构(ARMv7)。 FAT二进制文件(例如ARMv7和ARMv7s)构建两次,需要两倍的空间;

  • 第三,确保你没有启用Debug构建(在Release版本中可以这样做,它是一个复选框)。 这将创建更大的二进制文件以支持调试;

  • 第四,确保您使用的是LLVM编译器。 编译需要更多时间,但它会产生更好(和更小)的代码;

这些初始检查非常容易,并且是获取非常大的二进制文件的最常见原因。

要了解大小的来源,您需要了解应用程序的构建方式。

  • Android和iOS版本之间的主要区别在于iOS上不允许使用JIT(即时编译)(Apple的规则)。

  • 这意味着代码必须是AOT(提前编译),并且该过程会创建更大的可执行文件(因为IL比本机代码更紧凑);

  • 如果您的代码是通用的,那么最终的二进制文件可能会变得非常大,因为它需要本地编译每个通用的可能性(许多情况可以共享,但值类型不能)。

你可以做些什么来减小尺寸:

  • 首先尝试减少托管代码大小。 执行此操作的简单方法是在每个程序集上启用链接器,即在项目选项中链接所有程序集

许多人认为不值得链接他们自己的代码 – 因为他们知道它将在运行时需要(因此链接器无法删除它),否则他们就不会编写该代码。

这是正确的一半。 链接器可能无法删除大多数应用程序代码, 如果您使用的是第三方程序集,则不太可能100%使用它们。 链接器可以删除那些额外的代码(并且还从SDK中删除所有保留以支持不需要的代码的代码)。 您拥有的共享代码越多,链接器就可以帮助您。

较少的IL代码意味着更快的AOT时间,这转化为更快的构建更小的最终binaires(包括可执行文件大小)。

注意:有很多文档和博客条目可以控制链接器如何跳过某些程序集,某些类型或方法被处理/删除。

  • 第二,尝试减少原生大小。 如果您正在构建本机库,那么请再次查看它们,因为它们将静态 (非动态)链接到您的最终二进制文件(iOS应用程序的另一个规则)。 其中一些可能不值得(特征明智)他们在你的最终二进制文件中的重量(并且可能有更轻的选择)。