Skip to content

title: 效能監控 author: 書蟲 tags:

  • 工作記錄 categories:
  • 工作 date: 2021-01-13 15:18:00

DoKit效能監控實現原理

一、方法耗時檢測

二、Activity頁面啟動耗時

三、CPU使用率檢測

四、記憶體檢測

五、幀率檢測

六、記憶體洩露

七、卡頓檢測

獲取App啟動耗時

使用ASM庫插樁的方式,監聽Application的宣告週期回撥

  1. 在如下兩個方法呼叫中分別記錄一個時間戳,根據兩個時間戳就可以計算出啟動耗時。

onMethodEnter  -> recodeObjectMethodCostStart

onMethodExit -> recodeObjectMethodCostEnd

獲取記憶體Memory大小

https://blog.csdn.net/logan676/article/details/107107068

獲取FPS幀率

幀率監控從API 16+開始支援

監聽Choreographer.FrameCallback#doFrame方法。系統每次繪製的時候都會回撥doFrame方法,透過主執行緒handler每隔一秒種發一個runnable訊息,訊息中執行#doFrame,使用計時器累加重新整理次數就可以計算出幀率。

卡頓檢測

檢測卡頓的原理是:

監控主執行緒訊息佇列,訊息佇列處理訊息時會列印日誌,透過前後兩次列印日誌的間隔和閾值比較即可檢測出是否出現卡頓。

檢測卡頓的原理官方解釋是這樣的:a log message will be written to printer at the beginning and ending of each message dispatch, identifying the target Handler and message contents.

給主執行緒的訊息佇列設定日誌列印類 Looper.getMainLooper().setMessageLogging(mMonitorCore) 訊息佇列處理訊息時,每隔300ms採集一次堆疊資訊,子執行緒中採集 採集堆疊資訊方法,見下方程式碼塊 卡頓閾值:200ms,該值可以修改成符合實際情況的值(欄位:BLOCK_THRESHOLD_MILLIS) 資訊卡頓通知,略 卡頓列表最多收集50條資料,超過之後把index=0的擠掉

小結:其實訊息的開始、結束日誌一直在收集,只不過當檢測出卡頓之後才把這條資訊的日誌當成卡頓日誌記錄下來。

檢測UI層級

根據activity獲取DecorView,遞迴遍歷子view,直到子view是View型別返回

遞迴的層級就是該子View的層級號layerNumber

計運算元View在螢幕上的位置

計運算元view的id,但是我這裡使用時發現view.getId一直是-1,這個問題待查。

子View繪製耗時,未實現。所以暫時無法計算出子View的繪製時間。

不過層級結構應該是準的,我數了一下ActivityBookShelf有20層,和收集的資料匹配。

ActivityBookShelf層級結構20層

函式耗時原理

https://juejin.im/post/6844904154624688136

Activity啟動耗時統計方案 https://juejin.im/post/6844903935912722439

位元組碼插樁

位元組碼插樁採坑筆記      https://juejin.im/post/6844903573331902472

【Android】函式插樁(Gradle + ASM)   https://www.jianshu.com/p/16ed4d233fd1

後續規劃

修復記憶體洩露

ANR檢測

效能監控平臺可以全面覆蓋iReader的各項效能表現了,除了ANR檢測。 目前開發階段的ANR檢測還停留在測試同學主動報告的層次,線上的ANR也只是在BETA階段檢測,覆蓋的範圍有限。

其實最佳化完其他效能指標之後,ANR的問題就會成為iReader的效能瓶頸,需要一套檢測上報機制。

而效能監控平臺的服務端很適合儲存、展示上報的這些ANR資料。 使用ASM庫具備了插樁能力之後,就可以進行全域性無痕埋點開發了。

效能監控平臺支援的功能

客戶端DoKit功能介紹 客戶端專案地址 git@192.168.6.99:android_ireader/dokit.git

支援的客戶端型別

安卓端 ios端(未整合) 微信小程式(未整合)

