AI-powered crash analysis is now available on all plans — including Free.Read the crash analysis guide

How to Find React Native Crashes That Only Happen on Android

NFNourin Mahfuj Finick··9 min read

Some of the most frustrating React Native bugs are the ones that crash on Android but work fine on iOS — or worse, only crash on specific Android devices. Unlike iOS where a handful of Apple devices cover 95% of your users, Android runs on thousands of device and OS combinations, each with potential OEM customizations that can break code that works perfectly everywhere else.


This guide covers the main causes of Android-only crashes, how to reproduce them without owning every device, and how to fix them systematically.


Why Android-Only Crashes Happen


1. OEM customizations to the Android framework


Samsung, Xiaomi, Huawei, and other OEMs ship Android with modifications to the base framework. These modifications sometimes change behavior in ways the original Android APIs don't document. Common examples:


  • Samsung's memory management kills background processes more aggressively than stock Android
  • Xiaomi's MIUI restricts background service permissions by default
  • Huawei devices ship without Google Play Services, breaking Firebase and GMS-dependent code
  • OnePlus devices have a "freezer" mechanism that terminates apps differently

2. API level differences


React Native supports Android API levels going back several versions. Code that works on API 33 (Android 13) may fail on API 28 (Android 9) because of API changes or permissions that were introduced later.


// This crashes on Android API < 29
import { PermissionsAndroid } from 'react-native';
const granted = await PermissionsAndroid.request(
  PermissionsAndroid.PERMISSIONS.ACCESS_BACKGROUND_LOCATION
  // ACCESS_BACKGROUND_LOCATION didn't exist before API 29
);

3. Architecture differences (arm vs x86)


Android devices run on ARM64 (most phones), ARMv7 (older phones), or x86/x86_64 (emulators and some Chromebooks). Native modules compiled for one architecture can crash on another. The ABIs in your APK must include all targets you support.


4. 64-bit vs 32-bit memory limits


32-bit Android apps are limited to 4GB of virtual address space, with typically 512MB–1.5GB of usable memory. 64-bit apps have much higher limits. If your APK only ships the 32-bit ABI (armeabi-v7a) and runs on a 64-bit device in 32-bit mode, you may hit memory limits that don't occur on iOS or modern 64-bit Android.


5. Google Play Services availability


Apps using Firebase, Google Maps, or any GMS API will crash if Google Play Services is absent or outdated. Common on Huawei HMS devices (2019+) and older Android Go devices.


How to Isolate Android-Only Crashes


Step 1: Check crash metadata in your reporter


Open BugsPulse (or your crash reporter) and filter by platform = Android. Then look at the distribution by:


  • Device model — Is the crash clustered on Samsung or Xiaomi devices only?
  • OS version — Is it only Android 10 and below?
  • App version — Was it introduced in the last release?
  • Session path — What screen and API call preceded the crash?

If 90% of crashes come from Samsung Galaxy A-series devices running Android 10, you have a strong reproduction target.


Step 2: Reproduce on a real device or cloud device farm


For Android-specific bugs, you need real hardware or a service that provides it. Options:


  • AWS Device Farm — Test on real Android devices in the cloud
  • BrowserStack App Automate — Real device testing with manual and automated options
  • Firebase Test Lab — Run on Google's device lab

If the crash is Samsung-specific: Samsung has a free Remote Test Lab (developer.samsung.com/remotetestlab).


Step 3: Enable verbose logging for the affected device class


import { Platform } from 'react-native';
import BugsPulse from '@bugspulse/react-native';

// Tag sessions with device info for better filtering
BugsPulse.setTag('device_brand', Platform.OS === 'android' ? 'android' : 'ios');

if (Platform.OS === 'android') {
  const DeviceInfo = require('react-native-device-info');
  BugsPulse.setTag('android_api_level', String(DeviceInfo.getApiLevelSync()));
  BugsPulse.setTag('device_manufacturer', DeviceInfo.getManufacturerSync());
}

With these tags, you can filter crash reports to exactly "Samsung + Android 10 + API 29" sessions.


Common Android-Only Crash Patterns and Fixes


BackgroundActivityStartNotAllowed


Android 12+ restricts apps from starting activities from the background. If you trigger navigation from a push notification handler or a background timer, you'll get this crash.


android.app.BackgroundServiceStartNotAllowedException:
Not allowed to start service Intent from background

Fix: Use PendingIntent for notification actions, ensure navigation is triggered on the main thread, and check AppState before launching activities from background handlers.


NullPointerException in native modules


A native module method is called before its underlying Android system service is ready. Common in camera, contacts, and location modules.


java.lang.NullPointerException: Attempt to invoke virtual method on null object reference
  at com.example.SomeNativeModule.doSomething

Fix: Check that required permissions are granted before calling the module. Use PermissionsAndroid.check() first, not just request() — the user may have previously denied.


Text rendering crash on older API levels


android.graphics.Canvas: trying to use a recycled bitmap

Seen on Android 8 and 9 with certain font and emoji combinations. The Android text layout engine behaves differently on older API levels.


Fix: Wrap text-heavy components in a try-catch and add fallback rendering. Check if react-native-fast-image or custom fonts are recycling bitmaps.


FileUriExposedException (Android 7+)


Passing file:// URIs to other apps causes a crash on Android 7+ (API 24+). You must use content:// URIs via a FileProvider.


android.os.FileUriExposedException: file:///... exposed beyond app through Intent.getData()

Fix: Use react-native-fs or the content:// scheme when sharing files between apps. Configure a FileProvider in AndroidManifest.xml.


The Android Fragmentation Debugging Checklist


When you get an Android-only crash, work through this list:


1. Filter crash reports by device manufacturer — is it manufacturer-specific?

2. Filter by API level — is it version-specific?

3. Check whether the crash path involves permissions, file access, or system services

4. Check whether Google Play Services is involved (will fail on Huawei/HMS)

5. Reproduce on a real device matching the crash profile

6. Add manufacturer and API level as crash metadata tags

7. Test the fix on the same device class before shipping


Android fragmentation is a fact of mobile development. The teams that handle it best are the ones with crash data granular enough to pinpoint the exact device/OS combination — so they can reproduce and fix it rather than guessing.