MTHawkeye:美圖開源的 iOS 除錯輔助、效能優化工具集
MTHawkeye 是美圖 iOS 團隊在使用的除錯輔助、效能優化輔助工具集,旨在幫助 iOS 開發者提升開發效率、輔助優化效能體驗。
在產品開發週期內,我們引入 MTHawkeye 來幫助我們更快的發現、查詢、分析、定位、解決問題:
- 開發階段,側重於開發除錯輔助,及時偵測問題,並在必要時提示開發者及時處理
- 測試階段,側重於根據測試場景,收集儘可能多的資料,用於自動化測試分析報告
- 線上階段,側重補充傳統 APM 元件缺失,但自身業務需要收集的一些效能資料
作為美圖內部日常使用的基礎工具,現將其開源,期待後續有更多實用的外掛以幫助開發者提高效率,更便捷的優化 App 的效能。歡迎 Star,提交 Issue 和 PR,也歡迎外部獨立的元件接入到 MTHawkeye 中。
MTHawkeye 包含了哪些功能
MTHawkeye 簡單可分為上中下三層,除了最下面的 基礎層
外,中間為 UI 基礎層
,最上層的各個外掛內部根據不同場景做了職責拆分,應用可根據自己的需要接入。
基礎層
主要提供了外掛管理能力,儲存能力和一些基礎工具類。
UI 基礎層
則提供了開發、測試階段使用的介面層骨架,包含了懸浮窗、主介面框架和設定面板,外掛可以整合到其中。
MTHawkeye 上層的功能外掛主要以效能偵測外掛為主,也引入並改進了 FLEX 作為除錯輔助的一個外掛,應用接入 MTHawkeye 時可自定義增改自己需要的外掛。內建的外掛根據關注點分成了 Memory
, TimeConsuming
, Energy
, Network
, Graphics
, Storage
, Utility
幾個類別。
1. Memory Plugins
# LivingObjectSniffer
LivingObjectSniffer
主要用於跟蹤觀察 ViewController 直接或間接持有的物件,以及自定義 View 物件,偵測他們是否異常存活,比如記憶體洩露、未及時釋放或者不必要的記憶體快取。
在開發、測試階段,偵測到的異常情況可以以浮窗警告、Toast 的形式提示開發、測試人員。自動化測試時也可以直接提取記錄的存活物件做進一步的分析判斷。
# Allocations
Allocations
類同於 Instrument 的 Allocations 功能,跟蹤應用實際分配的記憶體詳情,在應用記憶體使用異常(異常上升、OOM 退出)時可以通過記錄的記憶體使用詳情資料,來排查記憶體使用問題。
開發、測試階段使用演示:
自動化測試、線上階段接入後,可以持續的跟蹤自動化用例、使用者場景的實際記憶體使用情況。
2. TimeConsuming Plugins
# UITimeProfiler
UITimeProfiler
用於輔助主執行緒耗時任務的優化。內部分成了 VC Life Trace
和 ObjC CallTrace
兩部分。 VC Life Trace
用於跟蹤開啟 ViewController 各個階段的具體時間點, ObjC CallTrace
在開啟後,則可跟蹤耗時大於指定閾值的 Objective-C 方法,類同於 Instrument 的 Time Profiler 功能。
介面層部分將兩部分的資料合併展示,便於開發者更便捷的找出關注流程的耗時資訊,示例如下:

自動化測試、線上階段接入後,無需埋點或插入其他程式碼,即可持續的跟蹤啟動耗時、頁面開啟耗時和其他關鍵流程耗時。
# ANRTrace
ANRTrace
用於捕獲卡頓事件,同時取樣卡頓發生時的主執行緒呼叫棧
# FPSTrace
FPSTrace
用於跟蹤介面 FPS 以及 OpenGL 重新整理繪製 FPS,並在浮窗上顯示當前值
3. Energy Plugins
# CPUTrace
CPUTrace
用於跟蹤 CPU 持續高使用率,同時記錄高使用率期間主要呼叫了哪些方法。
4. Network Plugins
# Network Monitor
NetworkMonitor
監聽記錄 App 內 HTTP(S) 網路請求的各個階段耗時,並提供內建的記錄檢視介面,便於開發者排查優化網路問題。
- 繼承自
FLEX
的網路請求記錄,過濾搜尋。同時優化監聽初始化邏輯,大幅減少對啟動時間的影響 - 針對 iOS 9 後的
NSURLSession
的請求,增加記錄URLSessionTaskMetrics
方便檢視請求各個階段的時間 - 基於
URLSessionTaskMetrics
增加類似 Chrome 網路除錯的 waterfall 檢視,方便檢視網路的先後和同時併發的請求 - 增加重複網路請求的偵測
- 增強搜尋欄,支援多條件搜尋(域名篩選、重複請求、url 過濾、status 過濾)
- 記錄展示完整的網路請求記錄(增加 request headers, request body, response body 記錄)
# Network Inspect
NetworkInspect
外掛基於 Network Monitor,根據記錄的網路請求實際情況,偵測是否有可改進優化的項,上層可以自定義自己的規則。
5. Graphics Plugins
# OpenGLTrace
OpengGLTrace
用於跟蹤 OpenGL
資源記憶體佔用情況,輔助發現 OpenGL API 錯誤呼叫、異常引數傳遞。
OpenGL
渲染引擎在除錯上十分不方便,儘管 Xcode 提供了 Frame Capture 的 OpenGL ES 除錯工具讓我們可以在開發過程中除錯每一幀影象繪製流程,但是對於執行過程中的資源洩漏很難排查。
為此 OpenGLTrace
藉助 FishHook Hook 了 iOS 平臺上 OpenGL ES
和部分 CoreVideo
的函式,實現對 Texture/Program
等資源的監控。
6. Storage Plugins
# DirectoryWatcher
DirectoryWatcher
主要用於沙盒資料夾的大小跟蹤,便於開發測試過程中發現異常的檔案管理問題。同時也集成了 FLEX
的沙盒檔案檢視,並擴充套件支援了檔案或資料夾的 AirDrop
。
7. Utility Plugins
# FLEX
日常開發中常用的除錯輔助工具,MTHawkeye 外掛擴充套件支援了沙盒檔案的 AirDrop 功能
接入
參考 Readme 的 接入說明
接入自己的外掛
如果有一個模組在開發過程中需要避開很多坑,或者開發過程中除錯 / 優化相關的日誌程式碼很多,可以考慮編寫一個除錯輔助元件,然後基於 MTHawkeye 基礎框架 API,可將這個元件接入到 MTHawkeye 框架中使用,以便統一互動和介面。
效能影響說明
各外掛的效能影響說明參見專案倉庫下的各外掛文件。