handler回调主线程_GitHub - arthurlang/UIMonitor: 主线程页面性能监控器 * 1、监控主线程耗时消息 2、监控连续动画过程中是否流畅 3、监控静止界面下是否...

UIMonitor (UI主线程卡顿,动画卡顿,连续心跳)

主要功能

1、监控主线程耗时消息

2、监控连续动画过程中是否流畅

3、监控静止界面下是否存在隐藏动画或者handler定时器

异常心跳检测工具类(心跳:定时任务和隐藏动画)

Situation(背景): viewpager嵌套多个Fragment时,Fragment包含一个轮播空间,当Fragment隐藏时,轮播定时器没有被暂停。一些复杂page,重复动画不易被察觉,导致消耗。

Target(目标):App处于后台或前台静止状态时,找出定时执行的task,重复执行的动画,并精确定位到导致卡顿的调用函数报告给开发

Action(行动/做法):

检测心跳:在自动化测试过程中打开,通过Looper中的LoginPrinter回调观察每一条message的类型,通过callback类名可以检测到属于draw类型还是其他类型message。统计5s,1s之内有多少个frame,多少runnable,每1s有稳定的message就说明有隐藏动画

定位错误:

卡顿函数定位:messge耗时超过域值,上报2类调用栈:handler.sendMessage 保存当前线程调用栈。 handler.dispatchMessage延时获取调用栈,类似blockcanary原理

心跳定位:如果有稳定心率,handler.sendMessage 保存当前线程调用栈

Result(结果):精确扫除耗时盲区

参考文献:https://juejin.im/post/684490406 耗时盲区监控线上方案

更新日志:

2020.8.11更新最新29版本;更新成Androidx,支持kotlin 2特殊场景的捕获:

如何检测非UI线程中无用的Looper循环调用(todo:最后有一步没实现)?--获取到每个包含Looper的子线程注册一个printer回调

如果存在心跳的activity不在前台,如何确定是哪个activity?--调用栈有context子类类名

2020.8.23更新:更精准定位卡顿方法:

1:获取卡顿message的正在执行的调用栈

2:获取handler.sendMessageAtTime的调用栈

注意:引入了droidassist插件不支持Androidx,所以取消Androidx了,也可以用其它字节码工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值