MAUI 应用默认使用 JIT(即时编译),启动时需动态编译 IL 代码,影响冷启动速度。开启 AOT(Ahead-of-Time)编译可将 C# 代码提前编译为原生机器码,显著缩短启动时间,尤其在 iOS 和 Android 上效果明显。
启用 AOT 编译(针对 iOS 和 Android)
AOT 在 MAUI 中不是全局开关,需按目标平台显式配置:
iOS:默认已启用 AOT(通过 LLVM 编译器),无需额外操作;但需确保使用 Release 配置 + App Store 或 Ad-Hoc 签名模式构建,Debug 模式下会被禁用。 Android:需在.csproj文件中添加以下属性:
<PropertyGroup> <AndroidEnableAot>true</AndroidEnableAot> <AndroidUseLLVM>true</AndroidUseLLVM> </PropertyGroup>同时建议启用
<androidlinkmode>SdkOnly</androidlinkmode>或
Full链接,减小包体积并提升 AOT 效果。
配合启动性能优化的关键设置
AOT 单独启用还不够,需结合其他轻量化策略:
延迟初始化非首屏服务:避免在MauiProgram.CreateMauiApp()中注册大量单例或执行耗时逻辑,改用
Lazy<t></t>或按需构造。 精简启动页资源:SplashScreen 图片用最小尺寸、WebP 格式;移除启动页中不必要的动画或绑定。 关闭调试代理与热重载:发布包务必使用
--configuration Release构建,并确认
<embeduntrackedsources>false</embeduntrackedsources>和
<debugtype>none</debugtype>已设置。
验证 AOT 是否生效
构建后检查输出目录和日志:
Android:查看bin/Release/net8.0-android/android-arm64/publish/下是否存在
*.so文件(如
libaot-Mono.Android.dll.so),存在即表示 AOT 成功。 iOS:Xcode 归档日志中搜索
Running AOT compiler或
llvm关键词;同时观察 IPA 包体积是否明显大于未启用 AOT 的版本(AOT 会增大体积,但换得更快启动)。 运行时检测:在 App 启动时加日志
Console.WriteLine($"IsJitCompiled: {typeof(App).Assembly.IsDynamic}"); —— AOT 下通常为 false(非动态程序集)。
基本上就这些。AOT 不是银弹,但它和启动路径瘦身配合起来,能让 MAUI 应用从“能用”走向“顺滑”。注意权衡包体积增长,尤其对网络分发敏感的场景。
