xamarin iOS版本,最显著的是链接和AOT编译,调试配置需要2分钟以上

jhdbpxl9  于 2023-01-06  发布在  iOS
关注(0)|答案(1)|浏览(166)

我有一个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错误。
  1. MtouchInterpreter
  • 禁用时,类型泛型会在运行时导致错误,但启用它对生成时间没有任何影响。
  1. MtouchUseLlvm
  • 我只在发布构建时使用这个方法,因为它会将构建时间增加到超过10分钟(这对于偶尔的发布构建来说是可以忍受的)。

省略部分或全部MtouchExtraArgs也没有帮助。
有一些任务需要更多的时间,占用了二进制日志的大部分时间:

  • 目标_解包库资源(~3s);
  • 目标_核心编译(~3s);
  • 目标_FindAot编译器(约4秒);
      • Target_RunILLink**(使用SdkOnly时约46秒,约53秒),几乎完全专用于Xamarin. iOS. Task. ILLink;
      • 目标AOTCompile**(约52秒),编译本机代码耗时约38秒;
  • 目标_编译本机可执行文件(~3秒);
  • 目标_生成的DSym(约5秒);
  • 目标_说再见(约7秒)
z9smfwbn

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

相关问题