在 Xamarin 中为 Android (Visual Studio) 启用 AOT

Enable AOT in Xamarin for Android (Visual Studio)

我知道 Android 的 Xamarin 支持 AOT。在软件免费之后,它的所有功能也都免费了。我阅读了文档并通过修改 project.csproj 文件启用了 AOT,如下所示:

<AotAssemblies>True</AotAssemblies>

在确保我的项目路径不包含空格(中断过程)后,我 运行 构建了一个 APK both managed .NET DLL 本机编译库。遗憾的是,该应用程序似乎正在使用 .NET DLL 并完全忽略了本机库。有什么办法可以解决这个问题吗?

编辑:阅读其他一些与 Mono AOT 相关的问题,看来这可能是它应该如何工作的。我想 AOT 编译我的应用程序,希望减少大约 2 秒的启动时间,在我从 JIT 切换到 AOT 后,这根本没有改变。有人可以给我解释一下吗?

奖励:有什么方法可以启用高级优化标志吗? (例如 -o)

AOT'ing 你的 assemblies/code 不会改变应用程序初始化的启动(本机应用程序 bootstrap + Xamarin/Mono 初始化但不包括你的任何代码执行时间) .

现在,如果您在代码中执行 X 的工作量 CPU,请在 OnCreate(您确实应该not be doing),您会(应该)看到总时间减少。我说 应该 是因为 AOT 并不能保证您会看到特定代码部分的执行时间更快,它确实消除了抖动,但是有很多涉及的其他因素。我多年来一直在使用 Mono(AOT w/ & w/o LLVM),你真的需要检测和测试你的你的代码。

Although the JIT mode is very fast, and the default optimizations in Mono have been tuned to provide a good balance between optimizations and JIT speed, AOT compilation provides a few extra benefits:

  • Reduced startup time.

注意:这对于可能需要在运行之前执行大量代码的大型程序特别有用...

  • Potential better performance.

注意:....这意味着某些程序 可能 运行 更慢 因为生成的代码比 JIT 可以生成的特定代码更通用。

参考:http://www.mono-project.com/docs/advanced/aot/


启用 LLVM 和 AOT 以测试您的发布版本:

在优化 AOT 代码方面,在您的发布版本中启用 LLVM 和 AOT 以进行 performance/instrumentation 测试。注意:测试是关键,拥有完整的应用测试套件和用于收集 运行时间性能的内部工具是在应用商店获得 5 星评价的关键 ;-)


EnableLLVM

A boolean property that determines whether or not LLVM will be used when Ahead-of-Time compiling assemblines into native code. Support for this property was added in Xamarin.Android 5.1.

This property is False by default.

This property is ignored unless the $(AotAssemblies) MSBuild property is True.


AotAssemblies

A boolean property that determines whether or not assemblies will be Ahead-of-Time compiled into native code and included in the .apk. Support for this property was added in Xamarin.Android 5.1.

This property is False by default.

无论是否巧合,当我将 <AotAssemblies>True</AotAssemblies> 添加到 android .csproj 的 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 部分时,我的启动时间从 10 秒减少到 4 秒!然后我删除了 AotAssemblies 并再次尝试,我又有 10 秒的时间,所以 AotAssemblies 做了一些事情:)