我正在使用 Mvvmcross、Mono for Android 和 MonoTouch 编写一个跨平台应用程序。在我正在移植的 Java Android 应用程序中,我使用 ACRA 来提供崩溃报告和临时报告。这些报告通过 HTTP Post 发送到我们的服务器。
Mvvmcross 是否有任何崩溃报告插件?Mono* 社区能否推荐任何崩溃报告库?
如果似乎什么都没有,其他开发人员是如何处理这个问题的?他们如何捕获未捕获的应用程序异常和 Android ANR 以便触发报告?
我正在使用 Mvvmcross、Mono for Android 和 MonoTouch 编写一个跨平台应用程序。在我正在移植的 Java Android 应用程序中,我使用 ACRA 来提供崩溃报告和临时报告。这些报告通过 HTTP Post 发送到我们的服务器。
Mvvmcross 是否有任何崩溃报告插件?Mono* 社区能否推荐任何崩溃报告库?
如果似乎什么都没有,其他开发人员是如何处理这个问题的?他们如何捕获未捕获的应用程序异常和 Android ANR 以便触发报告?
以前我在 MonoDroid 应用程序上工作,并将Crasher构建为 ACRA 的端口。但是由于 Mono 的某些特性,特别是 .NET,ACRA 的某些功能无法在 MonoDroid 中实现。如果它对你有帮助,我会很高兴。
我在这方面的唯一经验是使用 Flurry - 我们仅将其用于分析,而不用于崩溃报告。
基本上我们所做的是使用 IAnalytics 接口记录 ViewModel 中的所有重要事件,然后每个平台都提供了 IAnalytics 的实现,例如:
WP7:
public class FlurryAnalytics : IAnalytics
{
public const string ApiKeyValue = "--- your key ---";
public void StartSession()
{
FlurryWP7SDK.Api.StartSession(ApiKeyValue);
}
public void LogEvent(string eventName)
{
FlurryWP7SDK.Api.LogEvent(eventName);
}
}
触摸(与https://github.com/kevinmcmahon/monotouch-libs/blob/master/FlurryAnalytics/flurry.cs等绑定一起使用):
public class FlurryAnalytics : IAnalytics
{
public const string ApiKeyValue = "37SHD8L8VATPBS88AMHU";
public void StartSession()
{
FlurryAPI.StartSession (ApiKeyValue);
}
public void LogEvent(string eventName)
{
FlurryAPI.LogEvent(eventName);
}
}
Android(有点复杂——它需要一个活动的每次开始/停止的钩子):
public class FlurryAnalytics : IAnalytics, IAndroidActivityTracker
{
public const string ApiKeyValue = "--- your key ---";
private readonly IntPtr _flurryClass;
private readonly IntPtr _flurryOnStartSession;
private readonly IntPtr _flurryOnEndSession;
private readonly IntPtr _flurryLogEvent;
public FlurryAnalytics()
{
_flurryClass = JNIEnv.FindClass("com/flurry/android/FlurryAgent");
_flurryOnStartSession = JNIEnv.GetStaticMethodID(_flurryClass, "onStartSession",
"(Landroid/content/Context;Ljava/lang/String;)V");
_flurryOnEndSession = JNIEnv.GetStaticMethodID(_flurryClass, "onEndSession", "(Landroid/content/Context;)V");
_flurryLogEvent = JNIEnv.GetStaticMethodID(_flurryClass, "logEvent", "(Ljava/lang/String;)V");
}
public void StartSession()
{
// not used in Android - Android relies on Activity tracking instead
}
public void LogEvent(string eventName)
{
ExceptionSafe(() => JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryLogEvent, new JValue(new Java.Lang.String(eventName))));
}
private static void ExceptionSafe(Action action)
{
try
{
action();
}
catch (ThreadAbortException)
{
throw;
}
catch (Exception exception)
{
UITrace.Trace("Exception seen in calling Flurry through JNI " + exception.ToLongString());
}
}
public void OnStartActivity(Activity activity)
{
ExceptionSafe(() => JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryOnStartSession, new JValue(activity), new JValue(new Java.Lang.String(ApiKeyValue))));
}
public void OnStopActivity(Activity activity)
{
ExceptionSafe(() => JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryOnEndSession, new JValue(activity)));
}
}
从 Flurry 文档和一些博客中,我相信这可以扩展到包括崩溃报告:
但如果不尝试,我不知道它在 MonoDroid 和 MonoTouch 中的效果如何。