你的 unity 游戏在 Android 12 上可能会崩溃哦!!!

1,794 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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 就好。

image.png

地址转换

输入

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

输出

image.png

结果只定位到了一个 UnitySendMessage ,但是没有更具体的行号等,输出存在 ??:?,为啥输出问号这里不探讨,有兴趣再看看。

最后

到这里,猜想一下:

同一个包(同一个 unity 版本出的包)

在 Android 11 及其以下是正常的,到了 Android 12 偶现或者大概率出现崩溃

会不会跟版本有关系?unity 引擎版本和 Android 版本适配问题?

那去 unity 官网看看技术文档或者论坛有没有相关资料:

image.png

看到这图,进一步猜想会不会真的是 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

就这样临时解决问题吧,问题根源所在还是需要花时间研究的。