【问题标题】:Enable AOT in Xamarin for Android (Visual Studio)在 Xamarin for Android (Visual Studio) 中启用 AOT
【发布时间】:2016-05-22 17:00:14
【问题描述】:

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

<AotAssemblies>True</AotAssemblies>

在确保我的项目路径不包含空格(中断进程)后,我运行了一个构建并获得了一个包含 托管 .NET DLL 的 APK本机编译的库。可悲的是,该应用程序似乎正在使用 .NET DLL 并完全忽略了本机库。有什么办法可以补救吗?

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

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

【问题讨论】:

  • 更新:Visual Studio 的社区版不支持 AOT;并且,在过去六个月的某个时候,Xamarin 的更新明确强制它关闭(如果您通过编辑 csproj 文件手动打开了 AOT)。现在必须有企业版才能使用 AOT 构建。

标签: c# xamarin compilation native aot


【解决方案1】:

对您的程序集/代码进行 AOT 不会改变应用程序初始化的启动(本机应用程序引导 + Xamarin/Mono 初始化,但不包括您的任何代码执行时间)。

现在,如果您在代码中执行 X 数量的 CPU 绑定工作,例如在 OnCreate 内(您真的应该这样做) ,您会(应该)看到总时间减少。我说 应该 因为 AOT'ing 不能保证您会看到代码的特定部分的执行时间更快,它确实消除了抖动,但还涉及许多其他因素.我多年来一直在使用 Mono(AOT w/ & w/o LLVM),您确实需要对您的代码进行检测和测试。

虽然 JIT 模式非常快,并且 Mono 中的默认优化已经过调整以提供优化和 JIT 速度之间的良好平衡,但 AOT 编译提供了一些额外的好处:

  • 缩短启动时间。

注意:这对于可能需要在运行之前执行大量代码...

的大型程序特别有用
  • 潜在的更好性能。

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

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


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

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


启用LLVM

一个布尔属性,用于确定在 Ahead-of-Time 将汇编编译为本机代码时是否使用 LLVM。 Xamarin.Android 5.1 中添加了对此属性的支持。

此属性默认为 False。

除非 $(AotAssemblies) MSBuild 属性为 True,否则将忽略此属性。


AotAssemblies

一个布尔属性,用于确定是否将程序集提前编译为本机代码并包含在 .apk 中。 Xamarin.Android 5.1 中添加了对此属性的支持。

此属性默认为 False。

【讨论】:

  • 感谢您的精彩解释!鉴于 Mono 无法进一步优化,我是否应该假设没有办法减少启动时间?一些大型应用程序需要大约 5 秒才能加载(如在 Google Play 上所见),这确实让我不再使用 Xamarin。我的 OnCreate 方法中几乎没有代码。
  • @DoDo AOT/LLVM 不会帮助更快地进入“HelloWorld”(无用户代码)应用程序中的第一个启动屏幕......生活的事实,因为使用有开销Xamarin/C# 生态系统,如果您的应用程序设计简洁,“本机”应用程序与基于 Xamarin 的应用程序之间的启动时间差异应该相当“小”......现在我已经看到了很多“本机” “在启动时间、视图/活动更改时间、刷新延迟等方面具有糟糕用户体验的应用程序......更糟;-)
  • 有趣...所以即使我扩展我的应用程序,开销也将保持不变?我将保留一个干净的 OnCreate 方法,在加载 UI 后一切都发生异步。但是如果我添加更多的代码和更多的活动,启动会保持当前的~2 秒,还是会增加到我在市场上看到的大约 5 秒?另外,您知道使用更多 C# 库是否会影响启动时间?我在某处读到,添加更多库会显着增加启动时间,我相信这就是 AOT 发挥重要作用的地方。
  • @DoDo 我在 Xamarin.iOS 和 Xamarin.Android 应用程序上工作过,它们推送 200MB 的用户代码和 2GB 的安装内容,它们的“启动时间”与模板化的 Xamarin“HelloWorld”没有什么不同“ 应用程序。现在,如果我们只在应用程序的启动中启动我们需要的一切(GPS 更新、物理引擎初始化、Play Game 排行榜拉动等......),是的,我们将死在水中......但在使用 Async 和我们的巧妙地拥有线程池并进行“懒惰”启动,应用程序会在几秒钟内出现在用户面前..
  • @DoDo 所以,最后,这与 Xamarin 几乎没有关系,而只是一般的应用程序开发,我将在 Java/C Droid 应用程序和/或 ObjC 中进行相同的代码设计/Swift iOS 应用程序..
【解决方案2】:

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

【讨论】:

  • 我做了一些测试,AotAssemblies 确实将我的应用启动时间从 5 秒缩短到 3 秒。
  • 我也可以确认。 AOT 将我的应用程序的启动时间至少缩短了 2 秒。页面导航、按钮操作、UI 反馈等其他一切都感觉更快。
  • 在我的情况下,应用程序加载速度很快,但加载第一个视图(在页面内)需要 6 秒
猜你喜欢
  • 1970-01-01
  • 2016-02-22
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多