免費的錯誤回報 - Crashlytics
之前介紹過使用 ACRA 來做 crash reporting,其實除了它外,還有 Crashlytics 可以選擇。在 ACRA 久沒有更新的情況下,是時候研究一下 Crashlytics。
Crashlytics 在 2014 年 10 月整合到 Fabric 的服務中,它支援 Android、iOS、Web 和 Mac OS X。跟 ACRA 一樣,Crashlytics 是免費的。只要在你的 app 設定好 Crashlytics,當 app 遇到例外錯誤時,便會自動回報到後台 server,讓開發者容易分析錯誤,找出原因。
以下文章只討論 Android 版,並會交替使用 Fabric 和 Crayshlytics。
功能
後台 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 來安裝的。
- 到 http://fabric.io 登記帳戶
- 安裝 Fabric plugin 到 IDE, plugin 支援 Eclipse、Android Studio 和 IntelliJ IDEA。
- 開啟 project ,按 plugin ,登入。
- Fabric plugin 會自行 install 到你的 project 中。安裝方式是以 gradle 進行,所以你的 project 不支援 gradle 的話便未必可以使用。
- Build,完成
那麼它的 plugin 其實做了什麼呢?根據觀察,它會:
- 修改
gradle.build
,加入 Crashlytics 相關的 library - 新增
fabric.properties
,內含apiSecret
- 在
AndroidManifest.xml
加進apiKey
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 絕對是更好的選擇。