From f2d9721d946f6c3fc58885ae0b83e3a39e9f1fc5 Mon Sep 17 00:00:00 2001 From: Ahan Wu Date: Wed, 4 May 2022 16:44:33 +0000 Subject: [PATCH] Add latency instrument for loading share sheet Bug: 226526090 Test: see the trace attached in the bug Change-Id: Ic2b31bfe59b7740dd7db6a75c86fad191b2f8507 --- .../app/AbstractMultiProfilePagerAdapter.java | 12 ++++++++++-- .../com/android/internal/app/ChooserActivity.java | 9 +++++++++ .../android/internal/app/ChooserListAdapter.java | 3 +++ .../com/android/internal/app/ResolverActivity.java | 12 +++++++++++- .../android/internal/app/ResolverListAdapter.java | 14 ++++++++++---- .../com/android/internal/util/LatencyTracker.java | 12 +++++++++++- 6 files changed, 54 insertions(+), 8 deletions(-) diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java index 8bd0f7b2fb57b..fc526203beed2 100644 --- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java @@ -25,6 +25,7 @@ import android.content.Intent; import android.content.pm.IPackageManager; import android.content.pm.ResolveInfo; import android.os.AsyncTask; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.stats.devicepolicy.DevicePolicyEnums; @@ -286,7 +287,10 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { *

Returns {@code true} if rebuild has completed. */ boolean rebuildActiveTab(boolean doPostProcessing) { - return rebuildTab(getActiveListAdapter(), doPostProcessing); + Trace.beginSection("MultiProfilePagerAdapter#rebuildActiveTab"); + boolean result = rebuildTab(getActiveListAdapter(), doPostProcessing); + Trace.endSection(); + return result; } /** @@ -294,10 +298,14 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { *

Returns {@code true} if rebuild has completed. */ boolean rebuildInactiveTab(boolean doPostProcessing) { + Trace.beginSection("MultiProfilePagerAdapter#rebuildInactiveTab"); if (getItemCount() == 1) { + Trace.endSection(); return false; } - return rebuildTab(getInactiveListAdapter(), doPostProcessing); + boolean result = rebuildTab(getInactiveListAdapter(), doPostProcessing); + Trace.endSection(); + return result; } private int userHandleToPageIndex(UserHandle userHandle) { diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 7cc37f70f8fa9..468293862cd3d 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -16,6 +16,8 @@ package com.android.internal.app; +import static com.android.internal.util.LatencyTracker.ACTION_LOAD_SHARE_SHEET; + import static java.lang.annotation.RetentionPolicy.SOURCE; import android.animation.Animator; @@ -509,6 +511,8 @@ public class ChooserActivity extends ResolverActivity implements @Override protected void onCreate(Bundle savedInstanceState) { final long intentReceivedTime = System.currentTimeMillis(); + mLatencyTracker.onActionStart(ACTION_LOAD_SHARE_SHEET); + getChooserActivityLogger().logSharesheetTriggered(); // This is the only place this value is being set. Effectively final. mIsAppPredictorComponentAvailable = isAppPredictionServiceAvailable(); @@ -1538,6 +1542,10 @@ public class ChooserActivity extends ResolverActivity implements protected void onDestroy() { super.onDestroy(); + if (isFinishing()) { + mLatencyTracker.onActionCancel(ACTION_LOAD_SHARE_SHEET); + } + if (mRefinementResultReceiver != null) { mRefinementResultReceiver.destroy(); mRefinementResultReceiver = null; @@ -2665,6 +2673,7 @@ public class ChooserActivity extends ResolverActivity implements if (rebuildComplete) { getChooserActivityLogger().logSharesheetAppLoadComplete(); maybeQueryAdditionalPostProcessingTargets(chooserListAdapter); + mLatencyTracker.onActionEnd(ACTION_LOAD_SHARE_SHEET); } } diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index 8dd8272879422..aab1bc3aab5ae 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -31,6 +31,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; import android.graphics.drawable.Drawable; import android.os.AsyncTask; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; @@ -667,8 +668,10 @@ public class ChooserListAdapter extends ResolverListAdapter { @Override protected List doInBackground( List... params) { + Trace.beginSection("ChooserListAdapter#SortingTask"); mResolverListController.topK(params[0], mChooserListCommunicator.getMaxRankedTargets()); + Trace.endSection(); return params[0]; } @Override diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 7e53a5afc3158..c34bbc3c2ee35 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -61,6 +61,7 @@ import android.os.Bundle; import android.os.PatternMatcher; import android.os.RemoteException; import android.os.StrictMode; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.MediaStore; @@ -98,6 +99,7 @@ import com.android.internal.app.chooser.TargetInfo; import com.android.internal.content.PackageMonitor; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.util.LatencyTracker; import com.android.internal.widget.ResolverDrawerLayout; import com.android.internal.widget.ViewPager; @@ -214,7 +216,11 @@ public class ResolverActivity extends Activity implements private UserHandle mWorkProfileUserHandle; + protected final LatencyTracker mLatencyTracker = getLatencyTracker(); + private LatencyTracker getLatencyTracker() { + return LatencyTracker.getInstance(this); + } /** * Get the string resource to be used as a label for the link to the resolver activity for an @@ -1432,6 +1438,7 @@ public class ResolverActivity extends Activity implements throw new IllegalStateException("mMultiProfilePagerAdapter.getCurrentListAdapter() " + "cannot be null."); } + Trace.beginSection("configureContentView"); // We partially rebuild the inactive adapter to determine if we should auto launch // isTabLoaded will be true here if the empty state screen is shown instead of the list. boolean rebuildCompleted = mMultiProfilePagerAdapter.rebuildActiveTab(true) @@ -1444,6 +1451,7 @@ public class ResolverActivity extends Activity implements if (shouldUseMiniResolver()) { configureMiniResolverContent(); + Trace.endSection(); return false; } @@ -1454,7 +1462,9 @@ public class ResolverActivity extends Activity implements } setContentView(mLayoutId); mMultiProfilePagerAdapter.setupViewPager(findViewById(R.id.profile_pager)); - return postRebuildList(rebuildCompleted); + boolean result = postRebuildList(rebuildCompleted); + Trace.endSection(); + return result; } /** diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index 0a07e0a04a409..2ed0f981692e3 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -38,6 +38,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.RemoteException; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; @@ -188,6 +189,7 @@ public class ResolverListAdapter extends BaseAdapter { * Otherwise the callback is only queued once, with {@code rebuildCompleted} true. */ protected boolean rebuildList(boolean doPostProcessing) { + Trace.beginSection("ResolverListAdapter#rebuildList"); mDisplayList.clear(); mIsTabLoaded = false; mLastChosenPosition = -1; @@ -241,8 +243,10 @@ public class ResolverListAdapter extends BaseAdapter { mUnfilteredResolveList = originalList; } - - return finishRebuildingListWithFilteredResults(currentResolveList, doPostProcessing); + boolean result = + finishRebuildingListWithFilteredResults(currentResolveList, doPostProcessing); + Trace.endSection(); + return result; } /** @@ -402,8 +406,9 @@ public class ResolverListAdapter extends BaseAdapter { protected void processSortedList(List sortedComponents, boolean doPostProcessing) { - int n; - if (sortedComponents != null && (n = sortedComponents.size()) != 0) { + final int n = sortedComponents != null ? sortedComponents.size() : 0; + Trace.beginSection("ResolverListAdapter#processSortedList:" + n); + if (n != 0) { // First put the initial items at the top. if (mInitialIntents != null) { for (int i = 0; i < mInitialIntents.length; i++) { @@ -451,6 +456,7 @@ public class ResolverListAdapter extends BaseAdapter { mResolverListCommunicator.sendVoiceChoicesIfNeeded(); postListReadyRunnable(doPostProcessing, /* rebuildCompleted */ true); mIsTabLoaded = true; + Trace.endSection(); } /** diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java index 2f707a774462c..ca40a4052ca10 100644 --- a/core/java/com/android/internal/util/LatencyTracker.java +++ b/core/java/com/android/internal/util/LatencyTracker.java @@ -137,6 +137,11 @@ public class LatencyTracker { */ public static final int ACTION_SHOW_BACK_ARROW = 15; + /** + * Time it takes for loading share sheet. + */ + public static final int ACTION_LOAD_SHARE_SHEET = 16; + private static final int[] ACTIONS_ALL = { ACTION_EXPAND_PANEL, ACTION_TOGGLE_RECENTS, @@ -154,6 +159,7 @@ public class LatencyTracker { ACTION_SWITCH_DISPLAY_UNFOLD, ACTION_UDFPS_ILLUMINATE, ACTION_SHOW_BACK_ARROW, + ACTION_LOAD_SHARE_SHEET, }; /** @hide */ @@ -173,7 +179,8 @@ public class LatencyTracker { ACTION_USER_SWITCH, ACTION_SWITCH_DISPLAY_UNFOLD, ACTION_UDFPS_ILLUMINATE, - ACTION_SHOW_BACK_ARROW + ACTION_SHOW_BACK_ARROW, + ACTION_LOAD_SHARE_SHEET, }) @Retention(RetentionPolicy.SOURCE) public @interface Action { @@ -196,6 +203,7 @@ public class LatencyTracker { FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_SWITCH_DISPLAY_UNFOLD, FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_UDFPS_ILLUMINATE, FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_SHOW_BACK_ARROW, + FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_LOAD_SHARE_SHEET, }; private static LatencyTracker sLatencyTracker; @@ -287,6 +295,8 @@ public class LatencyTracker { return "ACTION_UDFPS_ILLUMINATE"; case 16: return "ACTION_SHOW_BACK_ARROW"; + case 17: + return "ACTION_LOAD_SHARE_SHEET"; default: throw new IllegalArgumentException("Invalid action"); }