联系人列表滑动卡顿(性能问题)

我是一名Android开发菜鸟
最近新机型适配的时候,测试发现一个问题,就是电话滑动通话记录和切换tab的时候页面会掉帧,导致卡顿,遇事不要慌,先打开谷歌和百度,恩,通过谷歌和百度可知,
导致界面卡顿一般有下面几种情况导致:
1.内存不足 (通过抓trace,我的内存有好多G,排除内存不足)
2.CPU占用(通过命令查看CPU资源占用不高,CPU占用排除)
3.列表布局复杂(我的列表item是一个自定义的view,布局只有一层,排除布局问题)
4.view的onMeasure,onLayout,onDraw做耗时操作(我的自定义view只有简单的参数计算,也排除)
5.binder调用(未知)
等等等…

不管他是哪种情况导致的,一个字,遇到界面卡顿问题,先抓个trace文件.
抓trace文件不建议用SDK里面的systrace.py工具,因为生成的html文件用谷歌浏览器打开可能会报Unable to select a master clock domain because no path can be found from “SYSTRACE” to "LINUX_FTRACE_GLOBAL"异常
所以推荐使用
git clone https://github.com/catapult-project/catapult.git
./catapult/systrace/bin/systrace在这里插入图片描述
获取到trace html文件后,使用谷歌浏览器打开,打开后如下图:在这里插入图片描述

新手看到这基本上会一脸懵逼,不要着急,看不懂的话,可以看看大牛的博客,链接如下:
https://androidperformance.com/2019/07/23/Android-Systrace-Pre/

查看trace文件有几个快捷键
W:放大
S:缩小
A:左移动
D:右移动
跟打游戏差不多,就是多用W

文件里面找到自己项目包名的地方,查看UI Thread,绿色的表示正常的,黄色表示微微卡,红色表示肥肠卡,我现在遇到的就是微微卡,但是为了用户有更好的体验,和自己的前程,微微卡也是不能接受的,将trace文件放大,点击黄色的地方在这里插入图片描述
一眼看过去,一脸懵逼,不懂,只知道有点卡,不知道为啥卡,不着急,接着往下看
其中UI Thread负责绘制,RenderThread负责数据加载,看上面图片,绘制这一帧的数据是准备好了的,所以排除数据加载问题
接着点击黄色F后,下面会有提示如下:在这里插入图片描述

主要看这个sleeping,这个表示该绘制咋们界面的时候,CPU处于sleeping状态,导致咋们的界面没有回执
sleeping:8.476ms,到了这就骚味有点眉目了,就是CPU当前没有在处理咋们的应用,这个时候咋们就要分析为啥CPU没有处理咱们的界面绘制.还是来看trace文件在这里插入图片描述

从上图看出,执行doFrame—>traversal方法后,调用binder,我们都知道,在view绘制的时候是不能有binder调用的,频繁的binder调用就有可能导致界面卡顿,特别是在列表中.这一块就涉及到binder只是了,我对这块不熟悉,不做过多的介绍,想深入了解的可以做下面的电梯进入学习:

https://www.kancloud.cn/alex_wsc/android-deep3/416256

到了这,我们知道了是因为binder调用导致的卡顿,但是充trace文件中,看不出到底是哪个地方触发了binder调用,这时候就有请下一个神器出场,就是Android studio自带的性能分析神器Profiler,不了解这一块的可以坐下面电梯学习

https://developer.android.com/studio/profile/cpu-profiler?hl=zh-cn

在这里插入图片描述

点击record
在这里插入图片描述

然后操作应用卡顿的地方,复现后点击stop,就会生成trace文件,如下在这里插入图片描述

这个文件里面有应用运行时所有的方法调用栈,可以找到binder具体在哪触发的
首先,咱们先选中main线程,然后再右边的搜索binder,我这是知道那个东东导致卡顿,可以直接搜索,不知道的话,还得一个一个方法的看.搜索后把调用栈都点开,发现是popupWindows这个东西触发的,具体调用如下图:

在这里插入图片描述

就是在列表onScollChange的时候触发的,到了这,就可以去看自己代码是怎么实现popupWindows的,我这边popupWindows的显示比较简单,就是在onCreate方法里面创建和显示.日了狗了,到了这一步又不知道怎么弄了,按道理来说,popupWindows不都是这样显示的吗?

最后祭出狗血解决方法:既然是popupWindows导致的,那就干掉他,popupWindows在应用第一次启动的时候显示,只要对应用操作了就dismiss,之前的交互是一直显示的(其实这样的没什么卵用,popupWindows就是一个简单的tip,用户看到了就应该dismiss),卡顿问题完美解决
解决完这个问题后,我深有感触,以后再遇到卡顿问题,
砍需求
砍需求
砍需求

重要的是说三遍

看到大大,如果有哪些错误的,可以知道下,我也是刚入门,班门弄斧,见笑见笑

猜你喜欢

转载自blog.csdn.net/u010471406/article/details/112396336