使用 ACRA 回報應用程式錯誤訊息

前陣子泰勞剛上架了新的應用程式到Google Play商店,雖然已經過數百次的測試,還是免不了千奇百怪的臭蟲(Bug),這個問題困擾了我很久,也因此得到很多1分的評論。最大的原因是我自己的手機、平板、電腦裡的模擬器都複製不出那些錯誤現象,而Google Play Console提供的資訊又不夠豐富......,為了從使用者的裝置上取得更詳盡的錯誤訊息,只好另尋方法來徹底解決。

參考資料:
[Stackoverflow]How do I obtain crash-data from my Android application?
[Github]ACRA/acra/wiki

先來看看Google Play Console提供給我的資訊。

因為我使用了AsyncTask來封裝儲存資料的動作,因此僅能得知應用程式在儲存資料時發生錯誤,無法得知根本的原因,而這現象非常大量的發生在三星手機身上,但我身邊並沒有任何三星手機讓我做測試,要解決這問題,勢必需要應用程式回傳完整的錯誤訊息回來,才能夠進一步的分析。

最佳解答:

基本上ACRA在Github上的介紹已經非常詳細了,只要照著說明一步一步設定,就可以完成最基本的功能囉!泰勞在這邊就不多做解釋,僅簡單的帶過步驟。

1.在build.gradle裡加入dependency

2.新增一個繼承Application的類別。

3.寫入最基本的格式,因為沒有伺服器可用,只能先將錯誤訊息透過電子郵件回傳。

4.更新AndroidManifest

到這邊已經完成最基本的功能囉!再來要加入提示訊息,讓使用者知道應用程式遇到狀況了,需要回報錯誤訊息給開發者,同時這也是尊重使用者的態度,比起在背景偷偷回傳來的好

5.使用Dialog顯示應用程式發生錯誤的訊息。

6.為了讓回報的訊息更完整,可以加入Log設定,圖中為預設的Logcat指令,可以依不同需求來設定這些字串。

測試一下,故意讓應用程式出現意外錯誤,一方面要看看Dialog介面,一方面要確認回報的Log訊息是否完整。

有錄到我想要的重點,看來測試結果是沒其他問題了,只是預設的Dialog有點陽春,我是懶得改,想套用自己設計的介面就去參考官方的文獻吧!

不知大家是否還有個疑惑,就是如果應用程式有發生錯誤,但沒有Crash,這套回報錯誤的系統是否就不作動了呢?沒錯,只要沒有發生Crash,預設是不會回報的!但我們可以加入一些程式碼,讓應用程式能夠在需要時,就回報錯誤訊息,尤其對於一個妥善利用Try Catch功能的工程師,應用程式本身可能不太會發生Crash,但仍然有些細小的臭蟲必須處理掉。

方法很簡單,短短一行,放在例外處理裡面即可!

try {
    ......
    ...... 
}catch (FileNotFoundException ffe){
    if(debugmode)Log.e(TAG, "FileNotFoundExcetion");
    ffe.printStackTrace();
    ACRA.getErrorReporter().handleException(ffe);
}

在應用程式裡加入ACRA,對開發者而言確實帶來很多好處,但也有個隱憂,如果使用者永遠不願按下『確定』鍵回報錯誤訊息,那開發者就很難分析問題,Android的版本多再加上Android各裝置的差異,真的很難做到十全十美阿(嘆氣)。

留言

這個網誌中的熱門文章

程式語言常用之符號與詞彙 - 中英文對照

Repo 實用指令

什麼是 Bootloader?