Matrix 卡顿监控
应用启动流程
Activity启动流程
Handler
卡顿监控
主线程所有执行的任务都在 dispatchMessage 方法中派发执行完成,我们通过 setMessageLogging 的方式给主线程的 Looper 设置一个 Printer ,因为 dispatchMessage 执行前后都会打印对应信息,在执行前利用另外一条线程,通过 Thread#getStackTrace 接口,以轮询的方式获取主线程执行堆栈信息并记录起来,同时统计每次 dispatchMessage 方法执行耗时,当超出阈值时,将该次获取的堆栈进行分析上报,从而来捕捉卡顿信息,否则丢弃此次记录的堆栈信息。
定位卡顿问题
利用Handler完成监控,在抓取堆栈时候,落地存在偏差,对于稍微复杂一点的堆栈,很难找出可能耗时的函数,也就很难找到卡顿的原因。
字节码插桩
对于开发人员,了解字节码可以更准确、直观地理解Java语言中更深层次的东西,比如通过字节码, 可以很直观地看到synchronized、Volatile等关键字如何在字节码上生效,掌握原理。而字节码插桩就是在Class字节码中插入代码。
ASM框架
操作Java 字节码的框架,按照Class文件的格式,解析、修改、生成Class,可以动态生成类或者增强现有类的功能。
正如GSON操作json的框架。
ASM类
ClassReader类:字节码的读取与分析引擎。accpet方法接受一个ClassVisitor ClassVisitor抽象类:访问类解析,如注解解析、方法解析、成员变量解析等。ClassWriter类:实现ClassVisitor接口,可以获得解析结果,不进行任何修改。需要自定义ClassVisitor修改原Class。
MethodVisitor接口:访问方法解析,如方法上的注解、参数、代码等。
所有访问者以接口/抽象类的形式,与被访问对象/数据解耦