性能优化-卡顿检测工具

512 阅读1分钟

卡顿分为两种:一种是掉帧,一种是ANR。 android系统维持每秒60帧的刷新频率,如果我们的界面低于这个帧数,我们就可以认定卡顿发生(掉帧了)。

界面的刷新主要分成三个步骤:

 1、CPU 负责把UI组件计算成多边形或者纹理
 2、OpenGL 负责绘制图像(DisplayList)
 3、GPU栅格化需要显示的内容,并渲染到屏幕上。

Aspectj

 AOP的思想,在方法的执行前& 执行中& 执行后,编译成class文件的时候加入代码。
 适用于性能优化监控时间&数据打点。

Matrix

 微信开源的,有机会再看。

BlockCanary 原理

 利用Looper.loop中的Printer,在handler执行之前打印一个log,执行结束之后又打印一个log,BlockCanary就是利用这个特性,给Looper设置一个自己的Printer,然后检测开始打印&结束打印的时间阈值,超过了则认定ANR发生,打印主线程的堆栈信息&CPU的信息。
 public static void loop() {
         ...
        final Printer logging = me.mLogging;
        if (logging != null) {
            logging.println(">>>>> Dispatching to " + msg.target + " " +
                    msg.callback + ": " + msg.what);
        }
        try {
            msg.target.dispatchMessage(msg);
            dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
        } finally {
            if (traceTag != 0) {
                Trace.traceEnd(traceTag);
            }
        }
        if (logging != null) {
            logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
        }

       ...
    }

 缺点:无法精确定位到具体卡顿发生的代码,只能知道dispatchMessage的这一步代码发生了卡顿。