ijkplayer适配Android 11以上的版本

播放视频在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 文件中添加: 


  ...

或者更换最新的播放器so包

例如:

适配android11及以上版本的ijkplayer播放器so包-Android文档类资源-CSDN下载

你可能感兴趣的:(音视频,android)