Skip to content

Fireperf: fix screen trace in multi-activity apps #3311

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,6 @@ public synchronized void onActivityStarted(Activity activity) {

@Override
public synchronized void onActivityStopped(Activity activity) {
if (isScreenTraceSupported(activity)) {
sendScreenTrace(activity);
}

// Last activity has its onActivityStopped called, the app goes to background.
if (activityToResumedMap.containsKey(activity)) {
activityToResumedMap.remove(activity);
Expand Down Expand Up @@ -292,6 +288,14 @@ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityPaused(Activity activity) {}

/** Stops screen trace right after onPause because of b/210055697 */
@Override
public void onActivityPostPaused(@NonNull Activity activity) {
if (isScreenTraceSupported(activity)) {
sendScreenTrace(activity);
}
}

/**
* Send screen trace. If hardware acceleration is not enabled, all frame metrics will be zero and
* the trace will not be sent.
Expand All @@ -318,6 +322,11 @@ private void sendScreenTrace(Activity activity) {
* FrameMetricsAggregator#remove(Activity)} will throw exceptions for hardware acceleration
* disabled activities.
*/
try {
frameMetricsAggregator.remove(activity);
} catch (IllegalArgumentException ignored) {
logger.debug("View not hardware accelerated. Unable to collect screen trace.");
}
SparseIntArray[] arr = frameMetricsAggregator.reset();
if (arr != null) {
SparseIntArray frameTimes = arr[FrameMetricsAggregator.TOTAL_INDEX];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ public void screenTrace_twoActivities_traceStartedAndStoppedWithActivityLifecycl
monitor.onActivityStarted(activity);
assertThat(monitor.getActivity2ScreenTrace()).hasSize(1);
currentTime = endTime;
monitor.onActivityStopped(activity);
monitor.onActivityPostPaused(activity);
Assert.assertEquals(0, monitor.getActivity2ScreenTrace().size());
}
}
Expand Down Expand Up @@ -419,7 +419,7 @@ public void screenTrace_perfMonEnabledSwitchAtRuntime_traceCreationDependsOnRunt
monitor.onActivityStarted(activityWithNonHardwareAcceleratedView);
assertThat(monitor.getActivity2ScreenTrace()).hasSize(1);
currentTime = 200;
monitor.onActivityStopped(activityWithNonHardwareAcceleratedView);
monitor.onActivityPostPaused(activityWithNonHardwareAcceleratedView);
assertThat(monitor.getActivity2ScreenTrace()).isEmpty();

// Case #2: developer has disabled Performance Monitoring during runtime.
Expand All @@ -429,7 +429,7 @@ public void screenTrace_perfMonEnabledSwitchAtRuntime_traceCreationDependsOnRunt
monitor.onActivityStarted(activityWithNonHardwareAcceleratedView);
assertThat(monitor.getActivity2ScreenTrace()).isEmpty();
// Confirm that this doesn't throw an exception.
monitor.onActivityStopped(activityWithNonHardwareAcceleratedView);
monitor.onActivityPostPaused(activityWithNonHardwareAcceleratedView);
}

@Test
Expand Down