作者:元泊
前言
作為移動端的研發同學,你是否也曾陷入這樣的困境:用户在應用商店留下了一星差評,抱怨“App 用起來很卡”或者“支付時閃退了”,但無論你在測試環境如何操作,都無法復現問題?面對着從海量日誌中撈出的、可能毫無關聯的信息,以及一個孤立的、缺少上下文的崩潰堆棧,排查問題就像在濃霧中“盲人摸象”,耗費了數天時間,最終卻只能提交一個基於猜測的修復。
為了提升這種低效的排查模式,我們進行了 iOS 數據採集與關聯方向的探索,並進行了產品化的實踐。它可以站在每一位真實用户的視角,把應用的性能指標、錯誤日誌和用户行為等數據串聯起來,提升您的問題排查效率。
iOS 數據採集簡介
為了能夠把應用性能指標、錯誤日誌、用户行為等串聯起來,SDK 需要具備體系化的數據採集與分析能力。SDK 的核心數據採集能力覆蓋以下幾個方面:
- 用户會話軌跡: SDK 會記錄用户的完整的操作軌跡,並與相關的事件進行關聯。當問題發生時,通過會話軌跡可以回溯用户的操作路徑、API 調用和資源加載情況。
- 性能指標: 對影響用户體驗的關鍵鏈路進行監控測量,包括:應用啓動耗時、頁面加載耗時、網絡請求耗時、網絡請求成功率、頁面卡頓率等。
- 異常與穩定性監控: 能夠自動捕獲應用觸發的各類異常,包含:Mach 內核異常,Objective-C 異常,Swift 異常,C/C++ 異常等。
- 自定義數據上報: 除了標準的性能和異常數據外,還支持業務根據自身需求上報自定義事件與日誌,將用户行為與業務指標相結合,賦能更深層次的產品分析與角色。
數據採集架構和實現
為了有效應對以上挑戰,SDK 通過一個輕量化、模塊化的架構,對應用的不同階段進行 hook 和監聽,以實現應用性能和穩定性的監控。
- 公共接口層: 提供對外公開的 API,用户通過 API 與 SDK 進行交互。
- SDK 管理層: 管理 SDK 的各個模塊,SDK 的啓停等。
- 數據採集等: 管理各個數據採集模塊,實現數據採集細節,各個數據模塊實現隔離。
- 基礎核心層: 支撐整個 SDK 的運行,提供時間同步,數據處理,配置管理等能力。
在基礎核心層,SDK 為了統一各個端的實現,以及性能的考慮,使用 C 實現了獨立的跨平台數據處理和跨平台配置管理模塊,使多端保持一致的數據持久化、數據發送、數據序列化、配置拉取和管理等邏輯。
在數據採集層,為了高效、精準、無侵入地採集各類事件,SDK 基於 Method Swizzling 技術和 iOS 系統平台特性與框架能力,構建了多樣化的採集方案。並針對不同的場景和數據類型,分別採用合適的技術手段,主要包含:
- 基於 Method Swizzling 的網絡等數據採集。
- 基於系統特性與框架能力的數據採集。
- 崩潰異常數據的採集。
基於 Method Swizzling 的數據採集
iOS 開發的主要語言是 Objective-C 和 Swift,提到 Method Swizzling 技術離不開 iOS 的 ObjC 運行時。ObjC 是一門動態語言,在運行時間會對變量的數據類型檢查,同時根據函數名查找要調用的函數。這種特性使得 ObjC 變得比較靈活,SDK 可以在程序運行時動態修改一個方法的實現,從而達到數據採集和埋點插樁的目的。
Method Swizzling 被稱為動態方法交換技術,用於改變一個已經存在的 selector 實現。基於此技術,SDK 可以在程序運行時,通過改變 selector 所在 Class 的 method list 的映射,從而改變方法的調用,本質上是交換兩個方法的 IMP。
通過以上方式,SDK 支持:
- 網絡請求數據採集: 支持性能數據,狀態碼,錯誤原因,端到端鏈路打通等數據的採集。通過 Method Swizzling,SDK 對實現了對 URLSession 和 URLConnection 等網絡庫的無侵入數據採集。
- 頁面數據採集: 支持頁面加載耗時,頁面狀態變化等數據的採集。
- Action 數據採集: 支持 UITableView、UITableView 等控件的點擊事件採集。
- WebView 數據採集: 結合 web 探針,支持了應用內置 H5 頁面數據的採集,包含:網絡資源請求,頁面和路由切換,js 異常等。
基於系統特性與框架能力的數據採集
除了 Method Swizzling 之外,SDK 還利用系統特性和框架的標準 API 來採集應用在運行時的關鍵事件。
如上圖所示,是 iOS 應用從啓動到終止過程(包含前後台切換),系統通過事件通知中心對外暴露的事件狀態變化。SDK 通過註冊這些事件完成應用狀態事件的採集。
為了準確採集應用的狀態變化,SDK 按照不同的場景,分別對不同的事件進行處理:
- 應用進入到前台事件:SDK 會對 willEnterForeground 和 didBecomeActive 事件處理。
- 應用進入到後台事件:SDK 會對 willResignActive 和 didEnterBackground 事件處理。
為了統一的監控這些事件,SDK 提供了 AppLifeCycle 類對這些事件進行管理,簡化事件處理的同時也能保證調用時序。除此之外,SDK 還對 RunLoop 進行了監聽,通過檢查 RunLoop 運行狀態,實現卡頓監控事件的採集等。
通過以上方式,SDK 支持:
- 應用啓動耗時採集:支持應用冷啓動、熱啓動耗時指標採集。
- 卡頓事件採集:支持卡頓事件的採集,同時支持耗時堆棧的提取。
- 網絡狀態的採集:支持網絡類型的採集。
崩潰異常數據的採集
SDK 崩潰數據的採集能力基於業界知名的 KSCrash 框架開發。KSCRash 是一款強大的 iOS 崩潰報告庫,其核心優點是“崩潰安全”,確保處理過程自身穩定可靠。它能全面捕獲 Mach、C++、OC 等多種致命錯誤,生成包含所有線程堆棧和豐富上下文的詳盡報告,極大提升開發者定位問題的效率。KSCrash 的工作流程主要分為下面五個部分:
- 核心功能模塊:協調各個模塊工作,實現異常捕獲的核心邏輯。
- 監控系統:管理和協調各類異常監視器,全面捕獲不同類型的異常。
- 報告系統:生成詳細的崩潰報告,進行本地存儲和數據過濾。
- 配置系統:按需配置框架的行為。
- 安裝系統:處理框架的安裝流程,崩潰報告的發送工作。
基於 KSCrash,SDK 支持:
- Mach、C++、OC、Signal 等類型的崩潰捕獲。
- 基於 KSCrash 的堆棧捕獲能力,支持卡頓耗時堆棧的讀取。
結語
阿里雲 RUM SDK 作為一款性能體驗監控採集工具,可以作為輔助 App 運維的強有力助手,提升您的問題排查效率。您可以參考接入文檔(https://help.aliyun.com/zh/arms/user-experience-monitoring/mo...)體驗接入 iOS SDK。相關問題可以加入“RUM 用户體驗監控支持羣”(釘釘羣號: 67370002064)進行諮詢。
您也可以參考以下文檔體驗接入 Android、Harmony SDK:
Android:https://help.aliyun.com/zh/arms/user-experience-monitoring/mo...
HarmonyOS:https://help.aliyun.com/zh/arms/user-experience-monitoring/mo...
點擊此處,查看接入文檔。