【问题标题】:Are Xamarin iOS apps bloated unreasonably?Xamarin iOS 应用程序是否不合理地臃肿?
【发布时间】:2013-09-25 16:43:50
【问题描述】:

我正在使用 Xamarin iOS 开发一个相当简单的应用程序,我为 .app 文件获得的最小大小是 13.5 MB。

我已经执行了所有推荐的优化 - 无调试符号、LVVM 代码生成、thumb-2、链接所有程序集、仅单一架构 (ARMV7)。

第一个问题是,我的 13.5 MB 听起来像是 Xamarin iOS 所期望的,还是我可能做错了什么?

第二个问题是,Xamarin iOS 为等效的本机实现增加了多少额外的大小开销(大致)?

第三个问题是,使用 Xamarin iOS 可以将 Hello World 应用程序编译到多大程度?

第四个问题是,一个原生的 Hello World 应用大概能编译到多小?

【问题讨论】:

  • 仅使用“SDK 程序集”
  • @eMi:尽管文档中声称,链接 SDK 程序集实际上只会使应用程序变大 - 14.3 mb。
  • 嗯,好吧,我不知道你到底是怎么设置的。. 做了 4 个应用程序,还有一个相当“大”的应用程序,它的大小是 6.8 Mb.. 你肯定做错了什么嗯......也许我明天会提供一个答案,因为我现在无法访问任何源代码
  • @eMi:很高兴知道......这种尺寸非常合理,不会让我的客户感到不安。我从其他未使用的项目中导入了许多可重用的通用代码。文档似乎暗示链接器会忽略这一点,但您认为它会影响它吗?
  • @poupou: 链接位于docs.xamarin.com/guides/cross-platform/application_fundamentals/…,上面写着——以下步骤将有助于减小此大小:将链接器选项设置为链接 SDK 程序集。

标签: ios xamarin.ios xamarin


【解决方案1】:

.dSYM 是一个包含调试符号的目录。这不是作为应用程序的一部分(发给最终用户)提供的东西。请注意,即使在非调试版本中也会产生这种情况,因为它允许您符号化崩溃报告(来自运行 release 二进制文件的最终用户)。

对于真正的应用程序大小,您需要查看.app 目录。

观看今年的Evolve 视频Advanced iOS Build mechanics,您可以学到很多减少应用程序大小(和构建时间)的技巧。这也将回答您的其他问题。

【讨论】:

  • 感谢您的澄清。实际上更糟 - 16.7 MB。
  • 我使用 link-all 将其减小到 13.5 MB。这是您对 Xamarin iOS 的期望吗?
  • 幻灯片 21 暗示 10.9MB 是“现场服务示例”应用程序的“最佳大小”。所以我认为缺乏响应意味着 10 - 15 MB 的大小是发布版本的预期最小值?
  • 没有。 HelloWorld 应用程序小于 3MB。应用程序的大小因您的代码和您包含在其中的非代码资产(例如图像、视频、声音、数据库...)而异。在某些应用程序中,assets 可能非常大。例如。所有设备/方向的所有启动图像(尤其是包含 iPad Retina 版本时)都可能比应用程序可执行文件本身大得多。无论您使用什么工具构建 iOS 应用程序,OTOH 资产大小都是相同的。
  • 我的应用程序中没有资产,它是 12MB。似乎一旦代码开始使用库,由于 AOT 处理所有可能的泛型和代码依赖树,大小可能会几何增长。我错了吗?是否有 3mb 范围内的 twitter 应用程序复杂性的应用程序示例? (不需要资产)
【解决方案2】:

正如人们所料,Xamarin 应用程序在发布模式下要大一些。例如,查看我的两个发布应用程序的二进制文件,二进制 + dll 大约为 12m 和 18m(我想我需要研究为什么 18m 的文件要大得多......)。根据过去构建原生应用程序的经验,我猜如果我在 Objective-c 中完成这些,它们的大小应该是原来的一半左右。

如果您正在运行调试硬件构建,它们巨大。上面的 12m 示例对于二进制 + dll 跳转到 96M(?!)。在我检查这个之前,我认为它们的大小翻了一番来处理软件调试器,但我想还有很多我不知道的其他废话。

【讨论】:

  • 除了最初的hit(包括运行时库),大小增长应该是线性的并且类似于ObjC。您可能需要查看托管链接器设置(例如,默认 Link SDK 与更优化的 Link All)以及本地链接方式(如果您绑定到本地库) )。这两个主题都是上述视频的一部分。
  • 假设链接工作正常,随着您在越来越多的单声道框架中链接,它会比 Objective-c 增长得更快(超过最初的命中)。 Objective-c 正在链接到未包含在二进制文件中的系统框架。
  • 如果代码是完全本地链接的,为什么它包含 DLL?它们仍然以某种方式使用吗?顺便说一句,感谢您的帮助。
  • @poupou:为什么它应该线性增长,因为随着应用程序增加对 API 的使用,由于依赖图和潜在的泛型,更多的代码是 AOT 的。例如在 List 上调用 Sum() 将导致 AOT 执行 IEnumerable、ICollection、List 和其他仅针对 int 的内部依赖项。这是错的吗?
  • 程序集(.dll.exe)是必需的,因为它们包含 .NET 元数据。默认情况下,在 release 配置中它们内部没有 no IL(它已被剥离)。那一点信息也是我视频的一部分;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2011-03-18
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多