播放视频在android11手机上各种闪退的问题,
适配中发现一进入视频播放页面就会崩溃,播放在线视频时崩溃,而本地视频播放正常。崩溃日志如下:
Fatal 14:46:17.826 Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x74bdc3dd18 in tid 4399 (ff_read), pid 1990 (om.lindian.user)
Fatal 14:46:17.912 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Fatal 14:46:17.912 Build fingerprint: 'Xiaomi/venus/venus:11/RKQ1.200928.002/V12.5.13.0.RKBCNXM:user/release-keys'
Fatal 14:46:17.912 Revision: '0'
Fatal 14:46:17.912 ABI: 'arm64'
Fatal 14:46:17.912 Timestamp: 2022-03-16 14:46:17+0800
Fatal 14:46:17.912 pid: 1990, tid: 4399, name: ff_read >>> com.lindian.user <<<
Fatal 14:46:17.912 uid: 14942
Fatal 14:46:17.912 signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x74bdc3dd18
Fatal 14:46:17.912 x0 b4000074bdfa7400 x1 0000000000000001 x2 00000074c37f28b8 x3 0000000000001038
Fatal 14:46:17.912 x4 b4000074bdc3dd18 x5 8080008080800000 x6 feff06fefeff07fe x7 7f7f7f7f7f7f7fff
Fatal 14:46:17.912 x8 0101010101010101 x9 00000000000c99b8 x10 0000000010624dd3 x11 00000c08d3cc3c86
Fatal 14:46:17.912 x12 0000000034155555 x13 0000000000000018 x14 00000c08d3cb18f8 x15 00ffffffffffffff
Fatal 14:46:17.912 x16 00000074d3d29490 x17 00000075f255d2f0 x18 00000074b098c000 x19 00000074c37f28b8
Fatal 14:46:17.912 x20 b4000074bdfa7400 x21 b4000074bca326e0 x22 b4000074bca32680 x23 0000000000000000
Fatal 14:46:17.912 x24 0005da50454339f8 x25 00000074c37f3cc0 x26 00000074c37f3b48 x27 00000000000fc000
Fatal 14:46:17.912 x28 0000000000000001 x29 00000074c37f3c70
Fatal 14:46:17.912 lr 00000074d3ab93b4 sp 00000074c37f2860 pc 00000074bdc3dd18 pst 0000000000001000
Fatal 14:46:17.998 backtrace:
Fatal 14:46:17.998 #00 pc 0000000001918d18 [anon:libc_malloc]
大致一看问题出到了播放器so包上面,这个是App中用到libijkplayer播放器的so文件。
从 Android 11开始,对于64位进程,所有堆分配都具有一个由实现定义的标记,该标记在具有对ARM Top-byte Ignore (TBI) 的内核支持的设备上的指针顶部字节中设置。在回收期间检查该标记时,任何修改此标记的应用都会被终止。对于未来支持 ARM 内存标记扩展 (MTE) 的硬件来说,这是必需的。
所以需要播放器so将指针的顶部字节错误使用部分修改:
指向特定类型的指针将特定于应用的元数据存储在前16个地址位中。
指针的类型转换为双精度,然后又恢复为原来的类型,因此丢失了较低的地址位。
代码计算不同堆栈帧的局部变量地址之间的差异,作为测量递归深度的方法。
因为使用播放器版本过老,升级新版本成本过大,所以使用过渡方案,关闭指针标记功能,在 AndroidManifest.xml 文件中添加:
<application android:allowNativeHeapPointerTagging="false">
...
</application>
或者更换最新的播放器so包
例如: