我有一个Xamarin.iOS项目(作为跨平台解决方案的一部分),随着时间的推移,它已经增长了很多。然而,只有iOS构建需要如此大量的时间(Windows桌面构建需要几秒钟,而Android很少需要超过30秒,其中24秒是安装过程)。经过大量的调整,我可以将iOS设备/模拟器的构建时间减少到大约02:21,这仍然远远超出了调试方便。
下面是这个时候实现的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-ios</TargetFramework>
<SingleProject>true</SingleProject>
<OutputType>Exe</OutputType>
<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
<IsUnoHead>true</IsUnoHead>
<SupportedOSPlatformVersion>14.2</SupportedOSPlatformVersion>
<Nullable>enable</Nullable>
<UseMauiEssentials>True</UseMauiEssentials>
<ProvisioningType>manual</ProvisioningType>
<MtouchInterpreter>-all</MtouchInterpreter>
</PropertyGroup>
<PropertyGroup>
<MtouchExtraArgs>$(MtouchExtraArgs) --setenv=MONO_GC_PARAMS=soft-heap-limit=512m,nursery-size=64m,evacuation-threshold=66,major=marksweep,concurrent-sweep</MtouchExtraArgs>
<MtouchExtraArgs>$(MtouchExtraArgs) --marshal-objectivec-exceptions:disable</MtouchExtraArgs>
<MtouchExtraArgs>$(MtouchExtraArgs) --marshal-managed-exceptions:default</MtouchExtraArgs>
<MtouchExtraArgs>$(MtouchExtraArgs) --registrar:static</MtouchExtraArgs>
<MtouchExtraArgs>$(MtouchExtraArgs) --time --time</MtouchExtraArgs>
<MtouchExtraArgs>$(MtouchExtraArgs) -v -v -v -v</MtouchExtraArgs>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<MtouchLink>Full</MtouchLink>
<Optimize>false</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' != 'Debug'">
<MtouchUseLlvm>true</MtouchUseLlvm>
<MtouchLink>SdkOnly</MtouchLink>
<BuildIpa>true</BuildIpa>
<Optimize>true</Optimize>
<CodesignKey>***</CodesignKey>
<CodesignProvision>***</CodesignProvision>
</PropertyGroup>
<ItemGroup>
<!--project references-->
</ItemGroup>
</Project>
环境:
- Windows 11计算机上的Visual Studio 22(17.4.3);
- 远程连接到运行Xcode 14.2的Mac Mini 2018;
- Xamarin.iOS 16.1.1.27
这个问题既没有变坏,也没有变好,对各自的旧版本的任何这些虽然。
与通过Visual Studio进行远程构建相比,直接从Mac进行构建没有显著的改进。
我尝试篡改一些项目属性,以尽可能缩短构建时间:
1.第一个月
- 设置'SdkOnly'或'Full'并没有预期的那么大的区别。前者在物理设备上运行时会将构建时间增加大约10秒。在模拟器上,总构建时间通常是不变的。考虑到ILLink所需的运行时间,这对我来说是令人惊讶的(见下文)。
- 设置"None"不起作用,因为它会导致
Failed to AOT compile Microsoft.iOS.dll, the AOT compiler exited with code 134
错误。
MtouchInterpreter
- 禁用时,类型泛型会在运行时导致错误,但启用它对生成时间没有任何影响。
MtouchUseLlvm
- 我只在发布构建时使用这个方法,因为它会将构建时间增加到超过10分钟(这对于偶尔的发布构建来说是可以忍受的)。
省略部分或全部MtouchExtraArgs
也没有帮助。
有一些任务需要更多的时间,占用了二进制日志的大部分时间:
- 目标_解包库资源(~3s);
- 目标_核心编译(~3s);
- 目标_FindAot编译器(约4秒);
- Target_RunILLink**(使用SdkOnly时约46秒,约53秒),几乎完全专用于Xamarin. iOS. Task. ILLink;
- 目标AOTCompile**(约52秒),编译本机代码耗时约38秒;
- 目标_编译本机可执行文件(~3秒);
- 目标_生成的DSym(约5秒);
- 目标_说再见(约7秒)
1条答案
按热度按时间z9smfwbn1#
Xamarin默认使用AOT。iOS:苹果公司对iOS系统设置了一个安全限制,禁止在设备上执行动态生成的代码。2为了确保我们遵守这些安全协议,Xamarin.iOS系统使用了一个AOT编译器来编译托管代码。
AOT编译是一种用于提高启动性能的优化技术,但它也会影响应用的构建时间。在Xamarin AOT文档中介绍:
生成时间- AOT编译比JIT慢得多,并且会减慢使用它进行的生成。这种减慢的范围从几秒钟到一分钟或更长,具体取决于编译的程序集的大小和数量。
Linking Xamarin.iOS Apps documentation描述了(这也是导致构建时间更长的原因):
链接器使用静态分析来确定应用程序可以遵循的不同代码路径。它有点繁重,因为它必须遍历每个程序集的每个细节,以确保没有删除任何可发现的内容。模拟器构建中默认不启用它,以加快调试时的构建时间。
您可以尝试关闭Visual Studio,然后从项目中删除bin和obj,这将缓解生成速度慢的问题。有关详细信息,请参阅:iOS Build Mechanics