
1. 功能简介:
• Android卡慢监控组件,用于监控app在整个使用过程中出现的界面卡顿现象,尝试还原其中的调用堆栈信息,追踪代码来源;
• 以堆栈信息的形式体现出来,附加了CPU使用率做参考;
• 上报到统计平台,进行聚合排名 。
2. 监控原理:
第一步:
• 利用Looper.getMainLooper().setMessageLogging() 接口;
• Looper源码如下:
重载println方法 ,可以统计出dispatchMessage的执行耗时情况。
x
第二步:
使用子线程定期抓取主线程的堆栈调用(图片中展示了3个消息执行,子线程产生了5次调用堆栈的抓取)。
第三步:
主线程消息执行耗时长的情况发生时,关联出该时间段的主线程调用堆栈信息。
从上图可以看出:
1. CPU的信息采集,包括的整个手机的CPU使用率,和自身app的使用率,用于鉴别是否发生其它app抢占CPU使用的情况。
2. T1和T2细分为线程时间和真实时间,用于鉴别是否该线程真的执行慢,还是该线程得不到CPU执行,被其它线程抢占。
3. 查看每次采集的时间点,是否发生过自身监控线程也卡住的情况。
第四步:
上报关联出的堆栈信息,汇总到后台进行信息聚合和top排名,上报的样本越多,top排名的真实度越高,越能反映出用户的真实卡慢情况;在上报用户非常大的情况下,一次3秒耗时的消息被监控到的上报数量,理论上是1秒耗时的消息的上报数量的3倍,耗时越长,数量越排前。
3. 监控策略:
• 开发阶段自动化测试;
• 灰度用户全部监控;
• 正式版本小范围监控,下发开关控制。
4. 统计平台信息展示:
包含时间,堆栈的第一行聚合,版本,次数,用户量等基本信息:
5. 卡慢问题分析和解决:
问题主要集中在以下几块:
• 主线程进行文件I/O读写
– Sharepreference
– SQL操作
– File(image/config)
• 同步锁等待
• 布局太复杂, 加载过慢
• 算法逻辑执行太慢
• 跨进程等待
• 程序之外的其它卡慢因素影响
– 子进程抢占CPU和I/O
– 其它app抢占CPU和I/O
解决办法:
• 降低I/O次数,异步写,读取看情况异步
• 内存操作锁和文件操作锁分开
• 布局拆分,分段加载
• 重构逻辑/算法
• 异步化线程处理
• 避免重复获取,做好内存缓存
6. 组件的缺陷:
• 单个用户的定位不太精确;
• 单次监控触发的堆栈采集, 可能不是真实的问题所在,依赖后台的信息聚合;
• 但如果一次卡慢关联到2次堆栈信息(消息执行的时间是堆栈采集间隔的2倍以上),并且堆栈一致,就可以定位到该处堆栈是问题所在;
• 监控本身存在一定的性能消耗;
• 获取堆栈调用情况,获取CPU使用率,时间打印等,监控组件需要消耗5%以上CPU资源,视监控间隔而定,间隔越短,CPU使用率越高。
7. 总结:
该组件是一个巧妙利用卡慢时间关联出抓取堆栈,并由后台进行聚合的概率统计手法,问题以调用堆栈的信息展示,也是最快的定位手段。组件刚投入项目中就显著的发现大量问题,并有效解决,收益高。公司内产品:QQ音乐、全民K歌、天天P图、画报、企鹅电竞,已接入该监控组件,显著优化了界面卡慢问题。
什么😊
44444
Android卡慢监控组件简介Android卡慢监控组件简介
55555555