使用背景
作為開發人員,日常不是在寫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 <UMCommon/UMCommon.h>,隻需要一行代碼,就可以把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監控
整個接入流程十分簡單 更多方式以及問題課跳轉到官方文檔 https://developer.umeng.com/docs/193624/detail/194595 ?&utm_source=w_MKT_dswz_dxf_wz
解決問題
可根據版本、時間、裝置等多元度過濾出如下錯誤清單。
以一個常見數組越界的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 内部做相容修複。
姓名:杜鑫峰
電話:18611350076
簡介:學寶APP iOS 端負責人