(Android) Expo Bare workflow に Firebase Crashlytics を導入する
Firebase Crashlytics を使うとアプリがクラッシュした際にエラーレポートを送信することができる。
iOS に導入する手順は(iOS) Expo Bare workflow に Firebase Crashlytics を導入する に以前書いた。今回は Android アプリに Firebase Crashlytics を導入する手順について書く。
環境
- Expo SDK 44
- custom development client 利用
- Firebase コンソールからアプリを登録済み
- Android Studio (Emulator) でアプリを起動
パッケージインストール
公式ドキュメントの手順通りにパッケージをインストールする。Firebase のサービス自体を初めて利用する場合は、@react-native-firebase/app
のインストールが必要。
// 未インストールの場合 yarn add @react-native-firebase/app yarn add @react-native-firebase/crashlytics
Android 向けのセットアップ
iOS では不要だったが、Android のビルド向けに設定が必要。手順は、Crashlytics - Android Setup の 1~4 を参照。
firebase.json を作成する
省略(iOS 導入の記事参照)
テストクラッシュを起こす実装をする
省略(iOS 導入の記事参照)
アプリをビルドし起動する
EAS Build 等を利用してアプリをビルドし Android Emulator で起動する。
正常に Crashlytics がレポート送信を行っていることを確認するため、Android Studio でログを表示する。ログの表示方法は、logcat を使用してログを書き込み、表示するを参照。
クラッシュを発生させる
自分の環境だと、crashlytics().crash()
ではレポートを送信することができなかった。クラッシュを実行すると以下の画面が表示される。
ログは以下になる。
2022-02-08 18:31:04.712 14816-15028/appId E/DevLauncher: DevLauncher tries to handle uncaught exception. java.lang.RuntimeException: Crash Test at io.invertase.firebase.crashlytics.ReactNativeFirebaseCrashlyticsModule$1.run(ReactNativeFirebaseCrashlyticsModule.java:83) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226) at java.lang.Thread.run(Thread.java:923)
どうやら先にエラーをキャッチされてしまっているようである。
一方で、JS エラー(throw new Error()
) を起こした場合は以下のログが表示されアプリはクラッシュした。
2022-02-08 18:52:44.727 16610-16947/appId D/RNFBCrashlyticsInit: isCrashlyticsCollectionEnabled final value: true 2022-02-08 18:52:44.738 16610-16947/appId E/Crashlytics: Crash logged. Terminating app.
アプリを再起動して少し待つと、Firebase コンソールからは以下のようなレポートを閲覧できる。(なお、JS エラーをレポート送信するかどうかは firebase.json で設定可能)
まとめ
Expo Bare workflow を利用した Android アプリに Firebase Crashlytics を導入する手順を書いた。
development client を利用していると、ネイティブコードのエラーを正常にレポート送信することはできなかった。stand alone にビルドしていればクラッシュすると思うので正常にレポート送信は行われるのではないかと予想している。この点については今後検証したい。