背景:更新完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查看是否有线程长时间不释放锁