(Unity App Center 崩溃)
App Center 崩溃会在应用每次崩溃时自动生成崩溃日志,并将日志记录到设备存储。 当用户再次启动应用时,SDK 会将故障报告发送到 App Center。 收集故障适用于 beta 版和 live apps,即提交到 Google Play 的故障。 崩溃日志包含有价值的信息,可帮助您解决故障。
如果尚未在应用程序中设置 SDK,请按照 Unity 入门 部分中的说明进行操作。
IOS 上的崩溃日志需要带符号化。 若要启用带符号化,请参阅 App Center 诊断文档,其中说明了如何为应用程序提供符号。
重要
适用于 Unity 的崩溃 SDK 不支持 UWP。 本页中的说明仅涵盖 Android 和 iOS。
备注
如果已附加调试器,SDK 将不会转发任何崩溃日志。 请确保在应用程序崩溃时未附加调试器。
备注
如果已 Enable CrashReport API 在 PlayerSettings 中启用,SDK 将不会收集崩溃日志。
生成测试崩溃
App Center 崩溃将为你提供一个 API,用于生成测试崩溃以便轻松测试 SDK。 此 API 检查调试和发布配置。 因此,你只能在调试时使用它,因为它不适用于发布应用程序。
Crashes.GenerateTestCrash();
备注
此方法将仅用于启用 " 开发生成 " 设置。
获取有关以前的故障的详细信息
App Center 崩溃具有两个 Api,可提供有关应用崩溃情况的详细信息。
应用是否在上一个会话中收到内存不足警告?
在启动 SDK 之后的任何时候,你都可以在上一个会话中检查应用是否收到内存警告:
bool hadLowMemoryWarning = Crashes.HasReceivedMemoryWarningInLastSessionAsync().Result;
备注
此方法在中不起作用 Awake() 。
备注
在某些情况下,内存不足的设备不能发送事件。
应用在上一个会话中是否崩溃?
启动 SDK 之后,可以随时检查应用是否在上一次启动时崩溃:
bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();
HasCrashedInLastSessionAsync如果要在发生崩溃后调整应用的行为或 UI,则调用非常有用。 某些开发人员向其用户显示了额外的 UI,或者希望在发生故障后进行触摸。
有关最后一个崩溃的详细信息
如果你的应用此前崩溃,你可以获取有关最后一个崩溃的详细信息。
ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();
此 API 最常见的用例是在用户实现其自定义 故障委托或侦听器时使用。
自定义 App Center 崩溃的使用情况
App Center 崩溃为开发人员提供回调,以便在将崩溃日志发送到 App Center 之前和之后执行其他操作。
备注
在 App Center 开始 之前 (例如,在方法中)设置回调, Awake 因为 App Center 在启动后立即开始处理崩溃。
是否应处理崩溃?
如果需要确定是否需要处理特定的故障,请设置以下回调。 例如,你可能想要忽略系统级别崩溃,而不是将其发送到App Center。
Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
// Check the report in here and return true or false depending on the ErrorReport.
return true;
};
请求用户同意发送崩溃日志
如果用户隐私很重要,你可能想要在向用户发送故障报告之前获得用户App Center。 SDK 公开一个回调,该回调App Center在发送任何故障报告之前等待用户确认。
如果代码使用此回调,则你负责获取用户的确认。 一个选项是通过包含以下选项之一的对话提示:始终发送、发送 和 不发送。 根据输入,你将告诉App Center崩溃要执行哪些操作,然后会相应地处理崩溃。
备注
SDK 不显示此对话框,应用必须提供自己的 UI 以请求用户同意。
以下回调演示如何告知 SDK 在发送崩溃之前等待用户确认:
Crashes.ShouldAwaitUserConfirmation = () =>
{
// Build your own UI to ask for user consent here. SDK doesn't provide one by default.
// Return true if you built a UI for user consent and are waiting for user input on that custom UI, otherwise false.
return true;
};
如果回调返回 true ,则必须获取用户权限,然后通过以下 API 向 SDK 发送消息,并返回结果:
// Depending on the user's choice, call Crashes.NotifyUserConfirmation() with the right value.
Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
Crashes.NotifyUserConfirmation(UserConfirmation.Send);
Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);
例如,可以参考自定义 对话示例。
获取有关故障日志发送状态的信息
有时,你想要了解应用崩溃的状态。 常见用例是显示一个 UI,通知用户应用正在提交崩溃报告。 另一种方案是,需要调整应用的行为,以确保在重新启动后不久可以提交崩溃日志。 App Center崩溃提供了三种不同的回调,可以通知发生事件:
在 SDK 发送崩溃日志之前,将调用以下回调
Crashes.SendingErrorReport += (errorReport) =>
{
// Your code, e.g. to present a custom UI.
};
如果终结点出现网络问题或中断,并且重启应用,则进程重启后会再次 SendingErrorReport 触发。
SDK 成功发送故障日志后,将调用以下回调
Crashes.SentErrorReport += (errorReport) =>
{
// Your code, e.g. to hide the custom UI.
};
如果 SDK 无法发送崩溃日志,将调用以下回调
Crashes.FailedToSendErrorReport += (errorReport, exception) =>
{
// Your code goes here.
};
接收 FailedToSendErrorReport 意味着出现错误,如发生 4xx 代码。 例如, 401 表示 appSecret 错误。
如果这是网络问题,则不会触发此回调。 在这种情况下,SDK 会继续重试 (,还会在网络连接关闭) 时暂停重试。
将附件添加到崩溃或未经处理的异常报告
还可以选择向崩溃或 未经处理的异常 报告添加二进制文件和文本附件。 SDK 会将它们与报表一起发送,以便您可以在 App Center 门户中查看它们。 在发送存储的报表之前,将直接调用以下回调。 对于崩溃,会在下一次应用程序启动时出现。 对于未经处理的异常,你必须 选择 发送附件。 请确保附件文件 未 命名 minidump.dmp ,因为该名称已保留用于小型转储文件。 下面是如何将文本和图像附加到报表的示例:
Crashes.GetErrorAttachments = (ErrorReport report) =>
{
// Your code goes here.
return new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
};
故障与属性的报告中的未处理异常区分开来 IsCrash 。 对于崩溃,属性将为 true; 否则为 false。
备注
附件的大小限制目前为 7 MB。 如果尝试发送更大的附件,则会触发错误。
备注
GetErrorAttachments 在主线程上调用,而不会对帧拆分工作。 若要避免阻止游戏循环,请不要在此回调中执行任何长时间运行的任务。
在运行时启用或禁用 App Center 崩溃
可以在运行时启用和禁用 App Center 崩溃。 如果禁用它,SDK 不会为应用执行任何崩溃报告。
Crashes.SetEnabledAsync(false);
若要再次App Center崩溃,请使用同一 API,但作为 true 参数传递。
Crashes.SetEnabledAsync(true);
无需等待此调用,使其他 API 调用 (一) IsEnabledAsync 一致。
状态在应用程序启动时一直保留于设备的存储中。
检查App Center崩溃是否已启用
还可以检查是否App Center崩溃:
bool isEnabled = await Crashes.IsEnabledAsync();
Unity 中已处理的异常
App Center还允许在 Unity 中跟踪使用已处理异常的错误。 为此,请使用 TrackError 方法:
try {
// your code goes here.
} catch (Exception exception) {
Crashes.TrackError(exception);
}
有关错误的更多上下文,还可以将属性附加到该错误。 将属性作为字符串字典传递。 此步骤是可选的。
try {
// your code goes here.
} catch (Exception exception) {
var properties = new Dictionary<string, string>
{
{ "Category", "Music" },
{ "Wifi", "On" }
};
Crashes.TrackError(exception, properties);
}
还可以选择将二进制和文本附件添加到已处理的错误报告。 将附件作为 对象的数组 ErrorAttachmentLog 传递,如以下示例所示。
try {
// your code goes here.
} catch (Exception exception) {
var attachments = new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
Crashes.TrackError(exception, attachments: attachments);
}
Unity 中未经处理异常
报告未经处理异常
默认情况下,App Center SDK 不会报告应用中引发的不会导致严重崩溃的未经处理异常。 若要启用此功能,请调用以下方法:
Crashes.ReportUnhandledExceptions(true);
调用此 API 后,App Center将所有未处理的异常记录为 App Center 门户中的问题,类似于前面提到的已处理的异常。 若要禁用此功能,请调用与 参数传递相同的 false API。
Crashes.ReportUnhandledExceptions(false);
备注
SDK 检测到的一些未经App Center异常将在应用程序 UI 中显示为App Center错误。 这是因为,默认情况下 Unity 捕获未经处理的异常,这意味着应用程序不会退出且不被视为崩溃。
将附件添加到未处理的异常报告
默认情况下,App Center SDK 不会启用未经处理的异常的附件。 若要启用此功能,请将 enableAttachmentsCallback 方法的布尔参数设置 ReportUnhandledExceptions 为 true :
Crashes.ReportUnhandledExceptions(true, true);
然后,可以选择通过实现 GetErrorAttachments 回调向未处理的异常报表添加附件。
报告 NDK 崩溃
报告崩溃
若要在 App Center 中收到正确的崩溃报告,请首先确保按照上面列出的说明设置 App Center 的 "崩溃 SDK"。
生成 breakpad 库
接下来,必须按照官方 Google Breakpad For ANDROID 自述文件中列出的说明进行操作,并编译 Google Breakpad。 若要在 Unity 中使用此方法,请将二进制文件包含在应用中。
备注
默认情况下,App Center SDK 不会捆绑 Google Breakpad。
附加异常处理程序
包含 Google Breakpad 后,附加 NDK 崩溃处理程序:
/* Attach NDK Crash Handler. */
var minidumpDir = Crashes.GetMinidumpDirectoryAsync();
setupNativeCrashesListener(minidumpDir.Result);
...
[DllImport("YourLib")]
private static extern void setupNativeCrashesListener(string path);
方法 setupNativeCrashesListener 是必须在 c/c + + 中实现的本机方法:
#include <android/log.h>
#include "google-breakpad/src/client/linux/handler/exception_handler.h"
#include "google-breakpad/src/client/linux/handler/minidump_descriptor.h"
static google_breakpad::ExceptionHandler exception_handler(google_breakpad::MinidumpDescriptor(), NULL, dumpCallback, NULL, true, -1);
/**
* Registers breakpad as the exception handler for NDK code.
* @param path minidump directory path returned from Crashes.GetMinidumpDirectoryAsync()
*/
extern "C" void setupNativeCrashesListener(const char *path) {
google_breakpad::MinidumpDescriptor descriptor(path);
exception_handler.set_minidump_descriptor(descriptor);
}
dumpCallback用于故障排除的位置:
/*
* Triggered automatically after an attempt to write a minidump file to the breakpad folder.
*/
static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,
void *context,
bool succeeded) {
/* Allow system to log the native stack trace. */
__android_log_print(ANDROID_LOG_INFO, "YourLogTag",
"Wrote breakpad minidump at %s succeeded=%d\n", descriptor.path(),
succeeded);
return false;
}
这些方法正确设置后,应用会在重新启动时将小型转储发送到自动 App Center。 若要进行故障排除,可以使用详细日志来检查是否在重新启动应用后发送小型转储。
备注
App Center 使用 minidump.dmp 小型转储附件的保留名称。 请确保将你的附件命名为不同的名称,除非它是一个小型转储文件,以便我们可以正确地处理。
警告
Breakpad 中有一个已知 bug,这使得无法捕获 x86 模拟器上的崩溃。
符号化
有关 崩溃处理详细信息 ,请参阅诊断文档。