…
}
}
注意到两个很关键的地方是logging.println(">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what);
和logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
这两行代码,它调用的时机正好在dispatchMessage(msg)
的前后,而主线程卡也就是在dispatchMessage(msg)
卡住了。
BlockCanary的流程图
(图片来自网络)
BlockCanary就是通过替换系统的Printer来增加了一些我们想要的堆栈信息,从而满足我们的需求。
替换原有的Printer是通过以下方法:
Looper.getMainLooper().setMessageLogging(mainLooperPrinter);
并在mainLooperPrinter中判断start和end,来获取主线程dispatch该message的开始和结束时间,并判定该时间超过阈值(如2000毫秒)为主线程卡慢发生,并dump出各种信息,提供开发者分析性能瓶颈。如下所示: