目前做的项目是基于unity把场景导出为一个lib,view嵌入到android中运行。
有一次遇到了个应用crash的问题,看日志是挂在了unity里边。
unity项目导出到android平台后,jni层一般会有三个so库,其中 libmain.so、libunity.so 为引擎库,libil2cpp.so 是导出模块在编译业务代码后打包的库。
一般情况下,挂在 libil2cpp.so 中的问题都比较好排查。
而如上图的,挂在引擎库内部的问题,一个是符号丢失,另一个是问题一般藏的比较深,且无源码不好排查。
源码是需要花钱买的,符号丢失的问题有方案解决,这里记录一下。
addr2line工具
首先打开ndk目录下的ndk/${version}/toolchains
目录,可以看到各个平台的ndk交叉编译器工具
进入目标平台目录,然后进入 prebuilt/${指令集版本}/bin
目录,找到 addr2line
工具。
导出带符号的引擎库文件
打开 File → Build Settings
, 将 Create Symbols.zip 选项设置为 debugging。
然后导出项目,即可在 unityLibrary/symbols/${指令集}/
目录下看到带符号的引擎库。
查看crash堆栈对应的内容
查看开头错误堆栈的地址信息,运行1
./aarch64-linux-android-addr2line -f -C -e /your-path-to/libunity.so 0000000000353e80 00000000003541f4 0000000000356480
即可看到正确的符号。
虽然没有源码,但是这里已经可以合理猜测,是调用 windowFocusChanged 的时候,释放某个 context 对象导致的 crash。
下面在 android 业务代码中再进行排查,比如 activity 是否已经释放,等思路。
本文链接:https://www.zoucz.com/blog/2022/11/30/011a7e40-70ad-11ed-9fa0-5dbc93f9d3ee/