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

use*_*413 2 itunesconnect xamarin.ios ios

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

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

亲爱的开发者,

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

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

pou*_*pou 12

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

你应该检查什么:

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

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

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

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

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

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

  • 主要的Android和iOS版本之间的区别就是JIT'ing(即时编译)不允许在iOS(苹果的规则).

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

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

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

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

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

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

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

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

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