FirebaseのcrashとanalyticsをAndroidアプリで試してみる

5/20（金）に行われた[Gotanda.mobile #1](http://gotandamb.connpass.com/event/30705/)にて発表した内容＋αになります。

## 概要：Firebaseとは何か


２年ほど前にGoogleが買収したMBaaSです。現在行われているGoogle I/O 2016にて、Analyticsなどの機能追加が発表されました。特にPush機能が無料かつ無制限利用可能ということでも話題になっている（と思って）います。

今回はその中からcrashとanalyticsの一部を実装してみたので、導入方法をまとめます。なんで話題のpush（notification）でないかというと、調べてまとめる時間がなかったからです。

## 導入

### プロジェクトの新規作成

https://console.firebase.google.com/ にアクセスし、「CREATE NEW PROJECT」
をクリックしてプロジェクトの新規作成を行います。
今回は試していませんが、Google Developer Consoleで作成していたプロジェクトをインポートすることも可能なようです（多分GCMとかの移行用に使うのが正解なのかな）。

![スクリーンショット 2016-05-19 11.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/4560/afb6bddf-0d90-6ea6-4a5a-59a72c8a3692.png "スクリーンショット 2016-05-19 11.46.26.png")

### プロジェクトにアプリを登録する

当然ながら利用するアプリを登録しないと各種機能は使えません。「アプリの追加」から登録します。

![スクリーンショット 2016-05-19 11.49.25.png](https://qiita-image-store.s3.amazonaws.com/0/4560/d7b0c6dc-475d-6dad-f11c-bb24dd360d1e.png "スクリーンショット 2016-05-19 11.49.25.png")

証明書のSHA1入力に敷居を感じるところがありますが、今回はcrashとanalyticsだけなので入力は不要です（自分はちゃんと見ないで入力してしまいましたが、不要なはずです）。

### アプリにライブラリを導入する

Google Play Serviceを共用している部分もあるらしく、Google Play Serviceを追加しつつライブラリを導入します。

```gradle:(project)/build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'

        // これを追加します
        classpath 'com.google.gms:google-services:3.0.0'
    }
}
``` 

```gradle:(project)/(app)/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // これを追加

// ...

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'

    compile 'com.google.firebase:firebase-core:9.0.0'  // analyticsを実装
    compile 'com.google.firebase:firebase-crash:9.0.0' // crashを実装
}
```

Firebaseは使う機能ごとに追加するリポジトリが違います。公式ドキュメントの「Available libraries」を参考に、必要なリポジトリを追加しましょう。
https://firebase.google.com/docs/android/setup#add_the_sdk

## 実装

### analyticsの実装

analyticsは`FirebaseAnalytics`のインスタンスを作成し、そこにイベントの送信などを実装していきます。

現状、Google Analyticsにあるスクリーンやディメンション、指標らしきものを設定するものがありません（ユーザープロパティの設定はあります）。
なので細かい部分を見て行きたければ、まだGoogle Analyticsと併用が必要そうです。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    private FirebaseAnalytics mFirebaseAnalytics;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
        
        // ユーザープロパティの設定
        mFirebaseAnalytics.setUserProperty("key", "value");
    }
    
    // ...
    private void onButtonClick() {
        // イベントの送信
        Bundle params = new Bundle();
        params.putString(FirebaseAnalytics.Param.ITEM_ID, "10");
        params.putString(FirebaseAnalytics.Param.ITEM_NAME, "name");
        params.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "text");
        mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, params);
    }
```

イベントはBundleを送信する形で行われています。パラメータ部分はある程度用意されていますが、これを完全に無視して独自の形で送信することも可能です。

```java:MainActivity.java
    private void onButtonClick() {
        // イベントの送信
        Bundle params = new Bundle();
        params.putString("text_name", "logevent2");
        params.putString("text_data", "Hello Firebase Analytics");
        mFirebaseAnalytics.logEvent("send_text", params);
    }
```

![スクリーンショット 2016-05-20 15.56.52.png](https://qiita-image-store.s3.amazonaws.com/0/4560/e2456977-d1c0-1922-7027-e7d2217ad69d.png "スクリーンショット 2016-05-20 15.56.52.png")

analyticsの反映はGA同様、半日〜翌日ぐらいかかる印象です。
各イベント名をクリックすることで、設定した値がみれるようなのですが、まだ **独自形式で送ったデータの詳細が見ることができません** （ただの勘違いかもしれませんが）。

![スクリーンショット 2016-05-20 16.01.53.png](https://qiita-image-store.s3.amazonaws.com/0/4560/5e35e62e-83ae-bcfb-d1ca-059b65f02d03.png "スクリーンショット 2016-05-20 16.01.53.png")

※ コンテンツ部分。先ほどのソースで言うと `send_text` イベントはこちらが表示されなかったため、`text_data` にどんなデータが入っているのかを確認することはできませんでした。

### crashの実装

**ライブラリを実装した時点で対応完了です。** なのでソース上では特になにもする必要はありません。

ちなみにクラッシュが発生したタイミングで、レポート送信用のServiceを作ってデータを送る動作のようです。

![スクリーンショット 2016-05-19 18.13.54.png](https://qiita-image-store.s3.amazonaws.com/0/4560/a072c09d-8200-5e94-9475-5b2432bf80c9.png "スクリーンショット 2016-05-19 18.13.54.png")

またCrashlytics同様、独自にクラッシュレポートを送信したり、ログ情報をスタックすることもできます。

```java:MainActvity.java

// ログ情報のセット（送信ではない）
FirebaseCrash.log("Start Crash2");

// クラッシュレポートを送信する
FirebaseCrash.report(new Exception("Android non-fatal error"));
```

consoleへの反映は、１時間弱ほどかかりました。

![スクリーンショット 2016-05-20 16.12.58.png](https://qiita-image-store.s3.amazonaws.com/0/4560/1cac407d-b17f-dc50-da13-c461328f8469.png "スクリーンショット 2016-05-20 16.12.58.png")

consoleのcrash情報画面です。
`FirebaseCrash.report()` で送ったデータは「非致命的」として表示されています。

![スクリーンショット 2016-05-20 16.14.24.png](https://qiita-image-store.s3.amazonaws.com/0/4560/23770995-8cff-71ac-ddf4-dc735e60f5d9.png "スクリーンショット 2016-05-20 16.14.24.png")

![スクリーンショット 2016-05-20 16.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/4560/098d58bc-548b-3191-2159-643bac2e5947.png "スクリーンショット 2016-05-20 16.14.34.png")

各クラッシュ情報の詳細です。正直Crashlyticsより見やすいですね。（端末情報もこっちの方が多いかな）。

## まとめ

というわけでFirebaseでさっと導入できるanalyticsとcrashの紹介でした。
analyticsはまだ本格運用するには、取得できる情報が微妙かなっていう印象があります。
crashは現時点でも十分導入の敷居に対するメリットが強そうです。

とはいえ、どちらも他サービスを切り捨てるほどの力は正直感じないので（Crashlyticsでissueをcloseできるのは地味に便利ですし）、いったんは既存のサービスと併用運用しつつ、今後の利用方法を決めていくのが正解な気がしています。
導入コスト自体はとても軽い印象だったので、とりあえず入れてみてもいいじゃないでしょうか。

## 参考資料


- [Firebase](https://firebase.google.com/)
- [Firebase(document)](https://firebase.google.com/docs/)
- [Firebase at Google I/O 2016 - YouTube](https://www.youtube.com/playlist?list=PLl-K7zZEsYLlAyGS6_paVoGJ9YKC7J3NN)