記錄一次解決App崩潰問題的解決方案

效能優化實踐者發表於2021-11-22

一、問題背景

我們公司開發了一款App,一部小部分使用者反映在開APP授權通知許可權之後會出現閃退的情況,但是我們通過幾臺測試機的測試,都無法復現這個問題,比較棘手。

二、遇到的挑戰

由於我們是創業型的公司,沒有太多的預算購買很多種類的測試機,安卓機每個品牌只有一個型號的測試機,而且系統版本也沒辦法覆蓋完全,蘋果機也是一樣的情況。出現閃退的情況,光靠使用者的描述是比較難定位到錯誤的地方,使用者記憶體佔用過多?磁碟空間不足?抑或是邏輯上的問題導致的閃退?而且,我們使用的是混合開發,框架使用的是ionic,大部分頁面和邏輯都是混合開發。由於App涉及到藍芽連線相關的SDK和DFU韌體升級,而ionic在這一塊沒有封裝相應的介面,所以這部分的內容我們還是通過在原生上面進行開發,再使用ionic去呼叫原生的內容。這更加增加了debug的難度。

三、解決問題的步驟

為了找到導致crash的地方,我們先排除掉機器記憶體和磁碟空間不足導致的問題,我們通過上傳使用者手機的記憶體總大小、剩餘記憶體的大小、磁碟總空間和磁碟剩餘空間,排除掉了這個因素。之後我們就考慮是不是因為程式碼邏輯上的一些問題導致的,於是我們嘗試使用友盟的U-APM產品,它裡面有一個很好的崩潰分析工具,可以看到crash的一些資訊,包括錯誤的型別、具體哪一行導致了報錯、出現的頻率和機器相關的引數,這對我們的debug有很大的幫助,於是我們嘗試安裝友盟的SDK,設定了郵件和釘釘的錯誤提醒,併發布了新版本APP。兩天後,這部分使用者再次開啟App之後,也出現了授權許可權之後閃退的情況,與此同時,我們也收到了來自友盟的錯誤提醒郵件和釘釘提醒。點選進去之後發現U-APM幫忙定位了錯誤的地方,如下圖,在MainActivity.java的第93行,出現了ArrayIndexOutOfBoundsException,也就是陣列下標超過了陣列長度-1,而且具體的crash時間和機器引數也同時總結了出來,幫我們總結了很有用的資訊,我們發現這個現象只有在榮耀系列的手機裡才會出現,於是我們加強了榮耀系列手機的測試,在一次手動在系統中關閉許可權之後開啟app的用例中重現了這個問題,也找到了根本的原因,因為當使用者手動關閉某些許可權的時候,回撥返回的是一個空陣列,而我們去取下標為1的值的時候就會導致報錯了。

修復之後我們繼續使用友盟去觀察這個問題有沒有解決,自從修復了這個問題併發布了新版本之後,就不會再報這個錯了。

四、問題總結

有些時候遇到crash的情況,而且無法復現,作為開發者確實挺頭疼的,使用友盟的U-APM產品,可以幫助我們更快速地定位問題,總結相應的情況,幫助我們更主動地去發現問題、解決問題,進而提高使用者的體驗。

作者:樑立坤
平時熱愛專研技術,善於利用各種Saas平臺的工具幫助團隊提升開發、部署、運維、排錯的效率。

相關文章