为了帮助您调试应用程序,Unity 可以生成一个包含符号文件的包,其中包含用于本地 Unity 库的调试元数据。符号文件包含一个称为符号表(.symtab
)的可执行文件部分,它将活动内存地址转换为可用的信息,例如方法名称。此转换过程称为符号化。您可以将符号包上传到 Google Play Console,以便在Android Vitals仪表板上看到人类可读的堆栈跟踪。
有关可执行文件 (ELF) 部分的更多信息,请参阅 维基百科。
Unity 为以下库生成符号文件
libmain
:负责初始 Unity 引擎加载逻辑。符号文件是预编译的。
libunity
:Unity 的引擎代码
libil2cpp
:包含 C# 脚本一段代码,允许您创建自己的组件、触发游戏事件、随着时间的推移修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
参见 术语表
Gradle 生成其余符号文件。
根据您的应用程序构建格式,Unity 以两种方式生成符号文件
apk
或 aab
生成。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 会在构建时将 公共符号 文件放置在您的项目中。对于 libmain
和 libunity
库,调试符号不可用,Unity 始终生成公共文件。
您可以指示 Unity 包含其他符号文件。如果您使用共享库并希望您的本地调试器和 Google Play 在应用程序崩溃时解析共享库堆栈跟踪,这将很有用。
要使 Unity 包含自定义符号文件
Assets
文件夹内容的窗口(项目选项卡) 更多信息.so
文件扩展名的 插件在 Unity 外部创建的一组代码,在 Unity 中创建功能。Unity 中可以使用两种类型的插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和原生插件(特定于平台的原生代码库)。 更多信息每当 Unity 生成符号包时,它都会将其他符号文件添加到符号包中。
如果您想让 Unity 从 C# 脚本包含自定义符号文件,则 UnityEditor.Android 命名空间包含以下 API 分别设置 CPU 和 Shared Library Type
注意:符号文件名必须与符号文件所属的共享库的名称匹配。例如,如果共享库名为 mylibrary.so,则符号文件也必须名为 mylibrary.so。为了避免文件名 冲突当物理引擎检测到两个游戏对象的碰撞器发生接触或重叠时,就会发生碰撞,前提是其中至少一个具有 Rigidbody 组件并且正在运动。 更多信息
参见 术语表,符号文件和共享库必须位于不同的目录中。
重要:确保符号文件是最新的,并且与包含可执行代码的共享库兼容。如果您没有,您的本地调试器和 Google Play 将无法解析共享库中代码的堆栈跟踪。
有两种方法可以为您的应用程序启用符号包生成
要通过 Build Settings 窗口启用符号包生成
打开 Build Profiles 窗口(菜单:文件 > 构建配置文件)。
选择 Android 平台。
将 Debug Symbols 设置为以下选项之一
将 Symbols output options 设置为 .zip。
启用符号包生成后,构建项目会生成一个 .zip
文件,其中包含 libmain
和 libunity
库的符号文件。如果您将您的 脚本后端为 Unity 提供脚本支持的框架。Unity 支持三种不同的脚本后端,具体取决于目标平台:Mono、.NET 和 IL2CPP。然而,通用 Windows 平台仅支持两种:.NET 和 IL2CPP。 更多信息
参见 术语表设置为 IL2CPPUnity 开发的脚本后端,您可以在构建某些平台的项目时将其用作 Mono 的替代方案。 更多信息
参见 术语表,.zip
还包含 libil2cpp
库的符号文件。Unity 将此符号包放置在输出目录中。
如果您在 Android 构建设置中启用 Export Project,Unity 不会构建项目。相反,它会将项目导出到 Android Studio,为 libmain
和 libunity
生成符号,并将它们放置在输出目录中的 unityLibrary/symbols/<architecture>/
中。当您从 Android Studio 构建导出的项目时,Gradle 会生成 libil2cpp
符号文件,并将它放置在 unityLibrary/symbols/<architecture>/
目录中,与 libmain
和 libunity
符号文件一起。
如果您要生成 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 不会符号化您的应用程序在您上传符号包之前收到的崩溃。