【问题标题】:How to reduce ipa size Xamarin.ios如何减小 ipa 大小 Xamarin.ios
【发布时间】:2018-07-25 17:21:07
【问题描述】:

我正在尝试减小 ipa 大小,但无法成功。我尝试仅链接 SDK 程序集,但是当应用程序存档时,它显示 189 MB 的应用程序商店和 75 MB 的 ipa。我尝试了不同的选择,但从未奏效。

然后我查看了我的 bin 文件夹,发现 Xamarin.swift4 占用了大约 80 MB 的大小,当我删除该包时,我的 ipda 减小到 34mb,playstore 大小减小到 89 MB,但是由于我的应用程序在打开后立即崩溃。所以这意味着我不能删除 Xamarin.swift 4 库。

我已经附上了我的bin文件夹图片和packages.congifg文件,如果有任何解决方案请告诉我

    <?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Answers" version="1.4" targetFramework="xamarinios10" />
  <package id="Crashlytics" version="1.4" targetFramework="xamarinios10" />
  <package id="dannycabrera.GetiOSModel" version="1.4.0" targetFramework="xamarinios10" />
  <package id="Fabric" version="1.4" targetFramework="xamarinios10" />
  <package id="iOSCharts" version="3.1.1.2" targetFramework="xamarinios10" />
  <package id="Microsoft.CSharp" version="4.4.1" targetFramework="xamarinios10" />
  <package id="Microsoft.NETCore.Platforms" version="2.0.2" targetFramework="xamarinios10" />
  <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="NETStandard.Library" version="2.0.3" targetFramework="xamarinios10" />
  <package id="Newtonsoft.Json" version="11.0.2" targetFramework="xamarinios10" />
  <package id="System.AppContext" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Collections" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.ComponentModel.TypeConverter" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Console" version="4.3.1" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Globalization" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Globalization.Calendars" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.Compression" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.FileSystem" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Linq" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Linq.Expressions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Net.Http" version="4.3.3" targetFramework="xamarinios10" />
  <package id="System.Net.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Net.Sockets" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.ObjectModel" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Handles" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Serialization.Formatters" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Serialization.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="xamarinios10" />
  <package id="System.Text.Encoding" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading.Tasks" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading.Timer" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="xamarinios10" />
  <package id="System.Xml.XDocument" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="xamarinios10" />
  <package id="UITextFieldShaker" version="2017.10.19" targetFramework="xamarinios10" />
  <package id="Xam.Plugin.Connectivity" version="3.1.1" targetFramework="xamarinios10" />
  <package id="Xamarin.Forms" version="3.0.0.446417" targetFramework="xamarinios10" />
  <package id="ZXing.Net.Mobile" version="2.3.2" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4" version="4.0.0.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.Core" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.CoreAudio" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.CoreData" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.CoreFoundation" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.CoreGraphics" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.CoreImage" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.CoreMedia" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.Darwin" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.Dispatch" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.Foundation" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.Metal" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.ObjectiveC" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.OS" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.QuartzCore" version="4.1.0" targetFramework="xamarinios10" />
  <package id="Xamarin.Swift4.UIKit" version="4.1.0" targetFramework="xamarinios10" />
</packages>

【问题讨论】:

  • 您正在使用Charts 3.0+ 并且第 3 方 iOS 框架需要 Swift 库。为什么在最终的 iPA 中需要一个 .Net 程序集很奇怪,因为我也使用 Charts 3 但有我自己的绑定,需要捆绑 swift 框架 (libswiftXXXX) 但不需要额外的程序集。您确定这些用于最终的 iPA 包装吗?如果是这样,我会在 Flash3001 的 repo 上发布一个问题并询问...
  • @SushiHangover 我尝试删除 ioshcarts 和 xamarin.swift 库,但 ipa 大小仍然从 76mb 减少到 71mb,playstore 大小从 189mb 减少到 172.89mb

标签: c# ios xamarin xamarin.ios ipa


【解决方案1】:

您应该只删除您在项目中不使用的库。 两周前,我的 ipa 文件几乎为 200 MB,然后我删除了项目不需要的所有 Swift 库,现在我创建的 ipa 文件比之前的文件 (80 MB) 更小。 所以你需要检查你的应用程序,看看你是否有不必要的库并删除它,这样你会减少 ipa 大小。

【讨论】:

  • 你会建议删除哪些库,sinze 我已经删除了 swift4 库,它只从 76 mb 减少到 71 mb。
  • 正如我所说,您在项目中不使用的库,您需要分析您的应用程序并决定可以删除哪些库。如果您的项目拥有的所有库都很重要并且正在使用,那么您的 ipa 文件将具有此大小,并且您无法删除任何库。
【解决方案2】:

我建议查看“链接器”,您可以在 Visual Studio 的 iOS 构建选项中找到它

简要概述:

  1. 不要链接 - 所有程序集都保持不变(最大 ipa 大小)
  2. 仅链接 SDK 程序集 - 通过删除应用程序不使用的所有内容来减小 SDK (Xamarin.iOS) 程序集的大小
  3. 链接所有程序集 - 通过删除应用程序不使用的所有内容(最小 ipasize)来减小所有程序集的大小

请注意,“链接所有程序集”可能会导致问题,因为链接器无法始终确定所使用的内容,因此可以从程序集中删除实际需要的代码(想想 Web 服务、反射、序列化)。在这种情况下,您可以设置手动 mtouch 参数以防止链接器触及特定程序集(或程序集),如下所示:

--linkskip=NameOfAssemblyToSkipWithoutFileExtension

--linkskip=NameOfFirstAssembly --linkskip=NameOfSecondAssembly

我遇到的一个真正的用例是在将实体框架与 Xamarin.iOS 结合使用时,因为链接器会删除代码,然后使用反射调用该代码,这会导致应用程序崩溃。

链接器的完整文档可在此处获得:https://docs.microsoft.com/en-us/xamarin/ios/deploy-test/linker?tabs=vsmac

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多