之前介紹過使用 ACRA 來做 crash reporting,其實除了它外,還有 Crashlytics 可以選擇。在 ACRA 久沒有更新的情況下,是時候研究一下 Crashlytics。

Crashlytics 在 2014 年 10 月整合到 Fabric 的服務中,它支援 Android、iOS、Web 和 Mac OS X。跟 ACRA 一樣,Crashlytics 是免費的。只要在你的 app 設定好 Crashlytics,當 app 遇到例外錯誤時,便會自動回報到後台 server,讓開發者容易分析錯誤,找出原因。

Fabric

以下文章只討論 Android 版,並會交替使用 Fabric 和 Crayshlytics。

功能

Crashlytics Dashboard
Crashlytics Dashboard

後台 Server 方面,基本上 ACRA 有的它也有,而且介面比 Acralyzer 更方便更漂亮:

  • 可查看每個錯誤的 stack trace;
  • 有錯誤數量統計,可根據不同時間不同版本作報告;
  • 錯誤分不同 level。同一錯誤有很多報告的話,會自動提升級別,移到最高,方便你處理最嚴重的問題;
  • 有分 OS version, app version , 機種等。還有機器的詳細資料,如 Ram, disk space 和 rooted 與否等
  • 發現錯誤時有電郵提醒

不過 client 方面,它不像 ACRA 提供在遇到錯誤時,可以設定顯示 dialog 或 notification ,讓用戶自行選擇回不回報,或填寫額外資料。Crashlytics 只會在背景回報錯誤,相關 UI 要自行編寫。

安裝

跟 ARCA 或其他 android library 不同,Crashlytics 需要使用它的 pllugin 來安裝的。

install plugin

  1. http://fabric.io 登記帳戶
  2. 安裝 Fabric plugin 到 IDE, plugin 支援 Eclipse、Android Studio 和 IntelliJ IDEA。
  3. 開啟 project ,按 plugin ,登入。
  4. Fabric plugin 會自行 install 到你的 project 中。安裝方式是以 gradle 進行,所以你的 project 不支援 gradle 的話便未必可以使用。
  5. Build,完成

那麼它的 plugin 其實做了什麼呢?根據觀察,它會:

  1. 修改 gradle.build,加入 Crashlytics 相關的 library
  2. 新增 fabric.properties,內含 apiSecret
  3. AndroidManifest.xml 加進 apiKey
  4. Application class 會加進 Fabric.with(this, new Crashlytics());用作以啟動 crashlytics

所以想自行安裝的話,可以讓 plugin 修改和產生相關文件後,將這些修改加到你的設置流程中。

安裝完成後,便可以測試。Plugin 有提供 force exception code,不過要自己弄一個 exception 應該不難吧?

進階使用

安裝後其實不用設置什麼,也能使用它的功能。但有時有 stack trace,也不足夠去找到問題所在。幸好 Crashlytics 提供進階功能以解決問題。

自訂額外資料

Crashlytics 可自訂 data 連同 report 一起發送。

要自訂額外資料,可使用:

Crashlytics.getInstance().core.log("A specified problem found.")

另外亦可自設 key-value paried data:

Crashlytics.getInstance().core.setBool("failed_before_update?", true);
Crashlytics.getInstance().core.setDouble("my_salary", 32.5);
Crashlytics.getInstance().core.setInt("working_day_per_month", 31);
Crashlytics.getInstance().core.setString("last_action", "resigned");

你可以在懷疑出錯地方加入這些額外資料,這樣在收到 report 後便能確認那些錯誤是否你懷疑的地方。

身份識別

可以設定 user Id,令錯誤更容易追索,不過請小心私隱問題。

Crashlytics.getInstance().core.setUserIdentifier("hashed username");

想更清楚的甚至可以

Crashlytics.getInstance().core.setUserName("username");
Crashlytics.getInstance().core.setUserEmail("email");

Caught exceptions

有些錯誤要 catch 但又想要 report ,不要緊,可以這樣做:

try{
    new TypoException();
} catch(Exception e){
    Crahslytics.logExpetion(e)
}

Fabric 的其他服務

除了 Crashlytics,Fabric 底下還有一系列服務,如 answers 像 Google Analytics 可以檢查 active users、設定 event 等;Mopub 提供廣告服務;Optimizely 提供 A/B testing 等。若有需要的話,要安裝啟用也是非常方便。

Crashlytics 跟 ACRA 的分別

使用了 Crashlytics 一段日子後,覺得優點缺點如下:

優點

  • 不用自設 server,安裝方便
  • 介面方便好用
  • 提供其他額外服務
  • 有公司在背後支援

缺點

  • 非開源
  • 不能使用自家 server
  • 沒有提供 client side UI
  • 安裝 library 時要使用網頁資料,有時反應有點慢。

雖然看上去好像缺點多於優點,但是其實那些都不是大問題。唯一較大的問題是它非 open source,萬一有什麼問題便要等 Fabric 公司去解決。不過此正正也是 Crashlytics 較優勝的地方,因為 ACRA/Acralyzer 現在似乎停止開發,相反 Crashlytics 則活力十足。

結語

試過有用戶跟你說「你的 app 不知為何 force close」,而你試過,但完全沒有問題嗎?這不是因為用戶的機器問題,而是你的 app 真的有問題,只是你不知道而已。Error reporting 是現今程式的必要功能,是除蟲的一大幫手。

比起 ACRA,Crashlytics 提供更好的 UI 和更多的服務。如果你不介意使用不是 open source 或使用其他人的 server 的話,Crashlytics 絕對是更好的選擇。

相關連結