1.BlockCanary卡顿监控原理
创始人
2024-04-08 07:14:29
0

1.BlockCanary卡顿监控原理

内存监控也能够帮助我们定位到卡顿问题,卡顿的原因有哪些?掉帧 主线程阻塞  ui繁重慢了只是照成卡顿的原因之一 ,并不是只有ui的绘制才会导致卡顿问题,我们的 内存抖动也会照成卡顿 并发锁的竞争也会照成卡顿问题 

 频繁的io操作也会照成卡顿现象

Shared Preference的使用不当也会导致程序出现卡顿 原理是什么?

卡顿监控:

问原理源码 

 

 

 

 

 

 我们程序启动就是靠我们的main方法启动的

 ApplicationThread 继承stub 

aidl 会生成两个类一个是stub 一个是 Proxy Proxy代表了stub的一个代理

ams 持有了应用进程的ApplicationThread 他的代理类Proxy,然后ams使用Proxy去执行我们的stub方法,其实是通过代理类 执行我们的stub方法 也就执行到ApplicationThread 说白了,ams回去执行ApplicationThread里面的方法,那么其中有一个方法叫scheduletaunchactivity SChedueAUICTwActdVity 会调用sendmessage 其实就是发了一个Handler Message 消息 去把我们的activity启动起来,执行activity的oncreate方法 不要求记这个流程 要把这个流程表背下来,只需要知道Android当中的应用里面的 无论是activity的声明周期,还是fragment的生命周期 还是Application的启动,他最终都是通过发一个Handler消息 然后在Handler里面去把我们的这些生命周期的方法去调用起来  写的这些代码都是通过Handler消息,最终都是我们的一个一个的message执行起来的

api 30里设有launch activity msg了 


 

android的api28之后发生了重构 方法名字变了,但最终仍然使用Handler的消息 驱动起来的 代码都是在message处理的时候, 处理message的时候一个一个执行起来的  代码都是通过Handler驱动起来的,这个Handler就是在ActiwityThresd.java 有个H 这个H就是我们的Handler

 

Handler的执行消息是怎么执行的?Handler跟他相关的有Message Messagequeue 

Messagequeue 就是队列  我们一个一个的Message 都在里面 一个一个排队执行的,然后要通过Looper去在Messagequeue当中 去把一个一个消息取出来,然后交给dispatchMessag进行一个分发 最终执行我们的handleMesSag

Looper可以看作一个消息的传递

 Looper方法里面,去从MessageQueue去取消息 他是一个死循环

 把这个MessageQueue取出Message,然后把这个Message进行dispatchMessage去进行执行

 在执行这个消息之前比如这个消息封装的是activity的oncreate方法 在执行oncreate之前,他会去做 他把Message从MessageQueue取出来之后,他要去调用一个Printer的println的方法 会传一个Dispatching to 这样的字符串 给到我们的Printer  在真正执行消息之后 他就又会使用这个logg发一个Finished to  我们可以设置一个自己的Printer 给到我们的looper 给到我们的MessageQueue 然后我们就可以在我们自己的
 

我们只需要判断,如果说 这个println方法执行,然后看他发过来的字符串的内容,如果是以Dispatching to开头的我们就去记录一个当前的时间 然后在接到Finished to 方法 我们也去记录一下当前时间,然后将这两个时间相减我们就得到 193 msg oncreate的方法 执行的耗时

Looper方案

 这就是 (BlockCanary)实现原理,借助的就是handler looper 它可以让我们监控到每一次将dispatchMessage 每一次这个消息执行的耗时,我们的 oncreate方法 点击事件执行的方法 都能够通过looper机制 监听到他的耗时时间

我们的阈值设置为5s,如果两个时差超过了5秒 认为程序出现了卡顿 这时候我们可以利用

Thread#getStackTrace的接口来拿到我们当前卡顿的时候 我们的方法 我们的程序正在执行哪些方法。这就是捕获我们卡顿的时候执行的堆栈信息,从而去分析我们卡顿问题的原因 

 除了(BlockCanary使用handler机制以外,(ArgusAPM支持360的,LogMonitor)依赖的Choreographer编舞者模块

 

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...