Xamarin Linker非Don't Link时应用崩溃且IPA体积超限问题求解
Xamarin链接器保留第三方NuGet包代码的解决方案
- 方案1:使用自定义链接器配置文件
在iOS项目根目录下新增Linker.xml文件,右键选中文件打开属性面板,将「生成操作」设置为LinkDescription。文件内容示例如下:
若不确定程序集的准确全名,可查看项目引用列表中对应dll的文件名,与fullname参数值一致。<?xml version="1.0" encoding="UTF-8" ?> <linker> <!-- 完整保留指定程序集的所有代码不被裁剪 --> <assembly fullname="Microsoft.Azure.Cosmos" preserve="all" /> <!-- 若该NuGet依赖的其他附属程序集也被误裁剪,按相同格式补充即可 --> <assembly fullname="Microsoft.Azure.Cosmos.Core" preserve="all" /> </linker> - 方案2:添加mtouch编译参数
打开iOS项目的属性面板,找到「iOS生成」选项页,选择你用于发布的Release|iPhone配置,在「额外的mtouch参数」输入框中添加如下内容:
每添加一个--linkskip=Microsoft.Azure.Cosmos --linkskip=Microsoft.Azure.Cosmos.Core--linkskip参数,就会让链接器跳过对应程序集的裁剪流程,效果和自定义链接器配置一致。 - 方案3:添加伪造的代码引用(轻量方案)
如果你不想完整保留整个第三方程序集来控制包体积,可以在自己的项目代码中新增一个无需手动调用的保留类,强制链接器识别到相关代码被使用:internal static class CosmosLinkerPreserver { // 静态构造函数会在程序集加载时被触发,无需手动调用 static CosmosLinkerPreserver() { // 只需列举你实际用到的Cosmos相关类型即可 _ = typeof(Microsoft.Azure.Cosmos.CosmosClient); _ = typeof(Microsoft.Azure.Cosmos.Container); _ = typeof(Microsoft.Azure.Cosmos.Database); } }
上述所有方案都不需要修改第三方NuGet包的内部代码,配置完成后切换为「仅链接SDK」模式重新构建即可,既可以避免应用崩溃问题,又能大幅缩减最终生成的IPA包体积。
内容的提问来源于stack exchange,提问作者Mmendelow
相关产品推荐
相关产品推荐

