總結
1再姑,非侵入式萌抵,不需要打點,輸出的信息可以精準定位問題到行元镀,主要是監(jiān)控主線程卡頓绍填,在looper的looper方法,給主線程looper設置一個printer栖疑,打點統(tǒng)計handler的dispatchMessage方法執(zhí)行的時間讨永,看是否超過閥值,dump信息遇革。
2卿闹,在dispatchMessage方法前后揭糕,有Printer日志輸出,兩側調用時成對的锻霎。第一次調用記錄時間設置調用標志著角,startDump,第二次stopDump旋恼,記錄時間吏口,恢復標志。
3冰更,第一次調用時产徊,dump堆棧和cpu信息,分別兩個類stackSamper和cpuSamper采樣蜀细。線程執(zhí)行舟铜。公用父類,采樣算法不同审葬。
4深滚,第二次調用時,記錄時間涣觉,并判斷與起始時間差是否超過閥值痴荐,卡頓時通過BlockListener的onBlockEvent回調監(jiān)聽,在工作線程官册,將采樣數(shù)據(jù)封裝一個BlockInfo生兆,寫入LogWriter,就是寫入到一個文件中膝宁,如果開啟走通知欄鸦难,那么將發(fā)出一條通知欄消息。
消息欄由BlockInterceptor完成员淫,實現(xiàn)類DisplayService合蔽,在內部搞一個PendingIntent,通知欄介返。
主要技術點拴事,在dispatchMessage方法的前后,logger方法日志中加入時間和開始以及停止的方法圣蝎。根據(jù)dispatchMessage的時間間隔來判斷是否卡頓刃宵。
任重而道遠