检测机制

#Looper.Java
monitor.println(">>>>>DiapatchingTo")
msg.target.dispatchMesssage(msg)
monitor.println(">>>>>DiapatchingTo")

通过dispatchMesssage的前后时间是否大于1s,如果大于判定为卡顿

Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
        public void doFrame(long frameTimeNanos) {
            
        }
})

每次垂直同步信号发生时会在这里产生回调,一般16ms一次,也可以判断是否卡顿

Thread.currentThread().getStackTrace()[3]获取堆栈调用,可以知道那个方法正在耗时,这个方法不能乱用,因为会阻塞调用的线程

通过延迟调用并在时间阈值内取消的形式来判断卡顿的发生,通过上面的方法获取卡顿的方法

但不准确,因为可能延迟的时候,导致卡顿的方法结束了

获取方法运行时间

第三方库Hogo:侵入性高,功能弱

TraceView:性能开销大

SystemTrace:Trace.beginSection() Trace.endSection()