Android 卡慢監控組件簡介
1. 功能簡介:
? Android卡慢監控組件,用于監控app在整個使用過程中出現的界面卡頓現象,嘗試還原其中的調用堆棧信息,追蹤代碼來源;
? 以堆棧信息的形式體現出來,附加了CPU使用率做參考;
? 上報到統計平臺,進行聚合排名 。
2. 監控原理:
第一步:
? 利用Looper.getMainLooper().setMessageLogging() 接口;
? Looper源碼如下:
重載println方法 ,可以統計出dispatchMessage的執行耗時情況。
第二步:
使用子線程定期抓取主線程的堆棧調用(圖片中展示了3個消息執行,子線程產生了5次調用堆棧的抓取)。
第三步:
主線程消息執行耗時長的情況發生時,關聯出該時間段的主線程調用堆棧信息。
從上圖可以看出:
1. CPU的信息采集,包括的整個手機的CPU使用率,和自身app的使用率,用于鑒別是否發生其它app搶占CPU使用的情況。
2. T1和T2細分為線程時間和真實時間,用于鑒別是否該線程真的執行慢,還是該線程得不到CPU執行,被其它線程搶占。
3. 查看每次采集的時間點,是否發生過自身監控線程也卡住的情況。
第四步:
上報關聯出的堆棧信息,匯總到后臺進行信息聚合和top排名,上報的樣本越多,top排名的真實度越高,越能反映出用戶的真實卡慢情況;在上報用戶非常大的情況下,一次3秒耗時的消息被監控到的上報數量,理論上是1秒耗時的消息的上報數量的3倍,耗時越長,數量越排前。
3. 監控策略:
? 開發階段自動化測試;
? 灰度用戶全部監控;
? 正式版本小范圍監控,下發開關控制。
4. 統計平臺信息展示:
包含時間,堆棧的第一行聚合,版本,次數,用戶量等基本信息:
5. 卡慢問題分析和解決:
問題主要集中在以下幾塊:
? 主線程進行文件I/O讀寫
– Sharepreference
– SQL操作
– File(image/config)
? 同步鎖等待
? 布局太復雜, 加載過慢
? 算法邏輯執行太慢
? 跨進程等待
? 程序之外的其它卡慢因素影響
– 子進程搶占CPU和I/O
– 其它app搶占CPU和I/O
解決辦法:
? 降低I/O次數,異步寫,讀取看情況異步
? 內存操作鎖和文件操作鎖分開
? 布局拆分,分段加載
? 重構邏輯/算法
? 異步化線程處理
? 避免重復獲取,做好內存緩存
6. 組件的缺陷:
? 單個用戶的定位不太精確;
? 單次監控觸發的堆棧采集, 可能不是真實的問題所在,依賴后臺的信息聚合;
? 但如果一次卡慢關聯到2次堆棧信息(消息執行的時間是堆棧采集間隔的2倍以上),并且堆棧一致,就可以定位到該處堆棧是問題所在;
? 監控本身存在一定的性能消耗;
? 獲取堆棧調用情況,獲取CPU使用率,時間打印等,監控組件需要消耗5%以上CPU資源,視監控間隔而定,間隔越短,CPU使用率越高。
7. 總結:
該組件是一個巧妙利用卡慢時間關聯出抓取堆棧,并由后臺進行聚合的概率統計手法,問題以調用堆棧的信息展示,也是最快的定位手段。組件剛投入項目中就顯著的發現大量問題,并有效解決,收益高。公司內產品:QQ音樂、全民K歌、天天P圖、畫報、企鵝電競,已接入該監控組件,顯著優化了界面卡慢問題。
來自:http://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=2649796870&idx=1&sn=fd911850e32dd955316664c8c4104946&chksm=f1fcc55ec68b4c4865fd7466cc21f5e0b72080a034757613678cd011162858561310513834af&scene=0