版本:Unity 6 (6000.0)
语言:英语
在 Android 设备上调试
模拟 Android 设备

Android 符号

为了帮助您调试应用程序,Unity 可以生成一个包含符号文件的包,其中包含用于本地 Unity 库的调试元数据。符号文件包含一个称为符号表(.symtab)的可执行文件部分,它将活动内存地址转换为可用的信息,例如方法名称。此转换过程称为符号化。您可以将符号包上传到 Google Play Console,以便在Android Vitals仪表板上看到人类可读的堆栈跟踪。

有关可执行文件 (ELF) 部分的更多信息,请参阅 维基百科

Unity 为以下库生成符号文件

  • libmain:负责初始 Unity 引擎加载逻辑。符号文件是预编译的。

  • libunity:Unity 的引擎代码

    • 如果禁用 Strip Engine Code 属性,则符号文件是预编译的。
    • 如果启用 Strip Engine Code 属性,Unity 会在构建过程中编译符号文件。
  • libil2cpp:包含 C# 脚本一段代码,允许您创建自己的组件、触发游戏事件、随着时间的推移修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
    参见 术语表

    • 如果您不导出项目,Unity 会在构建过程中编译符号文件。
    • 如果您导出项目,Gradle一个 Android 构建系统,可以自动化多个构建过程。此自动化意味着许多常见的构建错误不太可能发生。 更多信息
      参见 术语表
      会编译符号文件。

Gradle 生成其余符号文件。

根据您的应用程序构建格式,Unity 以两种方式生成符号文件

  • 作为 zip 文件,可以为 apkaab 生成。
  • 直接将符号文件嵌入到 aab 中。Unity 不会将符号文件嵌入到 apk 中。

使用 UserBuildSettings.DebugSymbols.format API 设置符号包的格式。

符号文件类型

Unity 使用 Gradle 的 debugSymbolLevel 属性生成符号文件。有两种类型的符号文件

  • 公共:一个包含符号表部分的小文件。有关更多信息,请参阅 公共符号
  • 调试:包含公共符号文件包含的所有内容,以及您可以用于更深入调试的完整调试信息。有关更多信息,请参阅 调试符号

使用 UserBuildSettings.DebugSymbols.level 生成所需的符号文件类型。

注意:默认情况下,Gradle 生成扩展名为 .so.sym.so.dbg 的符号文件。一些数字分发服务不识别这些扩展名,而是需要扩展名为 .so 的文件。在这种情况下,请使用 Unity.Android.Types.DebugSymbolFormat.LegacyExtensions API 创建扩展名为 .so 的符号文件。

UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.IncludeInBundle | DebugSymbolFormat.Zip | DebugSymbolFormat.LegacyExtensions;

公共符号

公共符号文件包含将函数地址解析为人类可读字符串的信息。这些文件不包含调试信息。这使得公共符号文件比 调试符号 文件更小。

调试符号

调试符号文件包含完整的调试信息和符号表部分。使用它来

  • 解析堆栈跟踪并调试您有源代码可用的应用程序。
  • 将本地调试器附加到应用程序并调试代码。

注意:如果调试符号不可用,Unity 会在构建时将 公共符号 文件放置在您的项目中。对于 libmainlibunity 库,调试符号不可用,Unity 始终生成公共文件。

自定义符号

您可以指示 Unity 包含其他符号文件。如果您使用共享库并希望您的本地调试器和 Google Play 在应用程序崩溃时解析共享库堆栈跟踪,这将很有用。

要使 Unity 包含自定义符号文件

  1. 项目窗口显示 Assets 文件夹内容的窗口(项目选项卡) 更多信息
    参见 术语表
    中,选择具有 .so 文件扩展名的 插件在 Unity 外部创建的一组代码,在 Unity 中创建功能。Unity 中可以使用两种类型的插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和原生插件(特定于平台的原生代码库)。 更多信息
    参见 术语表
  2. 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
    参见 术语表
    中,找到 Platform settings 部分。
  3. CPU 设置为符号文件兼容的 CPU 架构。
  4. Shared Library Type 设置为 Symbol

每当 Unity 生成符号包时,它都会将其他符号文件添加到符号包中。

如果您想让 Unity 从 C# 脚本包含自定义符号文件,则 UnityEditor.Android 命名空间包含以下 API 分别设置 CPUShared Library Type

注意:符号文件名必须与符号文件所属的共享库的名称匹配。例如,如果共享库名为 mylibrary.so,则符号文件也必须名为 mylibrary.so。为了避免文件名 冲突当物理引擎检测到两个游戏对象的碰撞器发生接触或重叠时,就会发生碰撞,前提是其中至少一个具有 Rigidbody 组件并且正在运动。 更多信息
参见 术语表
,符号文件和共享库必须位于不同的目录中。

重要:确保符号文件是最新的,并且与包含可执行代码的共享库兼容。如果您没有,您的本地调试器和 Google Play 将无法解析共享库中代码的堆栈跟踪。

生成符号包

有两种方法可以为您的应用程序启用符号包生成

要通过 Build Settings 窗口启用符号包生成

  1. 打开 Build Profiles 窗口(菜单:文件 > 构建配置文件)。

  2. 选择 Android 平台。

  3. Debug Symbols 设置为以下选项之一

  4. Symbols output options 设置为 .zip

启用符号包生成后,构建项目会生成一个 .zip 文件,其中包含 libmainlibunity 库的符号文件。如果您将您的 脚本后端为 Unity 提供脚本支持的框架。Unity 支持三种不同的脚本后端,具体取决于目标平台:Mono、.NET 和 IL2CPP。然而,通用 Windows 平台仅支持两种:.NET 和 IL2CPP。 更多信息
参见 术语表
设置为 IL2CPPUnity 开发的脚本后端,您可以在构建某些平台的项目时将其用作 Mono 的替代方案。 更多信息
参见 术语表
.zip 还包含 libil2cpp 库的符号文件。Unity 将此符号包放置在输出目录中。

如果您在 Android 构建设置中启用 Export Project,Unity 不会构建项目。相反,它会将项目导出到 Android Studio,为 libmainlibunity 生成符号,并将它们放置在输出目录中的 unityLibrary/symbols/<architecture>/ 中。当您从 Android Studio 构建导出的项目时,Gradle 会生成 libil2cpp 符号文件,并将它放置在 unityLibrary/symbols/<architecture>/ 目录中,与 libmainlibunity 符号文件一起。

在 Google Play Console 中使用符号

嵌入符号

如果您要生成 Android 应用程序包 (aab),您可以将符号直接嵌入到 aab 中,并将其上传到 Google Play。

注意:Unity 不会将符号嵌入到 apk 中。在这种情况下,您必须单独上传包含符号的 zip 文件。

UserBuildSettings.DebugSymbols.level = DebugSymbolLevel.SymbolTable;
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.IncludeInBundle;

压缩符号

要生成压缩的符号包,请使用以下代码

UserBuildSettings.DebugSymbols.level = DebugSymbolLevel.SymbolTable;
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.Zip | DebugSymbolFormat.LegacyExtensions;

将您的应用程序上传到 Google Play 后,您可以上传 公共符号 zip 包。有关如何执行此操作的信息,请参阅 Google 的文档:对崩溃堆栈跟踪进行反混淆或符号化

注意:Google Play 不会符号化您的应用程序在您上传符号包之前收到的崩溃。

在 Android 设备上调试
模拟 Android 设备