[Metrics] Improved cold start detection when start surface enabled
Improve detection of if a true cold start is happening. If start surface
is shown then we should omit cold start metrics as in that case these
metrics don't accurately reflect performance regressions. See bug for
UMA histograms showing the effect.
(cherry picked from commit e57cc990faf16aff5858420ad7617c7f260021d7)
Bug: 1135566, 1135651
Change-Id: I99bab63f4e4fa3e34133bbe73718520164ff6355
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2450921
Commit-Queue: Calder Kitagawa <[email protected]>
Reviewed-by: Yaron Friedman <[email protected]>
Reviewed-by: Xi Han <[email protected]>
Reviewed-by: Mehran Mahmoudi <[email protected]>
Cr-Original-Commit-Position: refs/heads/master@{#815295}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2471257
Reviewed-by: Calder Kitagawa <[email protected]>
Cr-Commit-Position: refs/branch-heads/4280@{#370}
Cr-Branched-From: ea420fb963f9658c9969b6513c56b8f47efa1a2a-refs/heads/master@{#812852}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 9cafb3f..e5ad54b0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -915,6 +915,21 @@
}
}
+ private void setTrackColdStartupMetrics(boolean shouldTrackColdStartupMetrics) {
+ assert getActivityTabStartupMetricsTracker() != null;
+
+ if (shouldTrackColdStartupMetrics) {
+ getActivityTabStartupMetricsTracker().trackStartupMetrics(STARTUP_UMA_HISTOGRAM_SUFFIX);
+ } else {
+ getActivityTabStartupMetricsTracker().cancelTrackingStartupMetrics();
+ }
+
+ // Paint Preview should follow the same logic as startup UMA histograms as the feature
+ // should only run on cold startup of Chrome when the user is unable to interact before
+ // entering a tab.
+ PaintPreviewHelper.setShouldShowOnRestore(shouldTrackColdStartupMetrics);
+ }
+
private void setInitialOverviewState() {
boolean isOverviewVisible = mOverviewModeController.overviewVisible();
@@ -928,12 +943,18 @@
getOnCreateTimestampMs());
}
mOverviewShownOnStart = true;
+ // Cancel recording cold startup metrics if an overview is shown as they expect a tab to
+ // be the first thing shown after startup.
+ setTrackColdStartupMetrics(false);
showOverview(OverviewModeState.SHOWING_START);
return;
}
if (getActivityTab() == null && !isOverviewVisible) {
mOverviewShownOnStart = true;
+ // Cancel recording cold startup metrics if an overview is shown as they expect a tab to
+ // be the first thing shown after startup.
+ setTrackColdStartupMetrics(false);
showOverview(OverviewModeState.SHOWING_START);
}
@@ -1403,11 +1424,12 @@
// Decide whether to record startup UMA histograms. This is done early in the main
// Activity.onCreate() to avoid recording navigation delays when they require user input to
// proceed. For example, FRE (First Run Experience) happens before the activity is created,
- // and triggers initialization of the native library. At the moment it seems safe to assume
- // that uninitialized native library is an indication of an application start that is
- // followed by navigation immediately without user input.
+ // and triggers initialization of the native library.
+ //
+ // An uninitialized native library is an indication of an application start that is followed
+ // by navigation immediately without user input.
if (!LibraryLoader.getInstance().isInitialized()) {
- getActivityTabStartupMetricsTracker().trackStartupMetrics(STARTUP_UMA_HISTOGRAM_SUFFIX);
+ setTrackColdStartupMetrics(true);
}
supportRequestWindowFeature(Window.FEATURE_ACTION_MODE_OVERLAY);
@@ -1487,9 +1509,11 @@
mInactivityTracker = new ChromeInactivityTracker(
ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF);
- PaintPreviewHelper.initialize(
- this, getTabModelSelector(), () -> getToolbarManager() == null ? null :
- getToolbarManager().getProgressBarCoordinator());
+ PaintPreviewHelper.initialize(this, getTabModelSelector(), shouldShowTabSwitcherOnStart(),
+ ()
+ -> getToolbarManager() == null
+ ? null
+ : getToolbarManager().getProgressBarCoordinator());
}
@Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker.java
index ed84a84..c586cc6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker.java
@@ -97,6 +97,20 @@
mShouldTrackStartupMetrics = true;
}
+ /**
+ * Cancels tracking the startup metrics.
+ * Must only be called on the UI thread.
+ */
+ public void cancelTrackingStartupMetrics() {
+ if (!mShouldTrackStartupMetrics) return;
+
+ // Ensure we haven't tried to record metrics already.
+ assert mFirstCommitTimeMs == 0;
+
+ mHistogramSuffix = null;
+ mShouldTrackStartupMetrics = false;
+ }
+
public void destroy() {
mShouldTrackStartupMetrics = false;
if (mTabModelSelectorTabObserver != null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewHelper.java
index 9bcf59a..26d8e4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewHelper.java
@@ -34,11 +34,11 @@
*/
public class PaintPreviewHelper {
/**
- * Tracks whether there has been an attempt to display a paint preview before. We use this to
- * only attempt to display a paint preview on the first tab restoration that happens after
- * Chrome startup.
+ * Tracks whether a paint preview should be shown on tab restore. We use this to only attempt
+ * to display a paint preview on the first tab restoration that happens on Chrome startup when
+ * cold.
*/
- private static boolean sHasAttemptedToShowOnRestore;
+ private static boolean sShouldShowOnRestore;
/**
* A map for keeping Activity-specific variables and classes. New entries are added on calls to
@@ -49,18 +49,30 @@
new HashMap<>();
/**
+ * Sets whether a Paint Preview should attempt to be shown on restoration of a tab. If the
+ * feature is not enabled this is effectively a no-op. This is used to
+ */
+ public static void setShouldShowOnRestore(boolean shouldShowOnRestore) {
+ sShouldShowOnRestore = shouldShowOnRestore;
+ }
+
+ /**
* Initializes the logic required for the Paint Preview on startup feature. Mainly, observes a
* {@link TabModelSelector} to monitor for initialization completion.
*
* @param activity The ChromeActivity that corresponds to the tabModelSelector.
* @param tabModelSelector The TabModelSelector to observe.
+ * @param willShowStartSurface Whether the start surface will be shown.
+ * @param progressBarCoordinatorSupplier Supplier for the progress bar.
*/
public static void initialize(ChromeActivity<?> activity, TabModelSelector tabModelSelector,
+ boolean willShowStartSurface,
Supplier<LoadProgressCoordinator> progressBarCoordinatorSupplier) {
if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP)) return;
- if (!MultiWindowUtils.getInstance().areMultipleChromeInstancesRunning(activity)) {
- sHasAttemptedToShowOnRestore = false;
+ if (MultiWindowUtils.getInstance().areMultipleChromeInstancesRunning(activity)
+ || willShowStartSurface) {
+ sShouldShowOnRestore = false;
}
sWindowAndroidHelperMap.put(activity.getWindowAndroid(),
new PaintPreviewWindowAndroidHelper(activity, progressBarCoordinatorSupplier));
@@ -86,7 +98,7 @@
*/
public static void showPaintPreviewOnRestore(Tab tab) {
if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP)
- || sHasAttemptedToShowOnRestore
+ || !sShouldShowOnRestore
|| ChromeAccessibilityUtil.get().isAccessibilityEnabled()) {
return;
}
@@ -95,7 +107,7 @@
sWindowAndroidHelperMap.get(tab.getWindowAndroid());
if (windowAndroidHelper == null) return;
- sHasAttemptedToShowOnRestore = true;
+ sShouldShowOnRestore = false;
TabbedPaintPreviewPlayer player = TabbedPaintPreviewPlayer.get(tab);
player.setBrowserVisibilityDelegate(
windowAndroidHelper.getBrowserControlsManager().getBrowserVisibilityDelegate());
@@ -171,4 +183,6 @@
}
}
}
+
+ private PaintPreviewHelper() {}
}