android业界各家卡顿检测工具不同,主要分几类:
-
注册printer callback
-
注册Choreographer callback
-
MessageQueue插入空Message
-
字节码插桩
产品 | 原理 | |
注册printer callback | BlockCanary、BlockCanaryEx、ArgusAPM(360) | 监听每一条消息的耗时,Android System提供了一个Printer接口,通过Looper.getMainLooper().setMessageLogging 注册,主线程执行Message前后都进行一次回调Printer接口 |
注册Choreographer callback | Tinydancer,微信广研院 | Choreographer在收到Vsync信号时会执行frameCallback,所以调用mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION注册frameCallbck来监听相邻2帧执行的耗时 |
MessageQueue插入空Message | 华为荣耀、QQ空间卡慢组件 | 启动子线程,在子线程中以固定频率(如1s)轮询,轮询时向主线程抛入1条空消息。轮询定时器触发时,若MessageQueue中空消息没执行,就报1 s卡顿抓栈。如果已执行完,就再抛出空消息。可以抛出多种时长的定时器一起轮询,就能检测到各种卡顿时长 |
字节码插桩 | Matrix TraceCanary(微信) | 在Gradle编译字节码时会利用ASM插入埋点,新编写一个Gradle plugin,在app执行 transformClassesWithDexTask时会调用plugin,将全局 class 文件作为输入,扫描所有 class 文件中的方法并进行插桩 |
但是车机上和手机上需求不同:
- 车机屏幕大,用户使用频率不高,因此流畅度容忍度高于手机
- 车机厂商要开发的app很多,因此如果各个app都有卡顿检测工具,性能差
基于以上需求,我们自研了主线程绘制UI卡顿检测工具,因为系统在手,就把卡顿检测统一放在Framework实现,app再也不用担心卡顿了,一劳永逸
原理也是基于MessageQueue插入空Message,但性能好与华为的BlockDetector和BlockCanary,具体检测原理有辛苦可以评论或私信我
各家优缺点:
产品 | 原理 | 定位卡顿调用栈精度 | 性能消耗 | 集成方式 | 有没有deamon线程 |
---|---|---|---|---|---|
BlockCanaryEx | printer+javaAsssit插桩 | 高 | 高 | App | 是 |
Tinydancer | Choreographer | 低 | 低 | App | 否 |
TraceCanary(matrix) | asm插桩+高效采集耗时函数算法 | 高 | 低 | App | 否 |
华为、QQ空间卡慢组件 | 抛入空Message | 中 | 低 | App | 是 |
UIBlockMonitor | 抛入空Message | 中 | 超级低 | framework | 是 |