開源 iOS 性能優化/調試輔助工具集 MTHawkeye

MTHawkeye 是美圖 iOS 團隊在使用的調試輔助、性能優化輔助工具集,旨在幫助 iOS 開發者提高開發效率、輔助優化性能體驗。git

在產品開發週期內,咱們引入 MTHawkeye 來幫助咱們更快的發現、查找、分析、定位、解決問題:github

  • 開發階段,側重於開發調試輔助,及時偵測問題,並在必要時提示開發者及時處理
  • 測試階段,側重於根據測試場景,收集儘量多的數據,用於自動化測試分析報告
  • 線上階段,側重補充傳統 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 對象,偵測他們是否異常存活,好比內存泄露、未及時釋放或者沒必要要的內存緩存。ide

在開發、測試階段,偵測到的異常狀況能夠以浮窗警告、Toast 的形式提示開發、測試人員。自動化測試時也能夠直接提取記錄的存活對象作進一步的分析判斷。函數

# Allocations

Allocations 類同於 Instrument 的 Allocations 功能,跟蹤應用實際分配的內存詳情,在應用內存使用異常(異常上升、OOM 退出)時能夠經過記錄的內存使用詳情數據,來排查內存使用問題。工具

開發、測試階段使用演示:

自動化測試、線上階段接入後,能夠持續的跟蹤自動化用例、用戶場景的實際內存使用狀況。

2. TimeConsuming Plugins

# UITimeProfiler

UITimeProfiler 用於輔助主線程耗時任務的優化。內部分紅了 VC Life TraceObjC 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) 網絡請求的各個階段耗時,並提供內置的記錄查看界面,便於開發者排查優化網絡問題。

  1. 繼承自 FLEX 的網絡請求記錄,過濾搜索。同時優化監聽初始化邏輯,大幅減小對啓動時間的影響
  2. 針對 iOS 9 後的 NSURLSession 的請求,增長記錄 URLSessionTaskMetrics 方便查看請求各個階段的時間
  3. 基於 URLSessionTaskMetrics 增長相似 Chrome 網絡調試的 waterfall 視圖,方便查看網絡的前後和同時併發的請求
  4. 增長重複網絡請求的偵測
  5. 加強搜索欄,支持多條件搜索(域名篩選、重複請求、url 過濾、status 過濾)
  6. 記錄展現完整的網絡請求記錄(增長 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 框架中使用,以便統一交互和接口。

詳見:MTHawkeye 插件開發說明文檔

性能影響說明

各插件的性能影響說明參見項目倉庫下的各插件文檔。

開源地址

相關文章
相關標籤/搜索