有两种常用方式
- 360 ArgusAPM类实现方式: 监测Choreographer两次Vsync时间差
- BlockCanary的实现方式:监测UI线程单条Message执行时间
依赖Choreographer VSYNC回调,具体实现如下:循环添加Choreographer.FrameCallback
Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
mFpsCount++;
mFrameTimeNanos = frameTimeNanos;
if (isCanWork()) {
//注册下一帧回调
Choreographer.getInstance().postFrameCallback(this);
} else {
mCurrentCount = 0;
}
}
});
这种监听有个问题就是,监听过于频繁,因为在无需界面刷新的时候Choreographer.FrameCallback还是不断循环执行,浪费CPU资源,对线上运行采集并不友好,相比之下BlockCanary的监听单个Message执行要友善的多,而且同样能够涵盖UI绘制耗时、两帧之间的耗时,额外执行负担较低
方案二:监控单条Message的执行时间
为Looper设置一个LooperPrinter,根据回传信息头区分消息执行开始于结束,计算Message耗时:原理如下
public static void loop() {
...
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
...
if (logging != null) {
logging.println("
关注
打赏