无法使用的组件HockeyApp for Android (Xamarin组件商店)

本文关键字:组件 Xamarin Android HockeyApp for | 更新日期: 2023-09-27 18:08:53

我试图把上面提到的组件投入操作。

http://components.xamarin.com/view/hockeyappios

我基于Xamarin Studio模板创建了一个非常简单的项目(Android Ice Cream Sandwich Application)然后我添加了必要的代码发送异常到HockeyApp。下面的页面 描述了这段代码http://components.xamarin.com/gettingstarted/hockeyappandroid

不幸的是,我发现了存储异常信息文件

的一个主要问题
HockeyApp.ManagedExceptionHandler.SaveException (e.ExceptionObject)

这个调用导致以下错误

[mono-rt] Stacktrace:
[mono-rt] 
[mono-rt]   at <unknown> <0xffffffff>
[mono-rt]   at (wrapper managed-to-native) object.wrapper_native_0x407339b5 (intptr,string) <IL 0x00038, 0xffffffff>
[mono-rt]   at Android.Runtime.JNIEnv.FindClass (string) [0x00000] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:377
[mono-rt]   at Android.Runtime.JNIEnv.FindClass (string,intptr&) [0x00014] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:409
[mono-rt]   at Android.OS.Looper.get_class_ref () [0x00000] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.OS.Looper.cs:14
[mono-rt]   at Android.OS.Looper.get_MainLooper () [0x00014] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.OS.Looper.cs:34
[mono-rt]   at Android.App.SyncContext.Send (System.Threading.SendOrPostCallback,object) [0x00014] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Android.App/SyncContext.cs:24
[mono-rt]   at HockeyApp.ManagedExceptionHandler.Save (string) <IL 0x0001f, 0x00157>
[mono-rt]   at HockeyApp.ManagedExceptionHandler.SaveException (object) <IL 0x00006, 0x0006b>
[mono-rt]   at HockeyAppTest.App.<OnCreate>b__0 (object,System.UnhandledExceptionEventArgs) [0x00002] in c:'Snapshot'HockeyAppTest'Application.cs:33
[mono-rt]   at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___object_object (object,intptr,intptr,intptr) <IL 0x0005a, 0xffffffff>
[mono-rt] 
[mono-rt] =================================================================
[mono-rt] Got a SIGSEGV while executing native code. This usually indicates
[mono-rt] a fatal error in the mono runtime or one of the native libraries 
[mono-rt] used by your application.
[mono-rt] =================================================================

在检查问题的过程中,我遇到了以下信息

  • 处理过的异常可以存储,没有问题
  • 问题只发生在AppDomain.CurrentDomain.UnhandledException处理程序

然后我尝试在AppDomain.CurrentDomain.UnhandledException处理程序

中执行以下代码
string eStr = e.ExceptionObject.ToString();
Java.Lang.Throwable thr = new Java.Lang.Throwable(eStr);

这段代码导致了非常相似的错误

[mono-rt] Stacktrace:
[mono-rt] 
[mono-rt]   at <unknown> <0xffffffff>
[mono-rt]   at (wrapper managed-to-native) object.wrapper_native_0x4072e4e5 (intptr,intptr,int) <IL 0x00027, 0xffffffff>
[mono-rt]   at Android.Runtime.JNIEnv.NewString (string) [0x00017] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.cs:666
[mono-rt]   at Java.Lang.Throwable..ctor (string) [0x00022] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/b5dc5ce9/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Java.Lang.Throwable.cs:50
[mono-rt]   at HockeyAppTest.App.<OnCreate>b__0 (object,System.UnhandledExceptionEventArgs) [0x0000d] in c:'Snapshot'HockeyAppTest'Application.cs:34
[mono-rt]   at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___object_object (object,intptr,intptr,intptr) <IL 0x0005a, 0xffffffff>

这是在AppDomain.CurrentDomain.UnhandledException中使用" java binding "的代码调用的一般问题吗?

无法使用的组件HockeyApp for Android (Xamarin组件商店)

第二个错误是因为未处理的c#异常的异常处理程序运行在一个奇怪的空间,没有真正的JNI访问。

你可以通过直接将c#异常写入HockeyApp格式,并且只将Java异常直接报告给HockeyApp库,从而使它在没有组件的情况下工作。

这就是我使用的https://github.com/tpurtell/AndroidHockeyApp/blob/master/Additions/TraceWriter.cs#L84

HockeyApp对Exception的格式有点迂腐,所以这段代码不是很完美,并且会导致一些堆栈跟踪在他们的网站上按异常名称分组在一起,但是异常都会在这里出现。

这里有一个更简单的解决方案

使用:

  AndroidEnvironment.UnhandledExceptionRaiser += (s, e) => 
       HockeyApp.ManagedExceptionHandler.SaveException(e.Exception);
  Thread.DefaultUncaughtExceptionHandler = new UnCaughtExceptionHandler(this);
就不妨再多

:

AppDomain.CurrentDomain.UnhandledException += (sender, e) => 
            HockeyApp.ManagedExceptionHandler.SaveException (e.ExceptionObject);

其中UnCaughtExceptionHandler只是你的类的实现,它反过来用HockeyApp.ManagedExceptionHandler.SaveException()记录异常(完整的实现在下面)。这是HockeyApp.ManagedExceptionHandler.SaveException(object exceptionObject)抛出的异常的变通方法,我想最终会得到整理。


UnCaughtExceptionHandler类实现

    class UnCaughtExceptionHandler : Java.Lang.Object, Thread.IUncaughtExceptionHandler
    {
        readonly Context context;
        public UnCaughtExceptionHandler(Context context)
        {
            this.context = context;
        }
        public void UncaughtException(Thread thread, Throwable ex)
        {
           HockeyApp.ManagedExceptionHandler.SaveException(ex);
        }
    }