背景
线下卡顿定位卡顿原因 为排查问题提供抓手。
监控主线程卡顿
近期在研究关于 Android 卡顿性能监控,分别验证了两种相对有效的监测方案:
Looper 字符串匹配方案
优势:
实现方案简单,原生API支持,兼容性好,部分机型可能更改这部分代码导致匹配不到,不过可以忽略不计。
Choreographer 帧率检测方案
优势:
能够计算帧率。
不足:
doFrame() 回调在主线程,主线程没消息 时也需要主动注册回调,对性能有一定损耗,同时会采集到一些无用堆栈,例如
Message msg = queue.next();
代表主线程无消息,loop方法阻塞。
采集策略
事件开始 :
开始采集堆栈,并保存在内存中,采集频率为100ms, 阈值为160ms(大致10帧),平均采集到2个堆栈左右。之前定义的80ms(5帧),较为严格,支持可配置。
事件结束:结束时判断是否超过阈值,如果超过阈值则将内存中堆栈信息的落盘,按天存储。
上报处理
- 灰度开启
考虑到量比较大,灰度开启,采用人海战术,服务端解析然后入库,平台展示。
堆栈被混淆需要服务端支持,进行map文件反解析。 - 上报次数限制
每日上报次数限制为10次。
验证效果
- 布局优化 onCreate
- 字符串拼接耗时函数等
参考
cloud.tencent.com/developer/a…
juejin.cn/post/684490…
testerhome.com/articles/17…