加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Android 中的“靠山无效动画“举动说明

发布时间:2019-10-25 10:57:56 所属栏目:业界 来源:Gracker
导读:当一个 Android App 退到靠山之后,只要他没有被杀死,那么他做什么工作各人都不要稀疏,由于这就是 Android。可是当用户知道一个你一个 App 退到靠山之后还在一连做无效的动画,而这个动画完满是有时义的,并且用户还不知道他在做动画,耗损用户那可怜的
副问题[/!--empirenews.page--]

当一个 Android App 退到靠山之后,只要他没有被杀死,那么他做什么工作各人都不要稀疏,由于这就是 Android。可是当用户知道一个你一个 App 退到靠山之后还在一连做无效的动画,而这个动画完满是有时义的,并且用户还不知道他在做动画,耗损用户那可怜的电量的时辰,轻则被多使命杀掉,榨取靠山运行,重则直接卸载。

一样平常的开拓者很难发明这个题目,可是假如你常常行使 Systrace ,多开几十个应用然退却回到桌面,阁下滑动抓取 Systrace ,就可以很轻易发明,总有那么几个靠山的应用,还在频仍地做无效的动画。

这里说的靠山做动画,指的是因为某种缘故起因,应用在退到靠山之后,用户看不到任何这个 App 界面的时辰,他如故在靠山不绝地更新,淹灭 CPU。引起这个题目的缘故起因也许有许多几何个,事实 往 Choreographer 扔 CALLBACK_ANIMATION 的处所太多了,并且每个应用也许都纷歧样,但最终照旧必要各个应用去做修复

下面我们就以两个实例,从技能的角度来看一下变乱产生时辰的环境和缘故起因,但愿看到这篇文章的开拓者,搜查一下本身的应用是否有这个题目,有则改之,无则恭喜

实例 - 网易消息

我们在行使网易消息后,将网易消息退到靠山,然后阁下滑动桌面,抓 Systrace 来看:

网易消息到靠山之后还在一连做 Animation 的回调(红框内),每一帧都照旧在 doFrame 操纵

Android 中的“靠山无效动画“举动说明

放大每一个 doFrame 来看,Choreographer 中的 input 和 traversal 都没有触发,只有 animation 的回调一向在执行

Android 中的“靠山无效动画“举动说明

我们把这份 Trace 上的 cpu 部门全选,然后下面凭证 Wall Duration 排序,可以发明网易消息靠山动画执行时刻最长。应用已经在靠山且不行见的时辰,还在这么频仍地事变,占用 CPU 资源,耗损电量,其实是不该该

Android 中的“靠山无效动画“举动说明

抓对应的 MethodTrace 来看,就是在做动画,没有举办封锁 ,动画仍旧在每一帧举办 onAnimationUpdate 的回调 ,可以看到这里是由于行使了 Airbnb 的 Lottie 库导致的,动画没有封锁,以是照旧一向在做触发

Android 中的“靠山无效动画“举动说明

实例 - QQ音乐

启动 QQ 音乐,然后回到桌面, 阁下滑动桌面并抓取 Systrace 和 MethodTrace ,可以看到跟上面的网易消息的示意同等

Android 中的“靠山无效动画“举动说明

抓取了 QQ 音乐的靠山动画时辰的 MethodTrace 发明,也是因为退到靠山之后,没有停息动画导致的,也是 Airbnb 的 Lottie 的锅, 并且 QQ 音乐有三个动画没有遏制,比网易消息还要严峻一些

Android 中的“靠山无效动画“举动说明

放大后可以看到

Android 中的“靠山无效动画“举动说明

虽然也不是每一个都是 Airbnb 的 Lottie 动画库引起的,好比下面这个,就是平凡的动画没有竣事

Android 中的“靠山无效动画“举动说明

基础缘故起因

基础缘故起因是应用在不行见之后,没有将动画停息,导致应用切换到靠山之后,依然在革新动画的回调,但此时因为是不行见的,不会触发 Input Callback 和 draw Callback ,以是也不会有任何的绘制操纵,也就是嗣魅这个 Animation 的革新完满是没故意义的(虽然也有也许是营业需求?)

上面两个例子内里,网易消息和 QQ 音乐都是由于行使了 Lottie 来实现动画,可是没有正确的封锁导致的。

开拓提议

Lottie 库的 issue 列表内里有人提到了这个环境:

提出题目:

  • I recently did some benchmarking on an app which uses lottie to do some animations (autoplay and looping). I noticed that there is quite some CPU usage when the app is in the background and tried to investigate.
  • It seems to me looping animations do not pause/stop when the containing LottieAnimationView is off screen, and/or the Activity is paused.
  • I believe this is due to the cleanup code being only in onDetachedFromWindow() which is not necessarily being called once the Activity goes into a paused state and most definitely not, when the view is simply not visible (GONE, INVISIBLE ) anymore.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读