总结
1,非侵入式,不需要打点,输出的信息可以精准定位问题到行,主要是监控主线程卡顿,在looper的looper方法,给主线程looper设置一个printer,打点统计handler的dispatchMessage方法执行的时间,看是否超过阀值,dump信息。
2,在dispatchMessage方法前后,有Printer日志输出,两侧调用时成对的。第一次调用记录时间设置调用标志,startDump,第二次stopDump,记录时间,恢复标志。
3,第一次调用时,dump堆栈和cpu信息,分别两个类stackSamper和cpuSamper采样。线程执行。公用父类,采样算法不同。
4,第二次调用时,记录时间,并判断与起始时间差是否超过阀值,卡顿时通过BlockListener的onBlockEvent回调监听,在工作线程,将采样数据封装一个BlockInfo,写入LogWriter,就是写入到一个文件中,如果开启走通知栏,那么将发出一条通知栏消息。
消息栏由BlockInterceptor完成,实现类DisplayService,在内部搞一个PendingIntent,通知栏。
主要技术点,在dispatchMessage方法的前后,logger方法日志中加入时间和开始以及停止的方法。根据dispatchMessage的时间间隔来判断是否卡顿。
任重而道远
网友评论