Crashlyticsとは?
CrashlyticsはAndroid, iOSのアプリ開発向けにクラッシュレポートなどの情報をレポートしてくれるウェブサービスです。Android, iOS向けに簡単に組込みができるライブラリも準備されています。レポートを見る画面などは以下のようにとても綺麗にデザインされており、いま風なUIになっています。
アカウント作成
トップページの上記の項目に名前とメールアドレスを入力するとアカウント登録が行えます。但し、アカウント登録はすぐに完了するわけではなく、名前とメールアドレスを入力するとwaiting listに掲載されるようで、後日メールでアカウント登録の返事が届きます。
私の場合は夜に実施して、翌朝起きたら以下のようなHTMLメールが届いていて、アカウント登録ができました。
Android向けのSDKの入手
アカウント登録後にCrashlyticsにログインして、Android用のSDKを入手します。以下のようにAndroid Stdio用、Eclipse用、Intelli J用の3種類が用意されています。今回は Eclipse用を利用します。
Eclipseの場合、eclipse pluginの形式でSDKが提供されます。インストールは簡単で、eclipse pluginをインストールする方法の
Eclipseのメニューの以下のように Help -> Install New Softwareから選択し、「https://crashlytics.com/download/eclipse」を入力します。
あとは、Eclipse pluginの仕組みにのっとってインストールを行います。インストールが完了すると以下のようにツールバーに Crashlytics のアイコンが表示されます。
Eclipse ProjectへのSDKの適用
アイコンをクリックして、Crashlytics にログインします。
Eclipse Package Explorer で表示されているプロジェクトが以下のように表示されるため、Crashlytics の SDKをインストールしたい Project を選択します。
ここからが素晴らしいポイントなのですが、このpluginは libs フォルダへのcrashlytics.jarのインストールだけでなく、いくつかの必要なコードの追加まで自動的に実施してくれます。但し、これによる副作用もあるため、それについては後述します。
自動的に追加してくれるコードは以下のものになります。
- AndroidManifest.xml の中に <uses-permission android:name=”android.permission.INTERNET” />と <meta-data android:name=”com.crashlytics.ApiKey” android:value=”?????????”/> の追加。(????の部分はpluginが自動的に適切な値をいれてくれます)
- ホームアプリから起動されるActivity の onCreate() の中に Crashlyticsの初期化コードを追加。具体的には、Crashlytics.start(this); の1行。
- res/values/com_crashlytics_export_strings.xml ファイルを自動的に追加。中身がビルドするたびに変更されるため、SCMの管理対象外とします(.gitignore に追加)
なお、追加される API key の発行がアプリ単位ではなく、Company 単位だそうです。
自動的に追加された状態でアプリ内で発生した Exception などの情報をCrashlytics SDKが取得して裏でWebサービスへのアップロードを実施してくれます。自分の検証だけでは発見しづらい、環境面による Exception などの情報をウェブサービスや Pluginから見れるようになります。しかも、Daily でメールで1日のcrash情報のサマリーが送られてくるので忘れずに確認することができます。
注意点
Pluginが上記のように自動的に必要なコードを追加してくれるのはうれしいことなのですが、以下のような課題もあるため注意が必要です。
- 文字化け対策
- 初期化コードの追加漏れの対策
文字化け対策
コメントなどに日本語が入ったソースコード(UTF8で保存済)に対して、Eclupse Crashlytics pluginが自動的にコードが追加した場合に文字化けが発生。そのため、そのような場合は、手動で初期化コードを追加しましょう。Crashlytics.start(this);を追加する場所は、onCreate() の super.onCreate(savedInstanceState); の後で setContentView(R.layout.detail_main);の前に追加されるようなので、その場所がよいでしょう。
初期化コードの追加漏れの対策
ホームアプリから起動されるだけでなく、Intent 連携などで起動されるアプリの場合、その起動されるActivity(*2) の onCreate()などの中に手動でCrashlytics.start(this);を追加しましょう。起動されるActivity(*2) がホームアプリから起動されるActivity(*1) の次に呼び出される場合とIntent連携で直接呼び出される場合がある場合でも、Crashlytics.start(this);の中で適切な処理が実施されており、2回呼び出されても問題ないそうです。
試しに Crash を起こしてみる
正しく crash が通知されるかどうかを確かめるために、onCreate()の中でわざとexception を追加して、crash report を受領してみましょう。
以下のようなコードを onCreate()の最後に追加します。
throw new RuntimeException("This is a crash");
追加したあとに eclipse からビルド、インストール、実行をすると起動時にexceptionが発生します。その後、http://www.crashlytics.com/にログインすると、以下のように確認できます。
レポートの中身
レポート画像には以下の情報が記載されます。
- クラッシュの発生日付と数
- 端末の種類
- OS Version
- 端末のルート化の有無
- 内部ストレージの容量、割合
- RAMの容量、割合
- APP IN FOCUS(?)(想像:ユーザが利用中に発生した or 裏で発生したかどうか)
- PROXIMITY IN(?)(近接センサーの設定有無)
- 端末の向き
- バッテリー残量
- クラッシュ時のスタックトレース
しかも、crash report はウェブサービスだけでなく、以下のように Eclipse の Crashlytics pluginからも閲覧可能です。pluginから該当する crash を選択するとウェブサービスのほうで詳細なレポートを確認できます。
クラッシュレポート以外の利用方法
クラッシュレポート以上の使い方として、自由に任意のString, Bool, Double, Float, Int などを保存し、レポートに送信することもできるので、Google Analytics for Android のような特定のActivityが起動されたコンバージョンや閾値を超えた場合のレポートなどにも利用できます。
Crashlytics.setString(key, value);
void setBool(String key, boolean value); void setDouble(String key, double value); void setFloat(String key, float value); void setInt(String key, int value);
Crashlytics.setInt("current_level", 3); Crashlytics.setString("last_UI_action", "logged_in");
まとめ
このサービスをいれてクラッシュレポートが来ると、なぜだかうれしくなり、すぐに修正して、issue を close したくなりますね。それはつまり、いままでユーザの手元で起こっていたexceptionをいままで開発者が知ることもなしに、ユーザの満足度を下げていたことの表れだと思うとユーザに申し訳なく思いますし、会社のアプリだとするとそれだけで競争力の低下につながってしまいます。実際に利用してみるとプロジェクトへの適用の簡便さ、クラッシュレポートのリアルタイム性、レポートの見易さなどがとても良いと感じました。まだ小さな課題はいくつもあるものの、Android Stdio向けのサポートも用意しているということでまだまだ前に進んでいってくれるサービスだと思います。このCrashlyticsはtwitter が買収したこともあり、無料で商用レベルの機能が利用でき、大きな後ろ盾があるため、安心して利用していけると思います。これからのさらなる進化が楽しみです。
Crashlytics は大変便利で有用