您现在的位置是:首页 >其他 >记一次Android页面卡顿排查总结网站首页其他

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

慢慢_飞 2024-06-23 06:01:02
简介记一次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查看是否有线程长时间不释放锁

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。