Android-性能优化-10-APM(应用程序性能监控系统)-卡顿

108 阅读2分钟

1 卡顿监控

1.1 启动流程

1.1.1 应用启动流程

image.png

1.1.2 Activity启动流程

image.png

1.1.3 Handler

image.png

image.png

1.2 卡顿监控

主线程所有执行的任务都在 dispatchMessage 方法中派发执行完成,我们通过 setMessageLogging 的方式给主线程的 Looper 设置一个 Printer ,因为 dispatchMessage 执行前后都会打印对应信息,在执行前利用另外一条线程,通过 Thread#getStackTrace 接口,以轮询的方式获取主线程执行堆栈信息并记录起来,同时统计每次 dispatchMessage 方法执行耗时,当超出阈值时,将该次获取的堆栈进行分析上报,从而来捕捉卡顿信息,否则丢弃此次记录的堆栈信息。

image.png

腾讯开源框架: github.com/tencent/mat…

2 字节码插桩

2.1 定位卡顿问题

利用Handler完成监控,在抓取堆栈时候,落地存在偏差,对于稍微复杂一点的堆栈,很难找出可能耗时的函数,也就很难找到卡顿的原因。

image.png

2.2 字节码插桩

对于开发人员,了解字节码可以更准确、直观地理解Java语言中更深层次的东西,比如通过字节码,可以很直观地看到synchronized、Volatile等关键字如何在字节码上生效,掌握原理。而字节码插桩就是在Class字节码中插入代码。

image.png

2.3 ASM框架

操作Java 字节码的框架,按照Class文件的格式,解析、修改、生成Class,可以动态生成类或者增强现有类的功能。正如GSON操作json的框架。

image.png

2.3.1 ASM类

  • ClassReader类:字节码的读取与分析引擎。accpet方法接受一个ClassVisitor
  • ClassVisitor抽象类:访问类解析,如注解解析、方法解析、成员变量解析等。
  • ClassWriter类:实现ClassVisitor接口,可以获得解析结果,不进行任何修改。

需要自定义ClassVisitor修改原Class。

MethodVisitor接口:访问方法解析,如方法上的注解、参数、代码等

image.png

所有访问者以接口/抽象类的形式,与被访问对象/数据解耦

2.3.2 AMS使用

2.3.2.1 引入ASM依赖

image.png

2.3.2.2 准备待插桩Class

image.png

命令:javac -encoding utf-8 xxx.java

2.3.2.3 编码实现

image.png

  • 字节码指令

命令:javap -c xxx.class

插件:ASM ByteCode Viewer(AS4不可用)

image.png

插件:jclasslib Bytecode viewer

image.png

  • 方法签名

image.png

2.3.3 Android实现

2.3.3.1 如何获得所有的class?
2.3.3.1 Android打包流程

image.png

image.png

2.3.3.3 其他场景

热修复

3 打点插桩实战

image.png

image.png