MTHawkeye 是美圖 iOS 團隊在使用的調試輔助、性能優化輔助工具集,旨在幫助 iOS 開發者提高開發效率、輔助優化性能體驗。git
在產品開發週期內,咱們引入 MTHawkeye 來幫助咱們更快的發現、查找、分析、定位、解決問題:github
做爲美圖內部平常使用的基礎工具,現將其開源,期待後續有更多實用的插件以幫助開發者提升效率,更便捷的優化 App 的性能。歡迎 Star,提交 Issue 和 PR,也歡迎外部獨立的組件接入到 MTHawkeye 中。緩存
MTHawkeye 簡單可分爲上中下三層,除了最下面的基礎層
外,中間爲UI 基礎層
,最上層的各個插件內部根據不一樣場景作了職責拆分,應用可根據本身的須要接入。性能優化
基礎層
主要提供了插件管理能力,存儲能力和一些基礎工具類。網絡
UI基礎層
則提供了開發、測試階段使用的界面層骨架,包含了懸浮窗、主界面框架和設置面板,插件能夠集成到其中。併發
MTHawkeye 上層的功能插件主要以性能偵測插件爲主,也引入並改進了 FLEX 做爲調試輔助的一個插件,應用接入 MTHawkeye 時可自定義增改本身須要的插件。內置的插件根據關注點分紅了 Memory
, TimeConsuming
, Energy
, Network
, Graphics
, Storage
, Utility
幾個類別。框架
LivingObjectSniffer
主要用於跟蹤觀察 ViewController 直接或間接持有的對象,以及自定義 View 對象,偵測他們是否異常存活,好比內存泄露、未及時釋放或者沒必要要的內存緩存。ide
在開發、測試階段,偵測到的異常狀況能夠以浮窗警告、Toast 的形式提示開發、測試人員。自動化測試時也能夠直接提取記錄的存活對象作進一步的分析判斷。函數
Allocations
類同於 Instrument 的 Allocations 功能,跟蹤應用實際分配的內存詳情,在應用內存使用異常(異常上升、OOM 退出)時能夠經過記錄的內存使用詳情數據,來排查內存使用問題。工具
開發、測試階段使用演示:
自動化測試、線上階段接入後,能夠持續的跟蹤自動化用例、用戶場景的實際內存使用狀況。
UITimeProfiler
用於輔助主線程耗時任務的優化。內部分紅了 VC Life Trace
和 ObjC CallTrace
兩部分。VC Life Trace
用於跟蹤打開 ViewController 各個階段的具體時間點,ObjC CallTrace
在開啓後,則可跟蹤耗時大於指定閾值的 Objective-C 方法,類同於 Instrument 的 Time Profiler 功能。
界面層部分將兩部分的數據合併展現,便於開發者更便捷的找出關注流程的耗時信息,示例以下:
自動化測試、線上階段接入後,無需埋點或插入其餘代碼,便可持續的跟蹤啓動耗時、頁面打開耗時和其餘關鍵流程耗時。
ANRTrace
用於捕獲卡頓事件,同時採樣卡頓發生時的主線程調用棧
FPSTrace
用於跟蹤界面 FPS 以及 OpenGL 刷新繪製 FPS,並在浮窗上顯示當前值
CPUTrace
用於跟蹤 CPU 持續高使用率,同時記錄高使用率期間主要調用了哪些方法。
NetworkMonitor
監聽記錄 App 內 HTTP(S) 網絡請求的各個階段耗時,並提供內置的記錄查看界面,便於開發者排查優化網絡問題。
FLEX
的網絡請求記錄,過濾搜索。同時優化監聽初始化邏輯,大幅減小對啓動時間的影響NSURLSession
的請求,增長記錄 URLSessionTaskMetrics
方便查看請求各個階段的時間URLSessionTaskMetrics
增長相似 Chrome 網絡調試的 waterfall 視圖,方便查看網絡的前後和同時併發的請求開發、測試階段的演示示例:
NetworkInspect
插件基於 Network Monitor,根據記錄的網絡請求實際狀況,偵測是否有可改進優化的項,上層能夠自定義本身的規則。
OpengGLTrace
用於跟蹤 OpenGL
資源內存佔用狀況,輔助發現 OpenGL API 錯誤調用、異常參數傳遞。
OpenGL
渲染引擎在調試上十分不方便,儘管 Xcode 提供了 Frame Capture 的 OpenGL ES 調試工具讓咱們能夠在開發過程當中調試每一幀圖像繪製流程,可是對於運行過程當中的資源泄漏很難排查。
爲此 OpenGLTrace
藉助 FishHook Hook 了 iOS 平臺上 OpenGL ES
和部分 CoreVideo
的函數,實現對 Texture/Program
等資源的監控。
DirectoryWatcher
主要用於沙盒文件夾的大小跟蹤,便於開發測試過程當中發現異常的文件管理問題。同時也集成了 FLEX
的沙盒文件查看,並擴展支持了文件或文件夾的 AirDrop
。
平常開發中經常使用的調試輔助工具,MTHawkeye 插件擴展支持了沙盒文件的 AirDrop 功能
參考 Readme 的 接入說明
若是有一個模塊在開發過程當中須要避開不少坑,或者開發過程當中調試/優化相關的日誌代碼不少,能夠考慮編寫一個調試輔助組件,而後基於 MTHawkeye 基礎框架 API,可將這個組件接入到 MTHawkeye 框架中使用,以便統一交互和接口。
各插件的性能影響說明參見項目倉庫下的各插件文檔。