Version: 6000.3
语言: 中文
请求运行时权限
退出 Unity Android 应用程序

处理 Android 崩溃

Android 上 Unity 应用程序的崩溃处理充当崩溃处理程序链。链开头的崩溃处理程序首先接收崩溃,它可以处理崩溃,还可以将崩溃转发到链中的下一个崩溃处理程序。链中崩溃处理程序的顺序由它们的安装顺序定义。首先安装的崩溃处理程序是最后一个接收崩溃的处理程序,最后安装的崩溃处理程序是第一个接收崩溃的处理程序。默认情况下,Unity 充当链中的第一个崩溃处理程序。它处理崩溃并将其转发到链中的下一个崩溃处理程序,默认情况下,这是 Android 系统崩溃处理程序。

您可以将 Unity 配置为对崩溃做出不同的反应,还可以将您自己的自定义崩溃处理程序添加到链中。本页介绍如何指定 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();
  }
...
请求运行时权限
退出 Unity Android 应用程序