IL2CPP打包libunity.so等符号表(Symbols)对不上问题

前文说过使用符号表可以解析 libunity 等 so 库的调用堆栈,但对于开启引擎代码裁剪的 IL2CPP 正式包来说,符号表的 Build Id 与 apk 内的 so 库是不一致的。

示例

以下是某 Unity 游戏的 CRASH 日志,可见其打包版本为 Unity 2020.3.12f1(b3b2c6512326),正式包,且是一个 32 位 il2cpp 包。

CRASH   : Version '2020.3.12f1 (b3b2c6512326)', Build type 'Release', Scripting Backend 'il2cpp', CPU 'armeabi-v7a'
01 pc 002dacc8  /data/app/com.azimiao.xxx==/lib/arm/libunity.so (BuildId: eaba752843d3dbc96e38e5fbc58237203d2015e0)

可见包内 libunity.so 的 Build Id 是eaba752843d3dbc96e38e5fbc58237203d2015e0

来到同版本Editor 文件夹下,查看 so 库及对应符号表的 Build Id:

发现编辑器下的库 Build Id 为53fa0bec678169de9c334e6263766d77b39e30f0,与 Apk 中的 so 库 Id 不同。

因此,直接用 Editor 文件夹下的符号包 debug 是行不通了。

原因

开启引擎代码裁剪后,il2cpp 打包时会对 so 库进行裁剪。

解决方法

1.当使用 UnityEditor 打包时

下次打包时,在 Unity Build 菜单处,选上符号表生成:

打包完成后,同级目录下会有对应的符号表 zip 包。

2.当导出工程并使用 Android Studio Gradle 打包时

若开启了引擎代码裁剪,则导出工程后不要关闭 Unity Editor,从 Temp 获取符号表:

# 在已开启引擎代码裁剪的情况下:
libunity:`/Temp/StagingArea/symbols/`

libmain 符号表还在老地方,即 Editor 安装目录下的 PlaybackEngines 中。

Gradle 打包时,libil2cpp 的符号表会放置在unityLibrary/symbols/下。

如果未开启代码裁剪,则 libunity 与 libmain 的符号表都在老地方,也就是 Editor 安装目录的 PlaybackEngines 中。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/8781.html
欢迎加入梓喵出没博客交流群:313732000

吐槽 mario

*

*

0位绅士参与评论

  1. wu先生04-02 18:00 回复

    居然没有留网址的地方? 😈 😡

    • WeiCN04-13 17:47 回复

      评论内容大多都被吞了,还需要手动放出来 :mrgreen:

      • 野兔04-13 23:38 回复

        没辙,去年动不动就被 IDC 警告“xxxx 页面内容违规,请于 x 小时内整改否则封禁 IP 端口并吊销备案”。

  2. mario04-20 16:01 回复

    感谢。
    CI 编译可以调 EditorUserBuildSettings.androidCreateSymbolsZip = true;