记一次 lottie-android导致exoplayer无法播放事故排查

324 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天

公司最新的版本中在底部Tab中需要加入Lottie动画,于是在github上找到了 airbnb开源的lottie-android动画,使用的是最新版本(5.1.1),然后根据使用文档,在项目中接入,测试发现也是正常使用的,

公司的App中有用到了视屏播放器功能,于是使用的是Google开源的Exoplayer播放器,项目接入的比较早,使用的版本是2.9.1,目前最新版本是r2.17.1。

在App版本开发和测试通过后,就发布上线,发布后一天,在App的后台反馈平台,有用户反馈说App内的使用播放画面是黑屏的。 

image.png

由于在之前有用户反馈过该问题,当时通过服务器,拿到了用户上传的适配定位发现是该上传的视屏,视屏帧率有问题,导致Exoplayer在播放的时候发现异常,跳过了帧率解析的问题。

于是这次用户刚开始反馈也把视屏无法播放的问题定位为该问题,没有仔细去和复查。接着在第二天有越来越多的用户反馈说出现视屏无法播放,同时测试这边的手机也出现了这个问题,于是开始重视排查问题。

首先把代码切换到上一个分支,然后编译发现,app能够正常的播放出视屏,于是就基本确定了问题出在刚上线的版本新加的代码上,于是把刚上线的代码的分支,复制出多个分支,然后通过多次回滚定位到是在 build.gradle 文件中 加入了lottie导致的

dependencies {
  implementation 'com.airbnb.android:lottie:$lottieVersion'
}

定位到这里的时候感觉很奇怪,无论在代码中是否使用了lottie,只要是build.gradle文件中有声明了lottie,都会导致Exoplayer无法播放。 同时在 Exoplayer 中添加了播放监听,也没有爆出什么错误信息出来

mExoPlayer.addListener(new Player.EventListener() {
            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playbackState == Player.STATE_READY) {
                    mProgressBar.setVisibility(View.GONE);
                }
            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {
                if (getPlayListener() != null) {
                    getPlayListener().onPlayError();
                }
                mProgressBar.setVisibility(View.GONE);
            }
        });

于是就感觉很纳闷,猜测可能是Exoplayer目前版本低,存在一些bug,所以就把项目中的Exoplayer升级到最新版本r2.17.1,升级完成后,发现视屏还是无法播放。

接着就试下如果把lottie-android的版本改为低一些的版本,看是否可行。 

image.png

查看发现在这个版本修复了好几个bug,而且也相对是一个比较早期的版本 

image.png

把lottie-android改为3.1.0版本后,编译后运行发现视屏能够正常播放,于是就通过测试每次都往高版本去叠加,发现在版本超过4.1.0后,视屏播放器就无法播放视屏,于是就查看了上一个高的版本4.2.0,看看是改了什么会导致Exoplayer无法播放视屏

image.png

发现在pull request 中提到主要修复的是以下问题 

image.png

通过结束,大致问题是在动画播放结束时,会有可能出现恢复到初始状态,解决方法是强制置为100%,播放完成。

看到这里感觉很那份,这个跟Exoplayer视屏无法播放又有什么关系呢,而且这里也是在项目中去使用lottie-android,跟Exoplayer完全打不上边。

目前项目新的版本正在开发中,等开发结束后,还是得花点时间继续排查下,为什么ottie-android会导致Exoplayer视屏无法播放。到时候再更新。

新版本开发完毕,趁着这两天有空就继续排查下真正原因,把lottie-android源码下载到本地

image.png

然后定位到git 上提交的 4.2.0记录的git 位置,通过还原每个提交的版本,然后运行看是否可以播放,最终定位到的问题是 appcompat:appcompat 版本导致的 Exoplayer 无法播放视屏

image.png

lottie-android 使用的appcompat版本号为1.3.1,之前的版本是 1.0.0,然后把 appcompat 改为 1.0.0 编译后,发现Exoplayer可以正常播放,于是把项目中的 appcompat 如果改为 1.3.1 编译后,发现也是不可以播放的,之前项目中 appcompat的版本是 1.2.1 引入了 lottie-android后,appcompat版本就变为 1.3.1。

至于为什么 1.3.1 的appcompat版本会导致Exoplayer无法播放,这个后续有更宽裕的时间,再继续研究下,有知道原因的同学,麻烦告知下