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

公司最新的版本中在底部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无法播放,这个后续有更宽裕的时间,再继续研究下,有知道原因的同学,麻烦告知下

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lottie-web是一个开源的JavaScript库,用于在Web上渲染和播放Lottie动画。Lottie动画是由Adobe After Effects创建的矢量动画,可以使用Bodymovin插件导出为JSON格式,然后在网页上使用lottie-web库进行渲染和播放lottie-web库提供了很多功能和选项,以便开发者可以根据自己的需求使用和定制动画。它可以用于创建交互式的动画效果,如按钮的点击动画、加载动画、进度条动画等。此外,它还支持设置动画的循环次数、播放速度、淡入淡出效果等。 在使用lottie-web时,我们需要引入相关的CSS和JavaScript文件,并通过HTML的canvas元素来创建动画的容器。然后,我们可以使用lottie.loadAnimation()方法来加载并初始化动画,在loadAnimation()方法中,我们可以传入一些参数,如JSON文件路径、容器元素、循环次数等。 一旦动画加载完成,我们就可以使用lottie.play()方法来播放动画,使用lottie.stop()方法来停止动画。此外,还有一些其他的方法,如lottie.pause()方法暂停动画,lottie.setSpeed()方法设置播放速度等。 值得一提的是,lottie-web还支持事件监听,我们可以通过lottie.addEventListener()方法来监听动画的各种事件,如动画加载完成、播放完成等,以便于我们在合适的时机进行相应的处理。 总之,lottie-web文档提供了全面的使用说明和示例代码,可供开发者参考和学习。使用lottie-web,我们可以轻松地在Web上使用Lottie动画,为网页添加更加生动和有趣的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值