Crash排查系列第七篇|记一次mp4无法播放问题排查

104 阅读2分钟

背景: 新版包打release包后启动mp4 不可用。

新版本release包异常
新版本debug包正常
老版本release包正常
新版本debug包正常

新老apk解压后对比 大小 md5均一摸一样。

apk调试

是不是代码逻辑没走到呢,release包是非debugable,混淆过的。很多时候我们只能通过打日志的方式排查问题。但多少有点不方便。本地配置好环境后我们是可以通过smali调试去定位问题的,具体可以参考我的另一篇文章juejin.cn/post/721518…

image.png

image.png

image.png

开启视频的代码流程都正常,但是走到了VideoView的error回调里面 并且回掉了一些错误码,各种search后无果。

media调试

上面只拿到错误码 但是不知道哪里抛出来的 那就继续调试看哪里抛出的。

通过上面堆栈是用MediaPlayer的mEventHandler 发送了消息,在mEventHandler消息发送处打上断点定位到了postEventFromNative ,这个方法是从native 调用的

image.png

继续调试native部分,发现错误是通过binder IPC抛过来。先停下来,反过来怀疑是设置到media的视频资源有问题。

image.png

资源设置调试

Mediaplayer本地设置资源的堆栈如下,果然是这里抛出了异常,而老版本是正常的,初步定位这里出现了问题。

image.png

为什么会报错呢,继续调试。在下面过程中抛出异常openFileDescriptor返回的fd<0

image.png

  1. 有问题的版本。

image.png

  1. 没有问题的版本

image.png

对比了两个版本,发现资源被压缩了。ApkAssets::Open 里有这样的逻辑 如果method=8就返回_CompressedAsset,否则返回_FileAsset 而_CompressedAsset没有复写openFileDescriptor方法 直接返回了-1 。那如果用这个api 打开压缩文件都会报错。 反过来看了下方法注解果然如此。

image.png

视频无法播放的原因找到了,就是因为新版本release打包的时候把视频文件压缩了。而我们apk解压对比的时候默认做了解压缩导致这时候我们看到的资源是一样的, 接下去就是要找出新版本release打包为什么把mp4压缩了。