一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 2 天,点击查看活动详情。
日志分析
我们先来看下友盟 SDK 捕获到的崩溃信息,如下:
关键日志:
E/DEBUG: Process Name: 【包名】
E/DEBUG: Thread Name: 'Loading.Preload'
E/DEBUG: pid: 4927, tid: 5685 >>> 【包名】 <<<
详细日志:
E/DEBUG: Activity: (none)
E/DEBUG: --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
E/DEBUG: um_app_key: 【appid】
E/DEBUG: um_app_channel: xiaomi
E/DEBUG: um_os: android
E/DEBUG: um_crash_sdk_version: 1.3.1
E/DEBUG: um_umid_header: 【header】
E/DEBUG: um_app_carrier:
E/DEBUG: um_access: wifi
E/DEBUG: um_network_type: 0
E/DEBUG: --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
E/DEBUG: maps:
E/DEBUG: fault addr 0000000000000369 not in maps
E/DEBUG: total lines: 4755, matched 1800 lines, write 1800 lines.
E/DEBUG: total address size: 40223580 kB
E/DEBUG: --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
E/DEBUG: Process Name: 【包名】
E/DEBUG: Thread Name: 'Loading.Preload'
E/DEBUG: pid: 4927, tid: 5685 >>> 【包名】 <<<
E/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000000000000369
E/DEBUG: x0 0000000000000000 x1 0000000000000000 x2 0000000000000040 x3 0000000000000003
E/DEBUG: x4 000000702c4fa860 x5 0000000003787d30 x6 731f64716e6c1f6c x7 7f7f7f7f7f7f7f7f
E/DEBUG: x8 0000000000000001 x9 54ef82594dd16bd7 x10 0000000000000001 x11 0000000000000001
E/DEBUG: x12 000000702c4fab30 x13 000000000000004d x14 000000702c4fabe0 x15 000005ae4fe301eb
E/DEBUG: x16 0000007135bd2960 x17 00000074f64224e4 x18 00000000c1f5bc1c x19 0000007135bfec40
E/DEBUG: x20 0000006fdb1ad1d0 x21 0000007135bfece8 x22 000000000000006d x23 0000007135bee090
E/DEBUG: x24 0000000000000010 x25 000000000000002a x26 000000000000002a x27 0000007135bef8c6
E/DEBUG: x28 0000000000000018 x29 0000000000003234 x30 000000713529d35c
E/DEBUG: sp 000000702c4fc580 pc 000000713529d3a4 pstate 0000000060001000
E/DEBUG: v0 00000000000000000000000000000000 v1 000000000a0a29303231203a656e694c
E/DEBUG: v2 00000000000000000000000000000000 v3 00000000000000000000000000000000
E/DEBUG: v4 8060180000000000806018067f9f0000 v5 00000000000000000000000000000000
E/DEBUG: v6 000000000000000000000000ffff0000 v7 80601806806018068060180680601806
E/DEBUG: v8 00000000000000000000000000000000 v9 00000000000000000000000000000000
E/DEBUG: v10 00000000000000000000000000000000 v11 00000000000000000000000000000000
E/DEBUG: v12 00000000000000000000000000000000 v13 00000000000000000000000000000000
E/DEBUG: v14 00000000000000000000000000000000 v15 00000000000000000000000000000000
E/DEBUG: v16 c0300c03c0300c03c0300c03c0300c03 v17 a0080000a00a5000a800aa5000000000
E/DEBUG: v18 80200800000000008020080240100000 v19 00000000000000000000001b0000001b
E/DEBUG: v20 00000000000000004949494848484847 v21 000000000000000090908f8f8e8e8d8c
E/DEBUG: v22 00000000000000001c1c1b1b1b1b1b1b v23 00000000000000000093009200920091
E/DEBUG: v24 00000000000000000000008f0000008f v25 0000000000000000008e008e008d008c
E/DEBUG: v26 00000000000000000000009400000093 v27 00000000000000000000002000000007
E/DEBUG: v28 00000000000000000000001000000008 v29 00000000000000000000003000000009
E/DEBUG: v30 0000000000000000000000080000000c v31 0075006f00720020005400420020002c
E/DEBUG: fpsr 0000001a fpcr 00000000
E/DEBUG: #00 pc 000000000066a3a4 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #01 pc 0000000000669f44 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #02 pc 0000000000669e94 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #03 pc 00000000001d1184 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #04 pc 00000000002cfd80 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #05 pc 00000000003521f4 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #06 pc 000000000035204c /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #07 pc 000000000034d35c /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #08 pc 000000000034b628 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #09 pc 000000000034c50c /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #10 pc 000000000034bc8c /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #11 pc 0000000000286ca4 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #12 pc 0000000000288974 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #13 pc 00000000002887c0 /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #14 pc 000000000028872c /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #15 pc 00000000002df41c /data/app/~~b_3TstDXMOwZ5vCSkm_nzw==/【包名】-kcWb6zW72oV3LNR0lejt2w==/lib/arm64/libunity.so
E/DEBUG: #16 pc 00000000000799a4 /apex/com.android.runtime/lib64/bionic/libc.so (_ZL15__pthread_startPv+264)
E/DEBUG: #17 pc 000000000001619c /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68)
Loading.Preload 这是一个什么线程?当时问题复现的场景是小米手机上进行渠道登录,刚好出现小米的登录加载悬浮球,起初以为是小米手机游戏相关程序上出现的异常。看名字,估计是 unity 初始化预加载引擎相关的吧?
再看日志,看到 E/DEBUG: Process Name: 【包名】 崩溃所在显示是自己的包名(之前没有注意到这个包名是自己游戏的,看走眼了),哦、所以跟小米手机上的某程序没有关系,问题出现应该还是在自己的程序包上面,那么接着分析吧。
地址分析
一般,我们都知道上述日志输出的地址,借助addr2line工具是可以查看映射内容的,那么我们可以找游戏技术给一个带有符号表的libunity.so文件(我之前拿到的是 release 包,我记得 release 包是没有符号表的,所以找游戏技术同学重新给一个具有符号表的)。
使用的是 aarch64-linux-android-addr2line 还是 arm-linux-androideabi-addr2line,根据当前设备 ABI 而定,不然使用命令直接转换会报错,或者得不到正确的结果。
如何使用 adb 查看 ABI:
这两种方式都可以的
adb shell
cat /proc/cpuinfo
adb shell
getprop ro.product.cpu.abi
addr2line 在哪里?需要下载吗?
此工具包含在 ndk 集合里面,之前下载过 ndk 可以在本地查找即可,使用时候选对 ABI 就好。
地址转换
输入
aarch64-linux-android-addr2line -C -f -e libunity.so 000000000066a3a4
aarch64-linux-android-addr2line -C -f -e libunity.so 0000000000669f44
aarch64-linux-android-addr2line -C -f -e libunity.so 0000000000669e94
aarch64-linux-android-addr2line -C -f -e libunity.so 00000000001d1184
aarch64-linux-android-addr2line -C -f -e libunity.so 00000000002cfd80
aarch64-linux-android-addr2line -C -f -e libunity.so 0000000000674f40
aarch64-linux-android-addr2line -C -f -e libunity.so 00000000006813d4
aarch64-linux-android-addr2line -C -f -e libunity.so 0000000000355d48
aarch64-linux-android-addr2line -C -f -e libunity.so 000000000034c5a0
aarch64-linux-android-addr2line -C -f -e libunity.so 000000000034cb80
aarch64-linux-android-addr2line -C -f -e libunity.so 0000000000287020
aarch64-linux-android-addr2line -C -f -e libunity.so 0000000000288974
aarch64-linux-android-addr2line -C -f -e libunity.so 00000000002887c0
aarch64-linux-android-addr2line -C -f -e libunity.so 000000000028872c
aarch64-linux-android-addr2line -C -f -e libunity.so 00000000002df41c
aarch64-linux-android-addr2line -C -f -e libunity.so 00000000000799a4
aarch64-linux-android-addr2line -C -f -e libunity.so 000000000001619c
输出
结果只定位到了一个 UnitySendMessage ,但是没有更具体的行号等,输出存在 ??:?,为啥输出问号这里不探讨,有兴趣再看看。
最后
到这里,猜想一下:
同一个包(同一个 unity 版本出的包)
在 Android 11 及其以下是正常的,到了 Android 12 偶现或者大概率出现崩溃
会不会跟版本有关系?unity 引擎版本和 Android 版本适配问题?
那去 unity 官网看看技术文档或者论坛有没有相关资料:
看到这图,进一步猜想会不会真的是 unity 构建 libunity.so时候出现适配问题?为了进一步验证问题,再拿几个同一 unity 版本出的包在 Android12 (小米 Android12、vivo Android12)上面运行看看,果然还是能复现
'Loading.Preload' 线程崩溃。
我们再进一步验证问题,换一个 unity 版本(升级 unity 版本)出包试试,幸运来了,这次没有崩溃。
不闪退的版本: 不完全统计,目前验证的就这几个
unity 2019.4.33
unity 2019.4.19
unity 2020.3.2f1c1 (64-bit)
闪退的版本:
unity 2020.1.13
就这样临时解决问题吧,问题根源所在还是需要花时间研究的。