一、常用工具

  • App資訊檢視: 快速檢視手機資訊,App 基礎資訊、簽名相關、許可權資訊的渠道,避免去手機設定查詢或者檢視專案原始碼的麻煩;
  • 開發者選項: 一鍵跳轉開發者選項,避免安卓由於平臺差異導致的入口不一致(Android獨有)
  • 模擬弱網: 限制網速,模擬弱網環境下App的執行情況。(android獨有)
  • 本地語言: 一鍵跳轉本地語言,避免安卓由於平臺差異導致的入口不一致
  • 沙盒瀏覽: App 內部檔案瀏覽的功能,支援刪除和預覽, 並且能透過 AirDrop 或者其他分享方式上傳到 PC 中,進行更加細緻的操作;
  • MockGPS: App 能定位到全國各地,支援地圖地位和手動輸入經緯度;
  • Crash檢視: 方便本地列印出出現 Crash 的堆疊;
  • 清除本地資料: 一鍵刪除沙盒中所有資料;
  • DBView: 透過網頁方便快捷的操作應用內資料庫,讓資料庫的除錯變得非常優雅;
  • Lumberjack: 每一條 CocoaLumberjack 的日誌資訊,都在在 App 的介面中顯示出來,再也不需要匯出日誌這麼麻煩;(iOS獨有)
  • 子執行緒UI: 快速定位哪一些 UI 操作在非主執行緒中進行渲染,避免不必要的問題;(iOS獨有)
  • NSLog: 把所有 NSLog 資訊列印到UI介面,避免沒有開發證書無法除錯的尷尬;

二、業務功能區

開發者:張寶全

業務專區目前有8個功能:

  1. 頁面路徑:以浮窗的形式顯示當前介面所在的位置,是主工程還是外掛,若是外掛,則顯示當前外掛名稱,同時表明當前介面所在的路基資訊。

  2. APP資訊:顯示當前APP的基本資訊,手機硬體、系統資訊

  3. 外掛資訊:顯示當前已經安裝的所有外掛資訊

  4. 任務檢視:根據任務號,可檢視當前任務資訊,例如輸入:9,可以檢視9號任務資訊。

  5. DG設定:跳轉DG設定介面

  6. 日夜切換:日夜間切換的入口,方便除錯(後續支援暗色切換)

  7. 廣告輔助:可以檢視當前廣告總排期,設定當前開屏廣告的冷、熱啟動間隔時間

  8. 任意門:

  • 支援APP 內任意跳轉 ,可配置跳轉任意外掛。

  • 支援H5跳轉,支援手動輸入任意H5連結、二維碼掃描連結,任意跳轉應用內、外。

  • 支援DeepLink 跳轉。

後續支援:

1、支援自定義ADB 命令執行。

2、支援掌閱基本彈窗樣式示例。

3、介面資料記錄(例如記錄最近二十次網路資料的請求引數、結果等)方便追查測試階段由介面資料異常導致的問題。

三、效能檢測

幀率: App 幀率資訊提供波形圖檢視功能,讓幀率監控的趨勢更加明顯; CPU: App CPU 使用率資訊提供波形圖檢視功能,讓 CPU 監控的趨勢更加形象; 記憶體: App 記憶體使用量資訊提供波形圖檢視功能,讓記憶體監控的趨勢更加鮮明; 流量監控: 攔截 App 內部流量資訊,提供波形圖展示、流量概要展示、流量列表展示、流量篩選、流量詳情,對流量資訊統一攔截,成為我們 App 中自帶 "Charle:"; 卡頓: 鎖定 App 出現卡頓的時刻,列印出對應的程式碼呼叫堆疊; 大圖檢測: 透過流量監測,找出所有的大小超標的圖片,避免下載大圖造成的流量浪費和渲染大圖帶來的CPU消耗。 啟動耗時: 無侵入的統計出App啟動過程的總共耗時; UI層級檢查: 檢查出每一個頁面中層級最深的元素; 函式耗時: 從函式級別分析app效能瓶頸; 記憶體洩漏: 找出App中所有的記憶體洩漏的問題。(支援iReader的Fragment記憶體洩露檢測) 資料Mock: App介面Mock解決方案,提供一套基於App網路攔截的介面Mock方案,無需修改程式碼即可完成對於介面資料的Mock。 健康體檢: 一鍵式操作,整合DoKit多項工具,資料視覺化,快速準確定位問題,讓你對app的效能瞭如指掌: Load: 找出所有的Load方法,並給出耗時分析;(iOS獨有)

