1 卡顿监控
1.1 启动流程
1.1.1 应用启动流程
1.1.2 Activity启动流程
1.1.3 Handler
1.2 卡顿监控
主线程所有执行的任务都在 dispatchMessage 方法中派发执行完成,我们通过 setMessageLogging 的方式给主线程的 Looper 设置一个 Printer ,因为 dispatchMessage 执行前后都会打印对应信息,在执行前利用另外一条线程,通过 Thread#getStackTrace 接口,以轮询的方式获取主线程执行堆栈信息并记录起来,同时统计每次 dispatchMessage 方法执行耗时,当超出阈值时,将该次获取的堆栈进行分析上报,从而来捕捉卡顿信息,否则丢弃此次记录的堆栈信息。
腾讯开源框架: github.com/tencent/mat…
2 字节码插桩
2.1 定位卡顿问题
利用Handler完成监控,在抓取堆栈时候,落地存在偏差,对于稍微复杂一点的堆栈,很难找出可能耗时的函数,也就很难找到卡顿的原因。
2.2 字节码插桩
对于开发人员,了解字节码可以更准确、直观地理解Java语言中更深层次的东西,比如通过字节码,可以很直观地看到synchronized、Volatile等关键字如何在字节码上生效,掌握原理。而字节码插桩就是在Class字节码中插入代码。
2.3 ASM框架
操作Java 字节码的框架,按照Class文件的格式,解析、修改、生成Class,可以动态生成类或者增强现有类的功能。正如GSON操作json的框架。
2.3.1 ASM类
- ClassReader类:字节码的读取与分析引擎。accpet方法接受一个ClassVisitor
- ClassVisitor抽象类:访问类解析,如注解解析、方法解析、成员变量解析等。
- ClassWriter类:实现ClassVisitor接口,可以获得解析结果,不进行任何修改。
需要自定义ClassVisitor修改原Class。
MethodVisitor接口:访问方法解析,如方法上的注解、参数、代码等
所有访问者以接口/抽象类的形式,与被访问对象/数据解耦
2.3.2 AMS使用
2.3.2.1 引入ASM依赖
2.3.2.2 准备待插桩Class
命令:javac -encoding utf-8 xxx.java
2.3.2.3 编码实现
- 字节码指令
命令:javap -c xxx.class
插件:ASM ByteCode Viewer(AS4不可用)
插件:jclasslib Bytecode viewer
- 方法签名
2.3.3 Android实现
2.3.3.1 如何获得所有的class?
2.3.3.1 Android打包流程
2.3.3.3 其他场景
热修复