使用背景
作為開發人員,日常不是在寫BUG,就是在寫BUG的路上。尤其是中小型公司,通常人手不夠,開發流程不完善,測試場景無法覆蓋全部。盡管在每次修改舊功能和做新功能時都暗示自己要少寫BUG,上線前測試同學也會回測,但仍然無法避免一些漏網之魚。如何在上線后快速發現問題、定位問題、解決問題,這是我們開發人員面臨的挑戰。
學寶是一款專門面向中小學學生的語文、數學、英語全科同步學習工具APP。 從2014年第一版上線開始,Android 和 iOS 端同時接入友盟統計SDK,用于日常的數據統計和留存分析,借助這些服務,為公司節省了很多成本。友盟統計SDK同時也能收集 APP 的崩潰信息,在產品上線后幫助我們第一時間發現問題,快速定位問題,而我們開發人員要做的就是快速的解決問題,提升用戶體驗。
SDK 集成
以下以學寶APP iOS 端為例,示例在日常使用 U-APM 發現與解決 BUG 的流程。首先沒有賬號的要注冊一個友盟賬號,創建你的應用拿到 appkey。
如果你是第一次集成,推薦使用Cocoapods 來集成,然后在你工程的 Podfile 文件添加以下內容,最后在終端進入工程的根目錄,執行 pod install 命令。因為 UMAPM 依賴 UMCommon 和 UMDevice 組件,所以要放進去。 第一次集成建議加上UMCCommonLog,通過查看控制臺的日志確認是否集成成功,成功后就可以移除出了。
pod 'UMAPM', '~> 1.4.2'
pod 'UMCommon', '~> 7.3.5'
pod 'UMDevice', '~> 2.0.4'
pod 'UMCCommonLog', '~> 2.0.2'
在 AppDelegate.m 文件中引入頭文件 #import,只需要一行代碼,就可以把U-APM 成功的集成到工程中。如果集成了UMCCommonLog 組件,加上 [UMConfigure setLogEnabled:YES] 在控制臺查看log,這樣就很簡單的完成了U-APM的集成.
[UMConfigure initWithAppkey:@"xxxxxxxx" channel:@"App Store"];
[UMConfigure setLogEnabled:YES];
U-APM 默認開啟 Crash監控、卡頓監控 、啟動監控、內存監控和 OOM監控,也可通過控制屬性值關閉一些功能,根據自己需求來。
[UMAPMConfig defaultConfig].crashAndBlockMonitorEnable = YES; // crash&卡頓監控
[UMAPMConfig defaultConfig].launchMonitorEnable = YES; // 啟動監控
[UMAPMConfig defaultConfig].memMonitorEnable = YES; // 內存監
[UMAPMConfig defaultConfig].oomMonitorEnable = YES; // OOM監控
解決問題
可根據版本、時間、設備等多維度過濾出如下錯誤列表。
以一個常見數組越界的Crash舉例,這是一個非必現的BUG,在自測和測試同學測試期間都沒發現這個問題,上線后再 U-APM 后臺收到多條記錄。
Application threw exception NSRangeException: *** -[__NSArrayM objectAtIndexedSubscript:]: index 2 beyond bounds [0 .. 1]
開錯誤詳情頁,可以看到發送同樣的問題都統計在這里了,根據行為日志,看到崩潰前瀏覽的最近10個頁面,就知道用戶走過的路徑,知道大概在哪個頁面發生的。
雖然知道在哪個頁面閃退,但是這些還不夠,一個頁面可能會有多個子頁面,如何知道具體哪個類和哪一行,就需要我們再上傳符號表。在我們打包的 Archive 文件中找到dSYM文件拷貝到桌面,然后點擊錯誤明細右邊的符號表管理,上傳拷貝出來的dSYM文件。
上傳成功后,無法立馬看到解析結果,需要幾分鐘的解析,通常五分鐘左右就好。
解析好之后就很明確定位到具體的哪個類哪一行。在touchesBegan:withEvent: 有一個數組取值操作未做安全校驗,加上就好。
總結
年初在升級友盟統計 SDK 的時候,發現收集 Crash 的功能,已從友盟統計組件中抽出來,并做了重構獨立成一個組件,并多維度進行收集閃退日志,在錯誤明細里列出最近 10 個頁面路徑功能太棒了,非常有利于去復現這些問題。
作為開發人員,在寫邏輯要細心嚴謹的同時,也要借助一些輔助工具,收集沒有考慮到的 Crash,提升APP穩定性。針對移動端,友盟 SDK 以及一些列工具是一個不錯的選擇,在節省人力的同時也能節省成本,在使用中遇到一些問題客服的響應速度也是真快,可能是國內目前唯一一家SDK經常維護更新,還有客服的商家了,而且還免費。
小的建議
U-APM 正在迭代,作為深度用戶,在使用中也會遇到一些不順手的地方,雖也不影響使用,但是相信大家都一樣的感受,還是期待能優化一下下面問題。
1、進入 U-APM 面板能默認展示最近24小時的崩潰數據,而不是最近一小時的數據
拿我們自己舉例:我們用戶活躍時間集中在夜晚七點到九點之間,如果某天早上到工位后我來查看APP崩潰情況,點進來后據可能是0,需要再去篩選一些,如何不是聯調或者灰度的時候,正常來說這個默認一小時意義不大。
2、崩潰信息詳情面板機型和和使用時長能夠直觀一些
如下圖,在錯誤明細里 iPhone10,3 對應日常熟悉的型號是iPhone X,如果不去查一下資料是不知道 iPhone10,3 是具體哪一款型號,這里更希望看到的是常見型號類型。
有時候想去了解用戶使用時間的時候,在看到 6345s 的時候還是要打開手機的計算器去換算一下。期望時間超過一分鐘小于一小時的轉換成分鐘(比如:3分鐘、20分鐘),超過一小時小于一天的時間轉換成小時(比如:23小時48分鐘),超過1天的就顯示天數(比如:3天 10小時 )。
3、能夠支持自定義的錯誤
有一些問題不會導致崩潰,但是用戶看到的就是有問題的,可能是后臺返回的個別數據有問題,這個時候就有來自定義錯誤這個需求。就像示例中解決數組越界的問題,后天返回的字段中本應該有兩個長度一樣的數組,但是是因為個別數據錄入導致問題,導致返回的數組大小不一樣。
4、解決 iOS 新項目中集成 SDK 時閃退問題
用Xcode 11 以上版本新建一個工程, 集成 SDK 運行直接閃退了。當然有經驗的搜一搜也能很快解決,但是對一個剛接觸的新手來說這個閃退還是挺突然的,期望能在文檔中說明,更好的方案是能在 SDK 內部做兼容修復。
姓名:杜鑫峰
簡介:學寶APP iOS 端負責人