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编舞者模块
上一篇:【ROS】机械人开发一--树莓派安装ubuntu18.04
下一篇:3.35 OrCAD中怎么产生Cadence Allegro的第一方网表?OrCAD软件输出Cadence Allegro第一方网表报错时应该怎么处理?