【入門編】Crashlyticsの「Anrs(Application Not Responding)」検知機能の使い方とフリーズ対策 – 運用監視・オブザーバビリティ活用バイブル

エンジニアの皆さん、こんにちは。現場で「アプリが固まった」「操作を受け付けなくなった」という報告に頭を抱えたことはありませんか?

ユーザーにとって「アプリのフリーズ」は「アプリの死」と同義です。クラッシュはログが残りますが、ANR(Application Not Responding)は、ユーザーの苛立ちと共に静かに去っていく「見えない殺人鬼」です。

今日は、Firebase Crashlyticsを使って、このANRを完全に制御下に置くための、現場の知見を詰め込んだガイドを届けます。これをマスターすれば、あなたのアプリは「止まらない」という信頼を勝ち取ることができますよ。

—

1. なぜANRは「クラッシュ」よりもタチが悪いのか?

Androidにおいて、メインスレッド(UIスレッド)で5秒以上重い処理を行うと、OSが「このアプリは応答していない」と判断し、ANRダイアログを表示します。

CrashlyticsのANR検知は、単なるエラー収集ではありません。「どこでUIが窒息したか」を特定するための唯一無二の外科手術ツールです。

2. まずはここから:Crashlyticsのセットアップ(最短ルート)

初心者の方でも迷わないよう、最も本質的なステップだけを記します。

A. Firebaseへの接続

`build.gradle` (Project level) にGoogle Servicesプラグインを追記します。

buildscript {
dependencies {
// FirebaseとGoogle Servicesを繋ぐ要のプラグイン
classpath ‘com.google.gms:google-services:4.4.0’
classpath ‘com.google.firebase:firebase-crashlytics-gradle:2.9.9’
}
}

B. ライブラリの注入

`build.gradle` (App level) にライブラリを追加します。

dependencies {
// Firebaseの爆速基盤
implementation platform(‘com.google.firebase:firebase-bom:32.7.0’)
implementation ‘com.google.firebase:firebase-crashlytics’
implementation ‘com.google.firebase:firebase-analytics’
}

3. 【重要】HelloWorld的な動作確認

「ちゃんと動いているか不安」という状態が一番の敵です。以下のコードをボタンのクリックイベントなどに仕込んで、意図的にANRを発生させてみましょう。

// メインスレッドをあえて5秒間占有する「悪魔のコード」
button.setOnClickListener {
Thread.sleep(6000) // 5秒以上のフリーズをシミュレート
}

これを実行し、アプリをフリーズさせた後、一度アプリを完全に終了させてから再起動してください。Firebaseはアプリが再起動したタイミングでログを送信します。これを知らないと「データが送られてこない!」と焦ることになります。

—

4. 現場で震えるほど役立つ「ANR分析」の極意

Crashlyticsの管理画面にANRが表示されたら、以下の手順で「犯人」を特定してください。

1. スレッドダンプを見る:
ANR発生時、`main`スレッドのスタックトレースを確認します。「何待ちか」が必ず書いてあります。
2. ロックの競合を探す:
多くの場合、メインスレッドが「DBの書き込み」や「ネットワーク通信」の終了を待機しています。これがANRの9割の原因です。
3. 非同期化の徹底:
「メインスレッドでやっていいのはUIの描画だけ」。これ以外のすべては、`Coroutines` (Dispatchers.IO) や `RxJava` に追い出すのが鉄則です。

改善のチェックリスト

  • [ ] DBアクセス: `Room`のクエリはSuspend関数になっているか?
  • [ ] 画像読み込み: `Glide`や`Coil`を使っているか?(自前でBitmapをデコードしていないか?)
  • [ ] ロジック: `Thread.sleep()` がコードのどこにも存在しないか?

—

5. 先輩エンジニアからのアドバイス:フリーズさせない文化を作る

ANR対策は、ツールを入れるだけでは不十分です。開発者の意識を変える必要があります。

  • 「メインスレッドを汚すな」: チーム内で「メインスレッドでのブロックは死罪」という共通言語を持ってください。
  • 早期発見: Crashlyticsのダッシュボードを毎日チェックする習慣を。数件のANRは、大規模障害の予兆です。
  • 再現性の追求: ログに出たスタックトレースを元に、MonkeyテストやUI Automatorを使って再現コードを書く。これができれば、あなたは一人前のオブザーバビリティ・エンジニアです。

—

最後に

ANRは、あなたのアプリがユーザーと向き合っている時間を削り取ります。でも、Crashlyticsを正しく設定し、そのログと真摯に対峙すれば、フリーズは怖くありません。

「止まらないアプリ」を作ることは、ユーザーへの最大の敬意です。まずは今日、あなたのアプリに強制フリーズを仕込んで、Crashlyticsにどう映るのか確認してみてください。その小さな一歩が、明日の安定したリリースに繋がりますよ。

何か詰まったら、いつでも聞いてくださいね。応援しています!

タイトルとURLをコピーしました