.NET 9 MAUI安卓启动页NullReferenceException崩溃如何捕获启动日志
.NET MAUI Android 启动屏阶段崩溃日志捕获方案
不要依赖Visual Studio内置的Device Log工具排查该类启动早期崩溃,它的会话自动销毁、日志刷屏问题属于已知缺陷,直接用以下方案可完整捕获到异常信息:
方案1:通过adb命令持久化抓取全量系统日志
- 先关闭Visual Studio中所有已打开的Device Log窗口,避免其抢占adb日志流导致输出中断
- 打开终端,若未将adb加入系统环境变量,直接进入Android SDK路径下的
platform-tools目录打开终端即可,默认路径为C:\Program Files (x86)\Android\android-sdk\platform-tools - 执行
adb logcat -c清空设备端所有存量历史日志,排除旧消息干扰 - 执行日志持久化写入命令:
adb logcat -v time > D:\maui_crash_log.txt,该命令会持续将设备上所有带时间戳的系统日志写入本地D盘的日志文件,不受Visual Studio操作影响,不会丢失任何日志 - 保持终端窗口运行状态,正常从Visual Studio启动应用,待应用崩溃退出后,回到终端按
Ctrl+C终止日志抓取,打开生成的maui_crash_log.txt文件,搜索NullReferenceException、应用包名、mono、crash关键词即可定位到完整异常堆栈
方案2:添加启动阶段全局异常捕获,直接写入本地文件
针对.NET 9调整启动时序后,部分早期异常可能不会完整输出到系统日志的问题,可在Android项目入口处提前加全局异常捕获,将异常直接写入设备存储:
- 打开Android平台目录下的
MainActivity.cs文件,在OnCreate方法最开头(早于base.OnCreate和MAUI初始化代码)添加以下捕获逻辑:
protected override void OnCreate(Bundle? savedInstanceState) { // 启动阶段全局异常捕获 AndroidEnvironment.UnhandledExceptionRaiser += (_, args) => { var logPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory!.AbsolutePath, "maui_startup_error.log"); File.WriteAllText(logPath, $"启动异常:{args.Exception}"); }; AppDomain.CurrentDomain.UnhandledException += (_, args) => { var logPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory!.AbsolutePath, "maui_startup_error.log"); File.AppendAllText(logPath, $"\nAppDomain异常:{args.ExceptionObject}"); }; // 原有初始化代码保留 base.OnCreate(savedInstanceState); }
- 重新编译部署应用,待崩溃发生后,执行
adb pull /sdcard/maui_startup_error.log D:\即可将完整异常信息拉取到本地电脑,无任何丢失
.NET 8升级到.NET 9后的常见启动崩溃排查点
捕获到异常前可优先排查以下高频触发点,减少排查成本:
- 检查
MauiProgram.cs中的服务注册逻辑:.NET 9下Android启动阶段的服务初始化时序早于.NET 8,若注入的服务依赖未完成初始化的Android上下文,会直接触发空引用 - 检查启动屏资源配置:.NET 9调整了SplashScreen的资源ID校验逻辑,若启动屏资源未正确放置在
Resources\Splash目录,或csproj中的SplashScreen配置项不符合.NET 9规范,会在启动屏加载阶段抛出空引用 - 清理bin、obj文件夹后,执行
dotnet workload repair修复.NET MAUI工作负载,部分升级场景下的组件缺失也会导致启动早期空引用,单纯清理项目生成文件无法解决该类问题
内容的提问来源于stack exchange,提问作者Vishva Vijay
相关产品推荐
相关产品推荐

