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

news/2024/11/24 13:47:06/

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


http://www.ppmy.cn/news/76838.html

相关文章

手写vue-watch

一、watch的使用 watch有多重形式,可能是字符串、函数、数组 // 函数形式 数组形式 vm.$watch// 最终调用的都是vm.$watchwatch:{firstname(newValue,oldValue){// 观察者 观察变量改变 执行回调函数console.log(newValue,oldValue)}}vm.$watch(()>vm.firstna…

【C语言】结构体指针

结构体指针 结构体基础知识注意对于成员的赋值 结构体指针指向结构体变量的指针结构体指针与结构体成员指针用结构体指针引用结构体成员 结构体 基础知识 初识结构体,可以先看这篇浅显易懂的文章结构体–基础篇 所谓结构体,是一组类型可以不同的相关变…

games101作业3

作业要求 修改函数 rasterize_triangle(const Triangle& t) in rasterizer.cpp: 在此 处实现与作业 2 类似的插值算法,实现法向量、颜色、纹理颜色的插值。 修改函数 get_projection_matrix() in main.cpp: 将你自己在之前的实验中 实现的投影矩阵填到此处&am…

两个表的亲密接触——连接的原理

平时项目各种实战中,我们必须经常用到连表查询,连表查询那就不可避免的需要知道连接的原理,这样才能更好的使用链表查询。 连接的本质就是把各个链接表的记录都取出来依次匹配的组合加入结果集并返回给用户。 连接查询的结果集中包含一个表…

十一、数据仓库详细介绍(应用)

这是数据仓库详细介绍的最后一篇,后续还会在补充一些,把遗漏的或者没讲清楚的追加进来。 1. 前言 数据仓库是一种数据管理的方法论,理论概念很早就提出来了,而且各个行业都有广泛深入的应用。因此到目前为止该方法论的理论和实践体…

WIFI adb配置方法

在使用adb调试安卓设备过程当中,要使用usb线才能进行调试; 前提: 若计算机和需要调试的安卓设备都支持WiFi网络,便可以使用WiFi 进行adb调试,不再受usb接口或线的束缚 步骤: 1. usb线连接安卓设备到计算…

cmake CMakeLists链接第三方动态库

背景 要把内核的一部分逻辑抽象成动态库,尝试写demo加载的时候一直链接不上,写此帖记录!以及过程中出现的问题原因!!!(见下文tips) 假设我的动态库代码长这个样子: //…

QT课程 QT介绍

QT介绍(了解) Qt是一个基于C开发语言的图形用户界面开发(GUI)框架。界面开发知识Qt的一部分,实际上Qt也可以支持很多其他的功能,比如:网络编程、文件IO、图形图像处理等。 Qt在嵌入式领域最大…