EEltaCrew
Home › Blog

The crashes Crashlytics didn't show: it only sees the builds you added it to

Published 2026-10-08Measured 2026-09-22About 3 min readelta · EltaCrew

Three days after adding Firebase Crashlytics to 21 apps, we found a user-facing crash in Play Console first. Crashlytics only reports from builds that include the SDK, and crashes from older versions still on users' phones pile up only in Play vitals. Results from checking all 21 apps, and the order we check in now.

The crash emails were quiet

Starting with builds made on September 18, we added Firebase Crashlytics to the 21 apps we run. Crashes send an email, and the five that came in on day one were fixed that day. After that the emails mostly stopped, and we took it to mean there weren't many crashes.

On September 21, a crash in our markdown viewer app turned up in Play Console. Four users had the app close with an IOException while creating a file, on version 1.0.22 and earlier. Crashlytics had nothing.

Why it wasn't visible

Crashlytics only reports crashes from builds that include its SDK. Obvious, but in practice it matters a lot.

So right after adding Crashlytics, quiet email doesn't mean "no crashes". It means "not many people are on the new version yet".

All 21 apps: 8 had crashes

On September 22 we opened vitals for all 21 apps in Play Console, one by one. Period: the last 28 days, with the default "user-perceived" filter removed. With that filter on, you only see crashes classified as ones the user directly experienced.

The biggest one was shared by three of our TV remote apps.

java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission
    at ...ble.HidPeripheral.start

Starting Bluetooth remote mode without the Bluetooth connect permission granted closed the app. In the main clusters that was 25 users across the three apps (10, 9 and 6), on every version from 1.2.2 up to 1.2.10, which was live at the time. Only one of those, on 1.2.10, had arrived as a Crashlytics email.

Other apps looked similar.

What we fixed

For the remote apps (four apps sharing the same code), version 1.2.12 on September 22 closed three paths.

The order we check in now

  1. Same-day crashes: Crashlytics. Email and console are close to real time.
  2. Everything live: Play vitals. Remove the "user-perceived" filter and look at the version column. If a fixed crash only shows on old versions, it fades as people update. If it shows on the current version, it needs a new fix.
  3. We also read vitals through the API. Play Developer Reporting API errorReports:search returns the full stack trace (reportText). Vitals data arrives about a day late, so today's crashes aren't there yet.
  4. If the weekly report shows a non-zero crash count, open the cluster right there. Per-app crash counts were already in our weekly report before all this. Copying the numbers without opening them was the real cause.

Takeaways

One of the apps in this post is Genie TV Remote (Google Play).

AndroidCrashlyticsPlay ConsoleAndroid vitalsCrashes

Related

The day a sync deleted 8,802 stores: one renamed API field and a 100-row listIn our lottery retailer map app, a sync turned every store name into "Unknown" and wiped the 8,802 stores bundled with the app. Three causes — a renamed field in a public data API, a sync that deleted rows based on only the first 100 results, and a geocoder reading keys that do not exist — and how each was fixed.Why users quit at the TV pairing code screen: a 6-character code and a Korean keyboardAfter fixing a pairing bug in our TV remote app, the share of users who cancelled on the code entry screen went from 9% to 19%. How the GA4 failure reasons were read, how one input field turned out to open the Korean keyboard, and what was changed.dispatchDetachedFromWindow NullPointerException: tracking an Android crash with none of my code in the stackMdViewer hit a NullPointerException whose stack trace contained only framework frames. The cause was one line that removed a sibling view inside onDetachedFromWindow, combined with how a parent ViewGroup walks its child array. How it was reproduced, why it happens and how it was fixed.