卡顿分为两种:一种是掉帧,一种是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的这一步代码发生了卡顿。