Firebase Crashlyticsを導入する

# はじめに
**Firebase Crashlytics** を軽く試してみたのでまとめます。
組込先はAndroidアプリです。

# ところでFirebase Crashlyticsって何だっけ
[公式](https://firebase.google.com/docs/crashlytics/) によると次の通り。

> Firebase Crashlytics は軽量なリアルタイムのクラッシュ レポート ツールで、アプリの
> 品質を低下させる安定性の問題を追跡し、優先順位を付け、修正するのに役立ちます。

これにより公開したアプリがエンドユーザー端末でクラッシュした際の解決の手がかりが得られます。
レポートは例えば次のような感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/a96b96c1-8b39-f81a-0e14-06d48943a9ae.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/40cd33fb-1eee-4008-9e03-963269df6b6f.png)

# Firebase Crash Reporting と Firebase Crashlytics と FabricのCrashlytics
Firebaseは以前はクラッシュレポートツールとして **Crash Reporting** を提供していましたが、これは
非推奨となり代わりに **FabricのCrashlytics** を[ベースにした](https://japan.cnet.com/article/35095194/) **Firebase Crashlytics** が推奨となっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/81c4941c-c524-0508-ab18-0418267f3e08.png)

なお **Fabric** の **Crashlytics** は現在も導入可能ですが、**Firebase** とは管理画面および導入手順が異なっています。

# Firebase Crashlyticsの導入方法は２パターン
次の２パターンがあるようです。

- [Fabric](https://fabric.io/) の [お作法](https://fabric.io/kits/android/crashlytics/install) でFabricでデータ収集してそれを [Firebase に渡す](https://fabric.io/firebase_migration)。
- 最初から Firebase でデータ収集する。

前者は既に **FabricのCrashlytics** を導入済みのアプリの救済策
（なのではないかと思った）ので今回は後者でやります。

# そんなわけで試してみる
そんなわけで試してみます。 (`･ω･´)ゞ

### ざっくりとした導入の流れ
次の通り。

> (1) 適当なAndroidアプリを用意する
> (2) Firebaseのアカウント（と適当なプロジェクト）を用意する
> (3) アプリとFirebaseを接続する
> (4) アプリにCrashlyticsを導入する
> (5) 自爆ボタンを作る
> (6) Crashlyticsの画面で設定を行いテストする

### (1) 適当なAndroidアプリを用意する
何でもいいので適当に作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/c899b9aa-bad4-6269-dd82-8cc5fb1d81cb.png)

### (2) Firebaseのアカウント（と適当なプロジェクト）を用意する
[適当に作ります。](https://firebase.google.com/?hl=ja) 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/5ff0d735-15cc-b4c4-af68-6a4b2d5ac9ab.png)

### (3) アプリとFirebaseを接続する
[公式のここ](https://firebase.google.com/docs/android/setup?hl=ja) に記載されている手順で接続します。

公式では [Firebase Assistant](https://developer.android.com/studio/write/firebase?hl=ja) を使うとラクだと書いてありますが、
何が行われるのかわかりにくいため、手動でやります。

手動でもFirebaseの管理画面に出てくるフローに従って作業するだけです。
具体的には次の通り。

> (3-1) アプリの登録
> (3-2) 設定ファイルのダウンロード
> (3-3) Firebase SDK の追加
> (3-4) アプリを実行してインストールを確認

#### (3-1) アプリの登録

まずフローの画面に移動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/d77e2e69-8dba-d694-ad95-2230b489a684.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/743bd8fd-2bbd-eca7-560c-95424295f486.png)

そしてアプリのパッケージ名をFirebaseプロジェクトに登録します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/495b743f-18eb-0321-ee87-62f50b163802.png)

#### (3-2) 設定ファイルのダウンロード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/013536ee-1b5e-2718-4938-1059c8a540c7.png)

#### (3-3) Firebase SDK の追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/36773409-15e9-4363-b766-6ae28f88b2de.png)

#### (3-4) アプリを実行してインストールを確認
これまでの作業でローカルのソースには **google-services.json** が追加され、
プロジェクトとアプリレベルの **build.gradle** にそれぞれ追記が行われました。

フローを進め、その後アプリを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/0fb2c509-f480-c18f-0b6f-4116be116d86.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/e803682a-775c-724b-415e-a5a90dfbd8dc.png)

以上で接続完了です。

### (4) アプリにCrashlyticsを導入する

[公式のここ](https://firebase.google.com/docs/crashlytics/get-started?hl=ja) を参考にプロジェクトレベルとアプリレベルの build.gradle にそれぞれ追記します。

#### プロジェクトレベル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/28cce988-4368-ed11-6d87-618c30e50b16.png)

#### アプリレベル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/6eed5172-f1fb-6a72-bf2a-ce07c6eafeff.png)

この手順は各 **build.gradle** に上記を追記するだけで完了です。

Fabricのように**AndroidManifest.xml** や **Activity#onCreate()** を
いじらなくてもいいです。

これでアプリがクラッシュするとFirebaseにレポートが送信されます。

### (5) 自爆ボタンを作る

アプリがクラッシュしないとテスト出来ないため、適当に自爆ボタンを作ります。
画面を適当に作り・・
![Screenshot_20190124-160631.png](https://qiita-image-store.s3.amazonaws.com/0/26808/65d99181-816b-f52e-7876-1d84a938cfe2.png)

ソースが[次のような感じ](https://firebase.google.com/docs/crashlytics/force-a-crash?hl=ja#android)。

```kotlin:MainActivity.kt
package com.example.orenobug

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity;
import android.widget.Button
import com.crashlytics.android.Crashlytics

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<Button>(R.id.jibaku_button) .setOnClickListener { view ->
            Crashlytics.getInstance().crash()
        }
    }
}
```

出来たら何回かクラッシュさせてみてください。

### (6) Crashlyticsの画面で設定を行いテストする

(5) まで行った結果、Project Overview に下図のようにサマリーが出ました。
しかし Crashlytics にはまだ出てきません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/4584eb8e-0174-526c-d0f2-6543dedf5323.png)

そこでCrashlyticsのタブで次のように設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/e7cab452-5aea-1c45-9fad-355506f243e6.png)

次の画面でSDKをインストールするよう指示されますがこれは (4) で済んでいます。
この状態でアプリを起動して何回かクラッシュさせてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/2d422bec-8984-8ba1-4962-c9ff6ccd92e8.png)

すると、冒頭のスクショようなレポートが出てくるようになります。

以上で完了です。

# かんそう

歴史的な経緯（？）から導入がややこしいことになってるなと思いました。

また既にFabricのCrashlyticsでいい感じにデータが取れている場合は
FabricとFirebaseをリンクさせた方がラクです。

この場合はアプリは修正不要で管理画面でポチポチするだけでよい（っぽいです）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/7454e7ae-16d1-f495-a399-cad012d5c92d.png)

現場からは以上です。