Skip to content

Commit 5b10051

Browse files
Fireperf: fix screen trace in multi-activity apps (#3311)
* mstop screen trace in onPause * onActivityPostPaused * fix test * fix test typo * add debug message
1 parent cdab5fc commit 5b10051

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,6 @@ public synchronized void onActivityStarted(Activity activity) {
163163

164164
@Override
165165
public synchronized void onActivityStopped(Activity activity) {
166-
if (isScreenTraceSupported(activity)) {
167-
sendScreenTrace(activity);
168-
}
169-
170166
// Last activity has its onActivityStopped called, the app goes to background.
171167
if (activityToResumedMap.containsKey(activity)) {
172168
activityToResumedMap.remove(activity);
@@ -295,6 +291,14 @@ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
295291
@Override
296292
public void onActivityPaused(Activity activity) {}
297293

294+
/** Stops screen trace right after onPause because of b/210055697 */
295+
@Override
296+
public void onActivityPostPaused(@NonNull Activity activity) {
297+
if (isScreenTraceSupported(activity)) {
298+
sendScreenTrace(activity);
299+
}
300+
}
301+
298302
/**
299303
* Send screen trace. If hardware acceleration is not enabled, all frame metrics will be zero and
300304
* the trace will not be sent.
@@ -321,6 +325,11 @@ private void sendScreenTrace(Activity activity) {
321325
* FrameMetricsAggregator#remove(Activity)} will throw exceptions for hardware acceleration
322326
* disabled activities.
323327
*/
328+
try {
329+
frameMetricsAggregator.remove(activity);
330+
} catch (IllegalArgumentException ignored) {
331+
logger.debug("View not hardware accelerated. Unable to collect screen trace.");
332+
}
324333
SparseIntArray[] arr = frameMetricsAggregator.reset();
325334
if (arr != null) {
326335
SparseIntArray frameTimes = arr[FrameMetricsAggregator.TOTAL_INDEX];

firebase-perf/src/test/java/com/google/firebase/perf/application/AppStateMonitorTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public void screenTrace_twoActivities_traceStartedAndStoppedWithActivityLifecycl
369369
monitor.onActivityStarted(activity);
370370
assertThat(monitor.getActivity2ScreenTrace()).hasSize(1);
371371
currentTime = endTime;
372-
monitor.onActivityStopped(activity);
372+
monitor.onActivityPostPaused(activity);
373373
Assert.assertEquals(0, monitor.getActivity2ScreenTrace().size());
374374
}
375375
}
@@ -421,7 +421,7 @@ public void screenTrace_perfMonEnabledSwitchAtRuntime_traceCreationDependsOnRunt
421421
monitor.onActivityStarted(activityWithNonHardwareAcceleratedView);
422422
assertThat(monitor.getActivity2ScreenTrace()).hasSize(1);
423423
currentTime = 200;
424-
monitor.onActivityStopped(activityWithNonHardwareAcceleratedView);
424+
monitor.onActivityPostPaused(activityWithNonHardwareAcceleratedView);
425425
assertThat(monitor.getActivity2ScreenTrace()).isEmpty();
426426

427427
// Case #2: developer has disabled Performance Monitoring during runtime.
@@ -431,7 +431,7 @@ public void screenTrace_perfMonEnabledSwitchAtRuntime_traceCreationDependsOnRunt
431431
monitor.onActivityStarted(activityWithNonHardwareAcceleratedView);
432432
assertThat(monitor.getActivity2ScreenTrace()).isEmpty();
433433
// Confirm that this doesn't throw an exception.
434-
monitor.onActivityStopped(activityWithNonHardwareAcceleratedView);
434+
monitor.onActivityPostPaused(activityWithNonHardwareAcceleratedView);
435435
}
436436

437437
@Test

0 commit comments

Comments
 (0)