Skip to content

Commit a43a31f

Browse files
authored
Make Sessions resilient to the FirebaseApp instance being deleted (#5238)
* Make Sessions resilient to the FirebaseApp instance being deleted * Remove listener when FirebaseApp deleted, and update log messages * Log as warning
1 parent 339cb42 commit a43a31f

File tree

4 files changed

+45
-5
lines changed

4 files changed

+45
-5
lines changed

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/DataCollectionArbiter.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,24 @@ public synchronized boolean isAutomaticDataCollectionEnabled() {
7575
final boolean dataCollectionEnabled =
7676
crashlyticsDataCollectionEnabled != null
7777
? crashlyticsDataCollectionEnabled
78-
: firebaseApp.isDataCollectionDefaultEnabled();
78+
: isFirebaseDataCollectionDefaultEnabled();
7979
logDataCollectionState(dataCollectionEnabled);
8080
return dataCollectionEnabled;
8181
}
8282

83+
/**
84+
* Determine whether automatic data collection is enabled or disabled by default in all SDKs.
85+
*
86+
* <p>If the FirebaseApp has been deleted, returns false.
87+
*/
88+
private boolean isFirebaseDataCollectionDefaultEnabled() {
89+
try {
90+
return firebaseApp.isDataCollectionDefaultEnabled();
91+
} catch (IllegalStateException ignored) {
92+
return false;
93+
}
94+
}
95+
8396
public synchronized void setCrashlyticsDataCollectionEnabled(@Nullable Boolean enabled) {
8497
if (enabled != null) {
8598
setInManifest = false;

firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformanceInitializer.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,26 @@
1515
package com.google.firebase.perf;
1616

1717
import com.google.firebase.perf.application.AppStateMonitor;
18+
import com.google.firebase.perf.logging.AndroidLogger;
1819

1920
/**
2021
* FirebasePerformanceInitializer to initialize FirebasePerformance during app cold start
2122
*
2223
* @hide
2324
*/
2425
public final class FirebasePerformanceInitializer implements AppStateMonitor.AppColdStartCallback {
26+
private static final AndroidLogger logger = AndroidLogger.getInstance();
2527

2628
@Override
2729
public void onAppColdStart() {
2830
// Initialize FirebasePerformance when app cold starts.
29-
FirebasePerformance.getInstance();
31+
try {
32+
FirebasePerformance.getInstance();
33+
} catch (IllegalStateException ex) {
34+
logger.warn(
35+
"FirebaseApp is not initialized. Firebase Performance will not be collecting any "
36+
+ "performance metrics until initialized. %s",
37+
ex);
38+
}
3039
}
3140
}

firebase-sessions/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Unreleased
22

3+
* [fixed] Made Sessions more resilient to the FirebaseApp instance being deleted.
4+
5+
# 1.0.1
6+
37
* [fixed] Fixed NPE when no version name is
48
set ([#5195](//github.com/firebase/firebase-android-sdk/issues/5195)).
59
* [fixed] Populate DataCollectionStatus fields for Crashlytics and Perf.

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessions.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ internal constructor(
7575
val appContext = firebaseApp.applicationContext.applicationContext
7676
if (appContext is Application) {
7777
appContext.registerActivityLifecycleCallbacks(sessionInitiator.activityLifecycleCallbacks)
78+
79+
firebaseApp.addLifecycleEventListener { _, _ ->
80+
Log.w(TAG, "FirebaseApp instance deleted. Sessions library will not collect session data.")
81+
appContext.unregisterActivityLifecycleCallbacks(sessionInitiator.activityLifecycleCallbacks)
82+
}
7883
} else {
7984
Log.e(
8085
TAG,
@@ -138,9 +143,18 @@ internal constructor(
138143
return
139144
}
140145

141-
sessionCoordinator.attemptLoggingSessionEvent(
142-
SessionEvents.startSession(firebaseApp, sessionDetails, sessionSettings, subscribers)
143-
)
146+
try {
147+
val sessionEvent =
148+
SessionEvents.startSession(firebaseApp, sessionDetails, sessionSettings, subscribers)
149+
sessionCoordinator.attemptLoggingSessionEvent(sessionEvent)
150+
} catch (ex: IllegalStateException) {
151+
// This can happen if the app suddenly deletes the instance of FirebaseApp.
152+
Log.w(
153+
TAG,
154+
"FirebaseApp is not initialized. Sessions library will not collect session data.",
155+
ex
156+
)
157+
}
144158
}
145159

146160
/** Calculate whether we should sample events using [sessionSettings] data. */

0 commit comments

Comments
 (0)