From 80308d1501255ef6b269c1251b093998100630d2 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Mon, 30 Mar 2026 11:25:15 +0100 Subject: [PATCH] fix(perf): add null check in case trace, screenTraces & httpMetric SparseArrays are cleared during module teardown --- .../firebase/perf/UniversalFirebasePerfModule.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java b/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java index e66f446ad8..5333b73cdf 100644 --- a/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java +++ b/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java @@ -83,6 +83,10 @@ Task stopTrace(int id, Bundle metrics, Bundle attributes) { return Tasks.call( () -> { Trace trace = traces.get(id); + // Traces can be cleared during module teardown before JS stops them. + if (trace == null) { + return null; + } Set metricKeys = metrics.keySet(); Set attributeKeys = attributes.keySet(); @@ -119,6 +123,10 @@ Task stopScreenTrace(int id) { return Tasks.call( () -> { ScreenTrace trace = screenTraces.get(id); + // Screen traces can be cleared during module teardown before JS stops them. + if (trace == null) { + return null; + } trace.sendScreenTrace(); screenTraces.remove(id); @@ -140,6 +148,10 @@ Task stopHttpMetric(int id, Bundle httpMetricConfig, Bundle attributes) { return Tasks.call( () -> { HttpMetric httpMetric = httpMetrics.get(id); + // HTTP metrics can be cleared during module teardown before JS stops them. + if (httpMetric == null) { + return null; + } if (httpMetricConfig.containsKey("httpResponseCode")) { httpMetric.setHttpResponseCode((int) httpMetricConfig.getDouble("httpResponseCode"));