ACRA - Android App 上的錯誤回報

任何程式一定有 bug,問題是如何找出來,麻煩的是找出來的九成也是用戶,而非開發者。而且很多時是出廠後才找出來。

![FC 畫面](/content/images/2014/Apr/Android-Force-Close.jpg)
Android 上的 Force Close 畫面,你一定會見過

慶幸如是開發 android app 的話,android 2.x 以上已內建回報系統,用家遇到錯誤時按「回報」,即可在 developer console 收到有關的問題資料。

問題是,要用家主動按「回報」才能將 bug 告之。而很多時用家會選擇「取消」而已,所以我們需要一個自動的回報系統,讓我們主動了解程式的問題所在。

ACRA

在 Android 上最廣泛使用的就是 ACRA。只需簡單的設定,加上一個 server backend, 便能有一個自動回報問題的系統。用了它後便能助你更快消滅臭蟲。ARCA 優點如下:

簡單

簡單的設定一下,便能在有錯誤時自動回報給預定的伺服器。只要在 Android app 上

  1. 新增一個 MyApplication extend android.app.Appplication

  2. @ReportsCrashes 進去:

     import org.acra.*;
     import org.acra.annotation.*;
     @ReportsCrashes(
     	formKey = "", // This is required for backward compatibility but not used
     	formUri = "http://www.backendofyourchoice.com/reportpath"
     )
     public class MyApplication extends Application {
     }
    
  3. override onCreate(),加 ACRA 的起始:

     import org.acra.*;
     import org.acra.annotation.*;
     @ReportsCrashes(
         formKey = "", // This is required for backward compatibility but not used
         formUri = "http://www.backendofyourchoice.com/reportpath"
     )
     public class MyApplication extends Application {
         @Override
         public void onCreate() {
             super.onCreate();    
             // The following line triggers the initialization of ACRA
             ACRA.init(this);
         }
     }
    
  4. 修改 AndroidManifest.xml,在application 使用新的 MyApplication class

     <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="MyApplication">
    
  5. 當然也要加 internet permission 啦

     <uses-permission android:name="android.permission.INTERNET"/>
    

這樣便設置妥當了。

涵蓋甚廣

什麼 exception 也可以,連 uncaught exception 也可回報,回報時會包含 stack trace、裝置資料、時間等, 也可自行定義要回報的資料。

自訂 server

伺服器完全任君選擇,可使用ACRA 官方的 open source project 作 backend,要求高一點的可選坊間一些收費服務。想由零開始的可自行編寫,方便加進自己的 bug tracking system。

自訂 client

Client 方面可設定錯誤時的處理,可只顯示 toast 訊息,也可顯示在 Notification bar,又或顯示提示訊息,讓用戶自行輸入更多資料等。關注私隱的話,也可設定為讓用戶自行選擇不回報,非常周到。

Android 畫面

有收費服務商支援

Open source project 很多時要自己弄妥所有事情,不過時間就是金錢, 不想花時間在這些支節上的話, 可以使用有商業服務,如 Bugsense 等, 省回一點功夫時間。

統一回報接口

使用 ACRA 的最大好處,是統一了回報的 protocol,就算使用某一 backend 不滿意, 要變更服務商,只要改一改回報的網址便可以,其他什麼也不用改,簡單方便。(當然若想連 bug report 轉移的話是另外一回事了)

Backend 選擇

官方有自 wiki 介紹 backend services。 大約看完後有 BugsenseBugsnag 和 Acralyzer。我最初選用的是 Bugsense:

![Bugsense screenshot](/content/images/2014/Mar/bugsense.jpg)
Bugsense 也相當好用

它的介面不錯, 可作過濾,方便找尋某些特定 bug,有新 bug 回報時也有即時電郵通知,而且支援 proguard mapping,不用在 stack trace 看見 aaa.aa method 時還要去找 mapping files。

可惜免費的每月只能有 500 個回報個案,而且只保留 7 天,過額後所有回報個案也不能查看,每月 $19 有點貴。

至於 Bugsnag 每用包含 2000 個回報個案,一個 project,好像較花算,但我沒有試用過,不知效果如何。

最後不嫌麻煩的用了 acralyzer ,在免費 server 上 host,介面較差,但限制少一點,而且可以接收無限量 bug(因為只是計流量,要很多很多 bugs 才要付費),再用多一段時間才寫用後感吧。

![Acralyzer](/content/images/2014/Mar/acralyzer.JPG)
Acralyzer 只是剛剛夠用而已

後記

想做一個令人滿意的程式,自動 bug reporting 是必須的,設定後你會找到有很多意想不到的臭蟲,然後發現程式的 bugs handling 遠遠不夠。

It's hard enough to find an error in your code when you're looking for it; it's even harder when you've assumed your code is error-free.

Steve McConnell

歡迎進入除蟲的地獄。