记一次Android页面卡顿排查总结

背景:更新完gosdk(端上的主要逻辑在go层完成)后,冷启动时首页明显会卡一下

问题排查:

1、通过在application onCreate()中设置getMainLooper().setMessageLogging(new LxLogPainter());来查看耗时的日志,没看到耗时日志

2、logcat中查找关键字"Skipped",发现:
2023-05-24 15:08:07.389  1132-1132  Choreographer   com...e.xx.xx  I  Skipped 383 frames!  The application may be doing too much work on its main thread.
说明主线程中确实有耗时操作,但是不知道发生在哪儿

3、查找卡顿时间点之前到日志,发现:
2023-05-24 15:08:06.625  1132-1132  te.xx.xx  com...e.xx.xx W  Long monitor contention with owner Thread-50 (1883) at void lxbadge.Badger.registerPlatformType(int)(Badger.java:-2) waiters=0 in xx.xx.xx.gup.RedDotService xx.xx.xx.gup.RedDotService.getInstance() for 4.927s

从上面的日志发现RedDotService.getInstance()中有耗时操作registerPlatformType(int),看代码,但是是在子线程中执行的,怎么会卡主线程呢?

看代码发现,RedDotService.getInstance()第一次调用的时候在子线程中被调用

然后在执行构造函数时,执行了 耗时操作registerPlatformType(int),大概5s,导致主线程中此时调用RedDotService.getInstance()时处于线程阻塞状态,正是因为以上原因,导致无法通过getMainLooper().setMessageLogging(new LxLogPainter());来查看卡顿日志

 

修改方案:

方法1:将构造函数中判断线程的逻辑删除

方法2:RedDotService.getInstance()第一次不要在线程中执行

总结:

1、通过skipped关键字判断是否有掉帧

2、通过getMainLooper().setMessageLogging(new LxLogPainter());查看卡顿日志

3、可以通过关键字Long monitor contention with owner查看是否有线程长时间不释放锁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值