Firebase series · Part 4 of 4

Firebase Crashlytics: Find and Fix Crashes Faster

Khairul Alam·October 2026·~8 min read
FirebaseCrashlyticsStabilityAndroid

A crash you cannot see is a crash you cannot fix. Crashlytics collects crashes from real devices, groups them by cause and tells you which ones hurt the most users. This is the overview; Google’s guide has the setup.

In 60 seconds
  • What: real-time crash and error reporting.
  • Groups thousands of crashes into a few issues, ranked by impact.
  • Context: stack trace, device, OS, custom keys, logs, user id.
  • Alerts: new issue, regression, velocity spike.
Contents
  1. What it is
  2. How a crash gets to you
  3. Reading an issue
  4. Adding context
  5. Non-fatal errors
  6. Alerts and workflow
  7. Limits and good habits

1. What it is

Crashlytics is a lightweight crash reporter. When your app crashes, the SDK saves the report and sends it at the next launch. The console then shows what broke, how often and for whom. It also records ANRs on Android, and crashes in Flutter, Unity and NDK code.

Crashlytics · Issues NullPointerException CartAdapter 4.8K IllegalStateException Checkout 930 OutOfMemoryError ImageLoader 211 ANR MainActivity.onResume 98
A sketch of the issues list, sorted by impact. The names and numbers are made up. (Illustration, not a screenshot.)

2. How a crash gets to you

App crashesfatal / non-fatal SDK on devicestack trace + keys Crashlyticsgroup by cause Alert Issue page
From a crash on a user’s phone to an alert and an issue you can act on.

3. Reading an issue

Similar crashes are grouped into one issue. Check the event and user counts first, then the version where it started, then the stack trace. Fix what affects the most users before you chase rare ones.

Issue: NullPointerException in CartAdapter.bind 4,812 events 1,903 users first seen in 2.5.0 Stack trace: CartAdapter.kt:84 ← RecyclerView.onBind Keys: screen = Cart Logs: tapped "Apply coupon"
What one issue contains: counts, the trace, and the context you attach with keys and logs.

Release builds are obfuscated, so upload the mapping file (the Gradle plugin does it for you) to see readable names instead of a.b.c.

4. Adding context

val c = Firebase.crashlytics
c.setUserId("u_123")           // use an id, not an email
c.setCustomKey("screen", "Cart")
c.log("tapped Apply coupon")   // breadcrumb

5. Non-fatal errors

Caught exceptions you still care about, like a failed parse or a bad server response, can be reported with recordException. They appear as non-fatal issues without crashing the app.

6. Alerts and workflow

7. Limits and good habits

Setup steps change often, so follow Google’s own guides rather than a copy here.

← Back to all writing