You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Android崩溃日志保存:如何捕获并存储StackTrace?

在Xamarin.Android中捕获并保存崩溃日志的简单方案

嘿,这个场景我太熟悉了——Xamarin.iOS的Main方法包个try-catch确实省心,但Xamarin.Android因为入口是MainLauncher Activity,得换个思路。其实有几个全局捕获的方案,简单又靠谱,能把错误信息和StackTrace稳稳存下来:

1. 利用AppDomain捕获托管代码异常

Xamarin.Android的托管代码异常可以通过AppDomain的全局事件捕获,最适合的地方是自定义的Application类(这是Android全局生命周期的入口,比单个Activity范围更广)。

首先创建自定义Application类:

[Application]
public class MyGlobalApp : Application
{
    public MyGlobalApp(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
    {
    }

    public override void OnCreate()
    {
        base.OnCreate();
        // 注册托管代码未处理异常事件
        AppDomain.CurrentDomain.UnhandledException += OnUnhandledManagedException;
    }

    private void OnUnhandledManagedException(object sender, UnhandledExceptionEventArgs e)
    {
        if (e.ExceptionObject is Exception ex)
        {
            // 拼接崩溃日志
            string crashDetails = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 托管代码崩溃\n错误信息:{ex.Message}\n堆栈跟踪:\n{ex.StackTrace}";
            // 保存到本地(比如应用私有目录)
            SaveCrashLog(crashDetails);
        }
    }

    private void SaveCrashLog(string logContent)
    {
        // 应用私有目录无需额外权限,安全可靠
        string logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "crash_records.txt");
        File.AppendAllText(logPath, logContent + "\n\n");
    }
}

2. 捕获Android原生层异常

上面的方法只能处理托管代码的异常,对于Android原生(比如JNI调用、系统组件)的崩溃,需要用AndroidEnvironment的事件来捕获,同样在自定义Application的OnCreate里注册:

// 注册原生未处理异常事件
Android.Runtime.AndroidEnvironment.UnhandledExceptionRaiser += OnUnhandledNativeException;

对应的处理方法:

private void OnUnhandledNativeException(object sender, RaiseThrowableEventArgs e)
{
    var nativeEx = e.Exception;
    string crashDetails = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 原生代码崩溃\n错误信息:{nativeEx.Message}\n堆栈跟踪:\n{nativeEx.StackTrace}";
    SaveCrashLog(crashDetails);

    // 如果你想阻止系统弹出默认崩溃提示,就设置为true;反之留false让系统处理
    e.Handled = false;
}

额外提示

  • 不想自定义Application?也可以在MainLauncher Activity的OnCreate方法里注册这些事件,但不如Application全局生效,毕竟Application是第一个启动的全局组件,能覆盖所有页面的异常。
  • 日志存储建议用应用私有目录,不需要申请外部存储权限,避免权限问题;如果要存到外部,记得动态申请WRITE_EXTERNAL_STORAGE权限(Android 6.0+)。

把这两个方案结合起来,基本能覆盖Xamarin.Android中绝大多数崩溃场景,轻松把错误信息和StackTrace保存下来,方便后续排查问题~

内容的提问来源于stack exchange,提问作者Aiko West

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:24:27