包含此页的版本:
不含此页的版本:
Android 上 Unity 应用程序的崩溃处理充当崩溃处理程序链。链开头的崩溃处理程序首先接收崩溃,它可以处理崩溃,还可以将崩溃转发到链中的下一个崩溃处理程序。链中崩溃处理程序的顺序由它们的安装顺序定义。首先安装的崩溃处理程序是最后一个接收崩溃的处理程序,最后安装的崩溃处理程序是第一个接收崩溃的处理程序。默认情况下,Unity 充当链中的第一个崩溃处理程序。它处理崩溃并将其转发到链中的下一个崩溃处理程序,默认情况下,这是 Android 系统崩溃处理程序。
您可以将 Unity 配置为对崩溃做出不同的反应,还可以将您自己的自定义崩溃处理程序添加到链中。本页介绍如何指定 Unity 用于处理崩溃的方法以及如何创建自定义崩溃处理程序。
如果您不想使用 Unity 的默认崩溃处理行为,可以使用-androidChainedSignalHandlerBehavior命令行参数来更改 Unity 对崩溃的反应方式。此参数采用以下值之一:
| 行为值 | 描述 |
|---|---|
legacy |
当发生本机崩溃时,Unity 会将崩溃包装并抛出为 java 异常。Unity 不会将崩溃转发到任何已安装的崩溃处理程序或默认系统。 注意:GameActivity 不支持此行为值,将在未来的 Unity 版本中删除。 |
disabled |
当发生本机崩溃时,Unity 会忽略它,Android 会将崩溃直接转发到链中的下一个崩溃处理程序。这要么是自定义崩溃处理程序(如果已安装),要么是默认系统(如果未安装)。 注意:如果使用此值,Unity Cloud Diagnostics 等 Unity 服务将不再处理崩溃,也不会报告崩溃。 |
有关如何将此命令行参数传递给 Unity 的信息,请参阅指定 Unity 启动参数。
本节包含如何创建和设置您自己的崩溃处理程序的示例。为此,不得使用 Unity 的旧版崩溃处理行为。有关更多信息,请参阅指定 Unity 如何处理崩溃。
以下代码示例演示了自定义崩溃处理程序。如果您使用IL2CPP Unity 开发的脚本后端,在为某些平台构建项目时,可以将其用作 Mono 的替代方案。更多信息
请参阅术语表 脚本后端为Unity中的脚本提供支持的框架。Unity 支持三种不同的脚本后端,具体取决于目标平台:Mono、.NET 和 IL2CPP。但是,通用 Windows 平台仅支持两个:.NET 和 IL2CPP。更多信息
请参阅术语表,您可以放置此示例cpp文件直接放入 Unity 项目中。然后,Unity 将其编译为libil2cpp.cpp.如果您使用单声道Unity 中使用的脚本后端。更多信息
请参阅术语表编写脚本后端时,您必须编译并链接自己的共享库。更多信息,请参考创建Android原生插件。
android_crash_handler.cpp
#include <android/log.h>
#include <jni.h>
#include <signal.h>
struct sigaction s_PreviousHandler;
bool s_SignalHandlerInstalled;
static void MyCustomHandler(int sig, siginfo_t* info, void* ucontext)
{
__android_log_print(ANDROID_LOG_VERBOSE, "CustomCrashHandler", "Handling signal %d", sig);
s_PreviousHandler.sa_sigaction(sig, info, ucontext);
}
extern "C" void InstallCustomSignalHandlers()
{
struct sigaction Action = {};
Action.sa_sigaction = MyCustomHandler;
// Note: Register more signals if you want.
Action.sa_flags = SIGSEGV;
sigaction(SIGSEGV, &Action, &s_PreviousHandler);
s_SignalHandlerInstalled = true;
}
extern "C" JNIEXPORT void Java_com_unity3d_player_UnityPlayerActivity_InstallCustomSignalHandlersFromJava()
{
InstallCustomSignalHandlers();
}
extern "C" void UninstallCustomSignalHandlers()
{
if (s_SignalHandlerInstalled)
{
sigaction(SIGSEGV, &s_PreviousHandler, nullptr);
s_SignalHandlerInstalled = false;
}
}
要安装崩溃处理程序并让 Unity 使用它来处理崩溃,请调用InstallCustomSignalHandlers上述方法cpp文件。可以通过 C# 或 Java 代码执行此作,但最佳做法是从 Java 调用此方法,因为在 Unity Player 初始化之后,但在 C# 代码运行之前,可能会发生崩溃。
以下代码示例演示如何调用InstallCustomSignalHandlersJava 代码中的方法。要将其添加到您的项目中,您可以将 Java 文件安装为插件在 Unity 外部创建的一组代码,用于在 Unity 中创建功能。可以在 Unity 中使用两种插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。更多信息
请参阅术语表(请参阅创建 Java 或 Kotlin 源代码插件),或者您可以修改导出项目中的现有 Java 文件。
注意:根据调用此方法的位置,它会更改崩溃处理的行为。如果您在 Unity 运行时初始化之前调用它,这是包含mUnityPlayer = new UnityPlayer(this, this);,则在本机崩溃期间,首先执行 Unity 的崩溃处理程序,然后执行您的信号处理程序(如果 Unity 转发信号)。如果您调用InstallCustomSignalHandlers在 Unity 运行时初始化之后,在本机崩溃期间,首先执行处理程序,您负责转发信号。
UnityPlayerActivity.java
...
public native void InstallCustomSignalHandlersFromJava();
static
{
System.loadLibrary("il2cpp");
}
// Setup activity layout
@Override protected void onCreate(Bundle savedInstanceState)
{
InstallCustomSignalHandlersFromJava();
...
mUnityPlayer = new UnityPlayer(this, this);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();
}
...