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
相关产品推荐
相关产品推荐

