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,又或顯示提示訊息,讓用戶自行輸入更多資料等。關注私隱的話,也可設定為讓用戶自行選擇不回報,非常周到。

有收費服務商支援

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

歡迎進入除蟲的地獄。