四、視覺工具

顏色吸管: 方便設計師 UI 捉蟲的時候,檢視每一個元件的顏色值是否設定正確; 元件檢查: 可以抓取任意一個UI控制元件,檢視它們的詳細資訊,包括控制元件名稱、控制元件位置、背景色、字型顏色、字型大小; 對齊標尺: 參考 Android 系統自帶測試工具,能夠實時捕獲螢幕座標,並且可以檢視元件是否對齊; 元素邊框線: 繪製出每一個 UI 元件的邊框,對於元件佈局有一定的參考意義。

五、Weex專項工具(CML專項工具)(暫未整合)

console日誌檢視: 方便在端上檢視每一個Weex檔案中的console日誌,提供分級和搜尋功能; storage快取檢視: 將Weex中的storage模組的本地快取資料視覺化展示; 容器資訊: 檢視每一個開啟的Weex頁面的基本資訊和效能資料; DevTool: 快速開啟Weex DevTool的掃碼入口。

六、微信小程式專項工具(暫未整合)

支援微信小程式效能檢測

七、效能最佳化平臺的後續規劃

修復記憶體洩露 升級Glide版本到4.9.0 支援Fragment生命週期檢測,關閉Fragment時及時回收記憶體 ANR檢測 效能監控平臺可以全面覆蓋iReader的各項效能表現了,除了ANR檢測。 目前開發階段的ANR檢測還停留在測試同學主動報告的層次,線上的ANR也只是在BETA階段檢測,覆蓋的範圍有限。 其實最佳化完其他效能指標之後,ANR的問題就會成為iReader的效能瓶頸,需要一套檢測上報機制。 而效能監控平臺的服務端很適合儲存、展示上報的這些ANR資料。 使用ASM庫具備了插樁能力之後,就可以進行全域性無痕埋點開發了。

服務端DoKit功能介紹

開發者:張政

web端專案地址:git@192.168.6.99:android_ireader/DokitWeb.git

服務端專案地址:git@192.168.6.99:android_ireader/DokitServer.git

管理後臺地址:http://www.maam.work/#/detail

服務端支援以下客戶端型別上報的資料

安卓端 ios端(未整合) 微信小程式(未整合) 服務端可以檢視的功能介紹

v1.0.0版本只支援健康體檢功能。開啟管理後臺之後,效果如下圖所示。

列表中每一條資料展示了特定的一臺測試機上傳的效能引數資料。點選右邊的操作按鈕可以檢視詳情。詳情裡包含了健康體檢的功能,詳細介紹見下文條目一。

目前健康體檢資料只支援安卓客戶端上報,客戶端程式碼分支:feature/7.35.0_apm。

目前該功能還在分支上,供感興趣的同學體驗,後續會合併入develop分支。

客戶端效能資料上報的頻率目前是1小時一次。時間間隔不能太短,否則造成手機的效能資料不全面。上傳成功之後會自動刪除快取,避免重複上傳。

目前部分功能是關閉的,比如記憶體洩露檢測、啟動耗時等,關閉的原因是為了避免對測試同學的正常測試產生干擾。

記憶體洩露檢測、啟動耗時等效能可以自行開啟使用。

一、健康體檢功能

1)啟動時長檢視 :檢視app啟動方法耗時

2)幀率 : 檢視app啟動過程中幀率變化情況

3)cpu執行狀況:檢視手機cpu佔用情況

4)網路請求流量情況:檢視介面消耗流量

5)記憶體執行狀況:檢視app執行時記憶體變化

6)頁面執行時長:檢視使用期間頁面停留時長

7)大檔案列表:檢視app存在的大檔案

二、後續規劃

展示接入效能監控的裝置資訊列表 資料Mock模組 賬號許可權管理 基於上傳的資料生成效能指標月報,檢視效能最佳化的走勢