5

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

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

亲爱的开发者,

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

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

4

3 回答 3

16

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

您应该检查的内容:

  • 首先,确保您的应用程序没有使用Don't link构建。这将创建非常大的应用程序,因为您将使用 Xamarin.iOS 提供的几乎完整的 .NET 框架进行 AOT;

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

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

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

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

要了解大小来自哪里,您需要知道应用程序是如何构建的。

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

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

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

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

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

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

这是对的一半。链接器可能无法删除您的大部分应用程序代码,但如果您使用的是第 3 方程序集,则它们不太可能 100% 被使用。链接器可以删除该额外代码(也可以从 SDK 中删除为支持该不需要的代码而保留的所有代码)。您拥有的共享代码越多,链接器可以为您提供的帮助就越多。

更少的 IL 代码意味着更快的 AOT 时间,这意味着更快的构建更小的最终二进制文件(包括可执行文件大小)。

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

  • 第二次尝试减少你的原生大小。如果您正在构建本机库,请再次查看它们,因为它们将静态(非动态)链接到您的最终二进制文件(iOS 应用程序的另一个规则)。其中一些可能不值得(在功能方面)在您的最终二进制文件中占据重要地位(并且可能有更轻的替代品)。
于 2013-03-09T16:06:31.833 回答
2

我遇到了同样的问题,但在我的情况下,我在 info.plist 中将最低操作系统版本设置为 8,从而导致更大的 .ipa 文件。我将其更改为版本 10,并且能够通过尺寸要求。即使是10也有点慷慨

于 2020-09-28T21:28:17.840 回答
1

不应启用调试,因为它会使构建变得不必要地大。

在此处输入图像描述

有关更多信息,请参阅:https ://docs.microsoft.com/en-us/xamarin/ios/deploy-test/app-distribution/app-store-distribution/publishing-to-the-app-store?tabs=windows

于 2019-05-07T16:01:20.303 回答