我知道Xamarin for Android支持AOT。软件免费后,它的所有功能也都免费。我阅读了文档并通过修改 project.csproj 文件启用了AOT,如下所示:
<AotAssemblies>True</AotAssemblies>
确保我的项目路径不包含空格(中断过程)后,我运行了一个构建版本,我得到了一个带有两个托管.NET DLL 和的APK本机编译的库。可悲的是,该应用程序似乎使用.NET DLL并完全忽略本机库。有什么办法可以解决这个问题吗?
编辑:阅读其他一些与Mono AOT相关的问题,似乎这可能是它应该如何工作的。我想AOT编译我的应用程序,希望减少~2秒的启动时间,这在我从JIT切换到AOT之后根本没有改变。有人可以向我解释这个吗?
BONUS:有什么办法可以启用高级优化标志吗? (例如-o)
答案 0 :(得分:9)
AOT'你的程序集/代码不会改变应用程序初始化的启动(本机app bootstrap + Xamarin / Mono初始化但不包括你的任何代码执行时间)。
现在,如果您在代码中进行了 X 工作量的限制,请说明OnCreate
(你真的应该 )在做),你会(应该)看到总时间的减少。我说应该,因为AOT'不能保证你会看到特定部分代码的执行时间更快,它确实消除了抖动,但还有很多其他因素。我已经使用Mono(AOT w /&amp; w / o LLVM)多年了,你真的需要对你的代码进行测试和测试。
虽然JIT模式非常快,并且Mono中的默认优化已经过调整,以便在优化和JIT速度之间提供良好的平衡,但AOT编译提供了一些额外的好处:
- 缩短启动时间。
注意:这对于可能需要在运行之前执行大量代码的大型程序特别有用...
- 潜在的更好表现。
注意:......这意味着某些程序可能会运行得更慢,因为生成的代码比JIT可以生成的特定代码更通用。
参考:http://www.mono-project.com/docs/advanced/aot/
在优化AOT代码方面,在发布版本中启用LLVM和AOT以进行性能/仪器测试。注意:测试是关键,拥有一个完整的应用程序测试套件和用于收集运行时性能的内部工具是在应用程序商店获得这些5星评价的关键; - )
EnableLLVM
一个布尔属性,用于确定在Ahead-of-Time将汇编编译为本机代码时是否使用LLVM。 Xamarin.Android 5.1中添加了对此属性的支持。
默认情况下,此属性为False。
除非$(AotAssemblies)MSBuild属性为True,否则将忽略此属性。
AotAssemblies
一个布尔属性,用于确定程序集是否为Ahead-of-Time编译为本机代码并包含在.apk中。 Xamarin.Android 5.1中添加了对此属性的支持。
默认情况下,此属性为False。
答案 1 :(得分:6)
巧合与否,当我将<AotAssemblies>True</AotAssemblies>
添加到android .csproj的<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
部分时,我的启动时间从10秒减少到4秒!然后我删除了AotAssemblies并再次尝试,我又有10秒,所以AotAssemblies做了一些事情:)