Android 符号
Generate symbols to help you debug a built Android application.
阅读时间8 分钟最后更新于 1 个月前
为了帮助您调试应用程序,Unity 可以生成一个包含符号文件的包,其中包含本机 Unity 库的调试元数据。符号文件包含一个名为符号表 () 的可执行文件部分,可将活动内存地址转换为可以使用的信息,例如方法名称。转换过程称为符号化。将符号包上传到 Google Play 控制台,即可在 Android Vitals 后台上查看人类可读的堆栈跟踪。
.symtab有关可执行文件 (ELF) 部分的更多信息,请参阅 Wikipedia。
Unity 为以下库生成符号文件:
-
:负责初始 Unity 引擎加载逻辑。符号文件已预编译。
libmain -
:Unity 的引擎代码:
libunity- 如果禁用 Strip Engine Code 属性,则会预编译符号文件。
- 如果启用了 Strip Engine Code 属性,Unity 将在构建过程中编译符号文件。
-
:包含 C# 脚本:
libil2cpp- 如果不导出项目,Unity 会在构建过程中编译符号文件。
- 如果导出项目,Gradle 会编译符号文件。
Gradle 会生成剩余的符号文件。
Unity 根据应用程序构建格式,以两种方式生成符号文件:
- 作为可为 或
apk生成的 zip 文件。aab - 直接在 中嵌入符号文件。Unity 不会将符号文件嵌入到
aab中。apk
使用 UserBuildSettings.DebugSymbols.format API 可设置符号包的格式。
符号文件类型
Unity 使用 Gradle 的 debugSymbolLevel 属性来生成符号文件。符号文件有两种类型:
使用 UserBuildSettings.DebugSymbols.level 可生成所需类型的符号文件。
**注意:**默认情况下,Gradle 会生成具有 或 扩展名的符号文件。某些数字分发服务无法识别这些扩展名,需要具有 扩展名的文件。在这种情况下,请使用 Unity.Android.Types.DebugSymbolFormat.LegacyExtensions API 创建具有 扩展名的符号文件。
.so.sym.so.dbg.so.soUserBuildSettings.DebugSymbols.format = DebugSymbolFormat.IncludeInBundle | DebugSymbolFormat.Zip | DebugSymbolFormat.LegacyExtensions;
公共符号
公共符号文件包含将函数地址解析为人类可读字符串的信息。这些文件不包含调试信息。这使得公共符号文件小于调试符号文件。
调试符号
调试符号文件包含完整的调试信息和符号表部分。可使用它:
- 解析堆栈跟踪并调试可为其使用源代码的应用程序。
- 将本机调试器附加到应用程序上并调试代码。
自定义符号
可以指示 Unity 将其他符号文件包含进来。如果您使用共享库并希望本地调试器和 Google Play 在应用程序崩溃时解析共享库堆栈跟踪,这将非常有用。
要使 Unity 包含自定义符号文件:
- 在项目 (Project) 窗口中,选择具有 文件扩展名的插件。
.so - 在检视面板 (Inspector) 中,找到平板设置 (Platform settings) 部分。
- 将 CPU 设置为符号文件兼容的 CPU 架构。
- 将共享库类型 (Shared Library Type) 设置为符号 (Symbol)。
Unity 每次生成符号包时都会将其他符号文件添加到符号包中。
如果要使 Unity 包含 C# 脚本中的自定义符号文件,UnityEditor.Android 命名空间要包含以下 API 以分别设置 CPU 和共享库类型 (Shared Library Type):
**注意:**符号文件名必须与符号文件所对应的共享库的名称匹配。例如,如果共享库名为 mylibrary.so,符号文件也必须命名为 mylibrary.so。为了避免文件名冲突,符号文件和共享库必须位于单独的目录中。
**重要信息:**确保符号文件是最新的并与包含可执行代码的共享库兼容。否则,本地调试器和 Google Play 将无法解析共享库中代码的堆栈跟踪。

生成符号包
有两种方法可以为应用程序启用符号包生成:
- 通过构建设置窗口
- 使用 UserBuildSettings.DebugSymbols.level 和 UserBuildSettings.DebugSymbols.format API。
要通过构建设置窗口启用符号包生成,请执行以下操作:
-
打开构建配置文件 (Build Profiles) 窗口(菜单:文件 (File) > 构建配置文件 (Build Profiles))。
-
选择 Android 平台。
-
将调试符号 (Debug Symbols) 设置为以下值之一:
-
将**符号输出选项 (Symbols output options) **设置为 .zip。
启用符号包生成后,构建项目会生成一个包含 和 库符号文件的 文件。如果将脚本后端设置为 IL2CPP,该 还会包含 库的符号文件。Unity 将此符号包放在输出目录中。
libmainlibunity.zip.ziplibil2cpp如果在 Android 构建设置 (Android Build Settings) 中启用了导出项目 (Export Project),Unity 将不会构建项目。相反,它会导出 Android Studio 项目,为 和 生成符号,并将它们放在输出目录中的 中。从 Android Studio 构建导出的项目时,Gradle 会生成 符号文件并将其与 和 符号文件放在 目录中。
libmainlibunityunityLibrary/symbols/<architecture>/libil2cpplibmainlibunityunityLibrary/symbols/<architecture>/在 Google Play 控制台中使用符号
嵌入式符号
如果要生成 Android App Bundle (aab),可以直接将符号嵌入 并将其上传到 Google Play。
aab**注意:**Unity 不会将符号嵌入到 中。在这种情况下,必须单独上传带有符号的 zip 文件。
apkUserBuildSettings.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 不会将在上传符号包之前应用程序收到的崩溃符号化。