【Android】Firebase Crashlyticsを最速で実装する

Firebase Crashlyticsのβ版がリリースされました。
https://firebase.googleblog.com/2017/11/announcing-firebase-crashlytics-beta.html
<img width="813" alt="スクリーンショット 2017-11-11 17.42.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/7f84fd1b-8d03-558b-0a99-bb862924e870.png">

早速実装してみたいと思います。

## Get started with Firebase Crashlytics
https://firebase.google.com/docs/crashlytics/get-started
ドキュメント通りに追記します。

- project-level

```build.gradle
buildscripts {
    repositories {
        maven {
           url 'https://maven.fabric.io/public'
        }
    }
    dependencies {
        classpath 'io.fabric.tools:gradle:1.24.4'
    }
}

allprojects {
    repositories {
       maven {
           url 'https://maven.google.com/'
       }
    }
}
```

- app-level

```build.gradle
apply plugin: 'io.fabric'

dependencies {
    compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
       transitive = true
    }
    compile 'com.google.firebase:firebase-core:11.4.2'
}
```

## Crashlyticsの画面
設定前はこのような画面ですが、
![スクリーンショット 2017-11-11 15.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/38442/2d9ab4ea-e6e2-8153-f8b8-9a7841aa567a.png)

`build.gradle`を設定してBuild->Runすると、自動的に表示が変わります。
<img width="958" alt="スクリーンショット 2017-11-11 16.13.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/5995d68e-42d8-a7ae-7bb2-bea1c8beaa5f.png">

バグかわいい。
<img width="111" alt="スクリーンショット 2017-11-11 16.13.20のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/bb338f79-8d01-0349-30ff-88d5249ddf18.png">

## Test your implementation
https://firebase.google.com/docs/crashlytics/force-a-crash
故意にアプリをクラッシュさせて、クラッシュレポートを見てみましょう。

```MainActivity.kt
...

override fun onResume() {
    super.onResume()

    // Crashlytics CrashTest
    val crashButton = Button(this).apply {
        text = "crash!!"
        setOnClickListener {
            Crashlytics.getInstance().crash()
        }
    }
    addContentView(crashButton,
                   ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                          ViewGroup.LayoutParams.WRAP_CONTENT))

...
```

crash!!ボタンを押すと`java.lang.ArrayIndexOutOfBoundsException`で落ちます。

さて、Crashlyticsのコンソールですが、
![スクリーンショット 2017-11-11 18.02.43.png](https://qiita-image-store.s3.amazonaws.com/0/38442/8d1200c7-70a6-8462-1aed-08d5671e83b3.png)

・・・。

おや・・・

レポートが来ない・・・。

## Set up manual initialization
もう一度ドキュメントを読み返してみると、通ってきた手順とは別に設定がありました。
https://firebase.google.com/docs/crashlytics/upgrade-from-crash-reporting

こちらも一部参考にしてみます。

- `AndroidManifest.xml`に追記

```AndroidManifest.xml
<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false"/>
```

- `Fabric.with(this, Crashlytics())`追記

```MainActivity.kt
...

override fun onResume() {
    super.onResume()

    // Crashlytics CrashTest
    Fabric.with(this, Crashlytics())
    val crashButton = Button(this).apply {
        text = "crash!!"
        setOnClickListener {
            Crashlytics.getInstance().crash()
        }
    }
    addContentView(crashButton,
                   ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                          ViewGroup.LayoutParams.WRAP_CONTENT))

...
```

再度crash!!ボタンでアプリをクラッシュさせてみます。
![スクリーンショット 2017-11-11 18.14.29.png](https://qiita-image-store.s3.amazonaws.com/0/38442/232aec2d-31aa-53c8-59fb-a9a63102d156.png)

今度は上手くレポートが届きました！
![スクリーンショット 2017-11-11 18.16.41.png](https://qiita-image-store.s3.amazonaws.com/0/38442/b7d343c4-c92d-01bc-fe66-0fd01fd60e9c.png)

## まとめ
少しドキュメントの設定とは違いましたが、無事Crashlyticsのレポートを表示することができました。
環境によって手順が変わるかもしれないので、引き続き調査してみたいと思います。

一つ注意点ですが、<b>クラッシュレポートはクラッシュした後の次回アプリ起動時に送信されます。</b>

>When testing, reopen your app after pressing the button to crash it to make sure Crashlytics has a chance to report the crash. The report should appear in the Firebase console within five minutes.

なので、クラッシュのテストを行う際は、

- アプリをクラッシュさせる。
- アプリをkillして、再起動する。
- Crashlyticsのコンソールを確認する。

の手順がよさそうです。:thumbsup: