blob: cb008c2b7aa769a10283dd5a0cee45b7e96208f6 [file] [log] [blame]
Filip Gruszczynski77d94482015-12-11 13:59:52 -08001package com.android.server.am;
2
Jorim Jaggi3878ca32017-02-02 17:13:05 -08003import static android.app.ActivityManager.START_SUCCESS;
4import static android.app.ActivityManager.START_TASK_TO_FRONT;
Michal Karpinski201bc0c2018-07-20 15:32:00 +01005import static android.app.ActivityManager.processStateAmToProto;
Bryce Lee6c605092017-10-12 11:14:49 -07006import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
Wale Ogunwale3382ab12017-07-27 08:55:03 -07007import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
8import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
Vishnu Nair132ee832018-09-28 15:00:05 -07009import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
Wale Ogunwale926aade2017-08-29 11:24:37 -070010import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
11import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
Vishnu Nair132ee832018-09-28 15:00:05 -070012
Michal Karpinski201bc0c2018-07-20 15:32:00 +010013import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_ACTIVITY_START;
Jorim Jaggi3878ca32017-02-02 17:13:05 -080014import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION;
Jorim Jaggi515dd682017-05-05 15:05:07 +020015import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_BIND_APPLICATION_DELAY_MS;
Todd Kennedy50d946c12017-03-17 13:55:38 -070016import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_CALLING_PACKAGE_NAME;
Jorim Jaggi172e99f2017-10-20 14:33:18 +020017import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_CANCELLED;
Jorim Jaggi3878ca32017-02-02 17:13:05 -080018import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DELAY_MS;
19import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DEVICE_UPTIME_SECONDS;
Todd Kennedy50d946c12017-03-17 13:55:38 -070020import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_IS_EPHEMERAL;
Jorim Jaggi4d27b842017-08-17 17:22:26 +020021import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_PROCESS_RUNNING;
22import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_REPORTED_DRAWN;
23import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_REPORTED_DRAWN_MS;
Jorim Jaggi3878ca32017-02-02 17:13:05 -080024import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_STARTING_WINDOW_DELAY_MS;
25import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010026import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_FLAGS;
27import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_FULLSCREEN;
28import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_NO_DISPLAY;
29import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_VISIBLE;
30import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_VISIBLE_IGNORING_KEYGUARD;
Vishnu Nair132ee832018-09-28 15:00:05 -070031import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_LAUNCH_MODE;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010032import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_MILLIS_SINCE_LAST_LAUNCH;
33import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_MILLIS_SINCE_LAST_VISIBLE;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010034import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_PROCESS_NAME;
35import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_REAL_ACTIVITY;
36import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_RESULT_TO_PKG_NAME;
37import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_RESULT_TO_SHORT_COMPONENT_NAME;
38import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_SHORT_COMPONENT_NAME;
39import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_TARGET_ACTIVITY;
40import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CALLING_PACKAGE_NAME;
41import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CALLING_UID;
42import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CALLING_UID_HAS_ANY_VISIBLE_WINDOW;
43import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CALLING_UID_PROC_STATE;
Jorim Jaggicdfc04e2017-04-28 19:06:24 +020044import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010045import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_COMING_FROM_PENDING_INTENT;
Todd Kennedy50d946c12017-03-17 13:55:38 -070046import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010047import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INTENT_ACTION;
48import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_CUR_PROC_STATE;
49import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_HAS_CLIENT_ACTIVITIES;
50import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_HAS_FOREGROUND_ACTIVITIES;
51import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_HAS_FOREGROUND_SERVICES;
52import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_HAS_OVERLAY_UI;
53import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_HAS_TOP_UI;
54import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_MILLIS_SINCE_FG_INTERACTION;
55import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_MILLIS_SINCE_LAST_INTERACTION_EVENT;
56import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_MILLIS_SINCE_UNIMPORTANT;
57import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_PENDING_UI_CLEAN;
58import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_PROCESS_RECORD_PROCESS_NAME;
59import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_REAL_CALLING_UID;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010060import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_REAL_CALLING_UID_HAS_ANY_VISIBLE_WINDOW;
Vishnu Nair132ee832018-09-28 15:00:05 -070061import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_REAL_CALLING_UID_PROC_STATE;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010062import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_PACKAGE_NAME;
63import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_SHORT_COMPONENT_NAME;
64import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_UID;
65import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_UID_HAS_ANY_VISIBLE_WINDOW;
66import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_UID_PROC_STATE;
67import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_WHITELIST_TAG;
Calin Juravle759fbda2018-02-20 19:52:30 +000068import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_FILTER;
Vishnu Nair132ee832018-09-28 15:00:05 -070069import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_REASON;
Jorim Jaggi3878ca32017-02-02 17:13:05 -080070import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH;
71import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH;
Jorim Jaggi4d27b842017-08-17 17:22:26 +020072import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE;
73import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE;
Jorim Jaggi3878ca32017-02-02 17:13:05 -080074import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_WARM_LAUNCH;
Wale Ogunwale98875612018-10-12 07:53:02 -070075import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_METRICS;
76import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM;
77import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
Vishnu Nair132ee832018-09-28 15:00:05 -070078import static com.android.server.am.EventLogTags.AM_ACTIVITY_LAUNCH_TIME;
Ng Zhi Anbbefdec2018-01-30 17:12:39 -080079import static com.android.server.am.MemoryStatUtil.MemoryStat;
Rajeev Kumarbfcd9202018-03-02 22:42:13 +000080import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
Vishnu Nair132ee832018-09-28 15:00:05 -070081import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_TIMEOUT;
Filip Gruszczynski77d94482015-12-11 13:59:52 -080082
Filip Gruszczynski77d94482015-12-11 13:59:52 -080083import android.content.Context;
Michal Karpinski201bc0c2018-07-20 15:32:00 +010084import android.content.Intent;
Calin Juravle759fbda2018-02-20 19:52:30 +000085import android.content.pm.ApplicationInfo;
86import android.content.pm.dex.ArtManagerInternal;
87import android.content.pm.dex.PackageOptimizationInfo;
Jorim Jaggi3878ca32017-02-02 17:13:05 -080088import android.metrics.LogMaker;
Jorim Jaggi172e99f2017-10-20 14:33:18 +020089import android.os.Handler;
90import android.os.Looper;
91import android.os.Message;
Filip Gruszczynski77d94482015-12-11 13:59:52 -080092import android.os.SystemClock;
Vishnu Nair132ee832018-09-28 15:00:05 -070093import android.os.Trace;
94import android.util.EventLog;
95import android.util.Log;
Jorim Jaggi172e99f2017-10-20 14:33:18 +020096import android.util.Slog;
Jorim Jaggi3878ca32017-02-02 17:13:05 -080097import android.util.SparseArray;
98import android.util.SparseIntArray;
Olivier Gaillardaed7f122017-12-12 14:26:22 +000099import android.util.StatsLog;
Vishnu Nair132ee832018-09-28 15:00:05 -0700100import android.util.TimeUtils;
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800101
102import com.android.internal.logging.MetricsLogger;
Ng Zhi An83473542018-02-20 09:02:14 -0800103import com.android.internal.os.BackgroundThread;
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200104import com.android.internal.os.SomeArgs;
Calin Juravle759fbda2018-02-20 19:52:30 +0000105import com.android.server.LocalServices;
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800106
107/**
Vishnu Nair132ee832018-09-28 15:00:05 -0700108 * Listens to activity launches, transitions, visibility changes and window drawn callbacks to
109 * determine app launch times and draw delays. Source of truth for activity metrics and provides
110 * data for Tron, logcat, event logs and {@link android.app.WaitResult}.
111 *
112 * Tests:
Vishnu Nairf8accc52018-10-11 10:19:54 -0700113 * atest CtsActivityManagerDeviceTestCases:ActivityMetricsLoggerTests
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800114 */
115class ActivityMetricsLogger {
Jorim Jaggif9704102016-05-05 19:14:22 -0700116
Wale Ogunwale98875612018-10-12 07:53:02 -0700117 private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityMetricsLogger" : TAG_ATM;
Jorim Jaggif9704102016-05-05 19:14:22 -0700118
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800119 // Window modes we are interested in logging. If we ever introduce a new type, we need to add
120 // a value here and increase the {@link #TRON_WINDOW_STATE_VARZ_STRINGS} array.
121 private static final int WINDOW_STATE_STANDARD = 0;
122 private static final int WINDOW_STATE_SIDE_BY_SIDE = 1;
123 private static final int WINDOW_STATE_FREEFORM = 2;
Winson Chung83471632016-12-13 11:02:12 -0800124 private static final int WINDOW_STATE_ASSISTANT = 3;
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800125 private static final int WINDOW_STATE_INVALID = -1;
126
Jorim Jaggi275561a2016-02-23 10:11:02 -0500127 private static final long INVALID_START_TIME = -1;
Vishnu Nair132ee832018-09-28 15:00:05 -0700128 private static final int INVALID_DELAY = -1;
129 private static final int INVALID_TRANSITION_TYPE = -1;
Jorim Jaggi275561a2016-02-23 10:11:02 -0500130
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200131 private static final int MSG_CHECK_VISIBILITY = 0;
132
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800133 // Preallocated strings we are sending to tron, so we don't have to allocate a new one every
134 // time we log.
135 private static final String[] TRON_WINDOW_STATE_VARZ_STRINGS = {
Winson Chung83471632016-12-13 11:02:12 -0800136 "window_time_0", "window_time_1", "window_time_2", "window_time_3"};
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800137
138 private int mWindowState = WINDOW_STATE_STANDARD;
139 private long mLastLogTimeSecs;
140 private final ActivityStackSupervisor mSupervisor;
141 private final Context mContext;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800142 private final MetricsLogger mMetricsLogger = new MetricsLogger();
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800143
Jorim Jaggi275561a2016-02-23 10:11:02 -0500144 private long mCurrentTransitionStartTime = INVALID_START_TIME;
Jorim Jaggi4d27b842017-08-17 17:22:26 +0200145 private long mLastTransitionStartTime = INVALID_START_TIME;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800146
147 private int mCurrentTransitionDeviceUptime;
148 private int mCurrentTransitionDelayMs;
Jorim Jaggi275561a2016-02-23 10:11:02 -0500149 private boolean mLoggedTransitionStarting;
150
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100151 private final SparseArray<WindowingModeTransitionInfo> mWindowingModeTransitionInfo =
152 new SparseArray<>();
153 private final SparseArray<WindowingModeTransitionInfo> mLastWindowingModeTransitionInfo =
154 new SparseArray<>();
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200155 private final H mHandler;
Calin Juravle759fbda2018-02-20 19:52:30 +0000156
157 private ArtManagerInternal mArtManagerInternal;
Vishnu Nair132ee832018-09-28 15:00:05 -0700158 private boolean mDrawingTraceActive;
159 private final StringBuilder mStringBuilder = new StringBuilder();
Calin Juravle759fbda2018-02-20 19:52:30 +0000160
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200161 private final class H extends Handler {
162
163 public H(Looper looper) {
164 super(looper);
165 }
166
167 @Override
168 public void handleMessage(Message msg) {
169 switch (msg.what) {
170 case MSG_CHECK_VISIBILITY:
171 final SomeArgs args = (SomeArgs) msg.obj;
172 checkVisibility((TaskRecord) args.arg1, (ActivityRecord) args.arg2);
173 break;
174 }
175 }
Calin Juravle759fbda2018-02-20 19:52:30 +0000176 }
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800177
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100178 private final class WindowingModeTransitionInfo {
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800179 private ActivityRecord launchedActivity;
180 private int startResult;
181 private boolean currentTransitionProcessRunning;
Vishnu Nair132ee832018-09-28 15:00:05 -0700182 /** Elapsed time from when we launch an activity to when its windows are drawn. */
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800183 private int windowsDrawnDelayMs;
Vishnu Nair132ee832018-09-28 15:00:05 -0700184 private int startingWindowDelayMs = INVALID_DELAY;
185 private int bindApplicationDelayMs = INVALID_DELAY;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800186 private int reason = APP_TRANSITION_TIMEOUT;
187 private boolean loggedWindowsDrawn;
188 private boolean loggedStartingWindowDrawn;
Vishnu Nair132ee832018-09-28 15:00:05 -0700189 private boolean launchTraceActive;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800190 }
191
Vishnu Nair132ee832018-09-28 15:00:05 -0700192 final class WindowingModeTransitionInfoSnapshot {
Calin Juravle759fbda2018-02-20 19:52:30 +0000193 final private ApplicationInfo applicationInfo;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700194 final private WindowProcessController processRecord;
Vishnu Nair132ee832018-09-28 15:00:05 -0700195 final String packageName;
196 final String launchedActivityName;
Calin Juravle759fbda2018-02-20 19:52:30 +0000197 final private String launchedActivityLaunchedFromPackage;
198 final private String launchedActivityLaunchToken;
199 final private String launchedActivityAppRecordRequiredAbi;
Vishnu Nair132ee832018-09-28 15:00:05 -0700200 final String launchedActivityShortComponentName;
Ng Zhi An83473542018-02-20 09:02:14 -0800201 final private String processName;
Calin Juravle759fbda2018-02-20 19:52:30 +0000202 final private int reason;
203 final private int startingWindowDelayMs;
204 final private int bindApplicationDelayMs;
Vishnu Nair132ee832018-09-28 15:00:05 -0700205 final int windowsDrawnDelayMs;
206 final int type;
207 final int userId;
208 /**
209 * Elapsed time from when we launch an activity to when the app reported it was
210 * fully drawn. If this is not reported then the value is set to INVALID_DELAY.
211 */
212 final int windowsFullyDrawnDelayMs;
213 final int activityRecordIdHashCode;
Calin Juravle759fbda2018-02-20 19:52:30 +0000214
215 private WindowingModeTransitionInfoSnapshot(WindowingModeTransitionInfo info) {
Vishnu Nair132ee832018-09-28 15:00:05 -0700216 this(info, info.launchedActivity);
217 }
218
219 private WindowingModeTransitionInfoSnapshot(WindowingModeTransitionInfo info,
220 ActivityRecord launchedActivity) {
221 this(info, launchedActivity, INVALID_DELAY);
222 }
223
224 private WindowingModeTransitionInfoSnapshot(WindowingModeTransitionInfo info,
225 ActivityRecord launchedActivity, int windowsFullyDrawnDelayMs) {
226 applicationInfo = launchedActivity.appInfo;
227 packageName = launchedActivity.packageName;
228 launchedActivityName = launchedActivity.info.name;
229 launchedActivityLaunchedFromPackage = launchedActivity.launchedFromPackage;
230 launchedActivityLaunchToken = launchedActivity.info.launchToken;
231 launchedActivityAppRecordRequiredAbi = launchedActivity.app == null
Calin Juravle759fbda2018-02-20 19:52:30 +0000232 ? null
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700233 : info.launchedActivity.app.getRequiredAbi();
Calin Juravle759fbda2018-02-20 19:52:30 +0000234 reason = info.reason;
235 startingWindowDelayMs = info.startingWindowDelayMs;
236 bindApplicationDelayMs = info.bindApplicationDelayMs;
237 windowsDrawnDelayMs = info.windowsDrawnDelayMs;
238 type = getTransitionType(info);
Ng Zhi An83473542018-02-20 09:02:14 -0800239 processRecord = findProcessForActivity(info.launchedActivity);
240 processName = info.launchedActivity.processName;
Vishnu Nair132ee832018-09-28 15:00:05 -0700241 userId = launchedActivity.userId;
242 launchedActivityShortComponentName = launchedActivity.shortComponentName;
243 activityRecordIdHashCode = System.identityHashCode(launchedActivity);
244 this.windowsFullyDrawnDelayMs = windowsFullyDrawnDelayMs;
Calin Juravle759fbda2018-02-20 19:52:30 +0000245 }
246 }
247
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200248 ActivityMetricsLogger(ActivityStackSupervisor supervisor, Context context, Looper looper) {
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800249 mLastLogTimeSecs = SystemClock.elapsedRealtime() / 1000;
250 mSupervisor = supervisor;
251 mContext = context;
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200252 mHandler = new H(looper);
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800253 }
254
255 void logWindowState() {
256 final long now = SystemClock.elapsedRealtime() / 1000;
257 if (mWindowState != WINDOW_STATE_INVALID) {
258 // We log even if the window state hasn't changed, because the user might remain in
259 // home/fullscreen move forever and we would like to track this kind of behavior
260 // too.
261 MetricsLogger.count(mContext, TRON_WINDOW_STATE_VARZ_STRINGS[mWindowState],
262 (int) (now - mLastLogTimeSecs));
263 }
264 mLastLogTimeSecs = now;
265
Wale Ogunwale926aade2017-08-29 11:24:37 -0700266 mWindowState = WINDOW_STATE_INVALID;
Andrii Kulian5f750bc2018-07-17 08:57:23 -0700267 ActivityStack stack = mSupervisor.getTopDisplayFocusedStack();
lumarkf6c4a982018-06-15 15:43:12 +0800268 if (stack == null) {
269 return;
270 }
271
Wale Ogunwale926aade2017-08-29 11:24:37 -0700272 if (stack.isActivityTypeAssistant()) {
273 mWindowState = WINDOW_STATE_ASSISTANT;
Filip Gruszczynskicaae14e2015-12-16 14:40:04 -0800274 return;
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800275 }
Wale Ogunwale926aade2017-08-29 11:24:37 -0700276
Wale Ogunwale3382ab12017-07-27 08:55:03 -0700277 int windowingMode = stack.getWindowingMode();
278 if (windowingMode == WINDOWING_MODE_PINNED) {
Filip Gruszczynskicaae14e2015-12-16 14:40:04 -0800279 stack = mSupervisor.findStackBehind(stack);
Wale Ogunwale3382ab12017-07-27 08:55:03 -0700280 windowingMode = stack.getWindowingMode();
Filip Gruszczynskicaae14e2015-12-16 14:40:04 -0800281 }
Wale Ogunwale926aade2017-08-29 11:24:37 -0700282 switch (windowingMode) {
283 case WINDOWING_MODE_FULLSCREEN:
284 mWindowState = WINDOW_STATE_STANDARD;
285 break;
286 case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY:
287 case WINDOWING_MODE_SPLIT_SCREEN_SECONDARY:
288 mWindowState = WINDOW_STATE_SIDE_BY_SIDE;
289 break;
Bryce Lee6c605092017-10-12 11:14:49 -0700290 case WINDOWING_MODE_FREEFORM:
Wale Ogunwale926aade2017-08-29 11:24:37 -0700291 mWindowState = WINDOW_STATE_FREEFORM;
292 break;
293 default:
294 if (windowingMode != WINDOWING_MODE_UNDEFINED) {
295 throw new IllegalStateException("Unknown windowing mode for stack=" + stack
296 + " windowingMode=" + windowingMode);
297 }
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800298 }
299 }
Jorim Jaggi275561a2016-02-23 10:11:02 -0500300
301 /**
302 * Notifies the tracker at the earliest possible point when we are starting to launch an
303 * activity.
304 */
305 void notifyActivityLaunching() {
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800306 if (!isAnyTransitionActive()) {
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200307 if (DEBUG_METRICS) Slog.i(TAG, "notifyActivityLaunching");
Alison Cichowlasb7f67ab2017-04-25 18:04:40 -0400308 mCurrentTransitionStartTime = SystemClock.uptimeMillis();
Jorim Jaggi4d27b842017-08-17 17:22:26 +0200309 mLastTransitionStartTime = mCurrentTransitionStartTime;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800310 }
Jorim Jaggi275561a2016-02-23 10:11:02 -0500311 }
312
313 /**
Jorim Jaggi1e630c02016-05-16 12:13:13 -0700314 * Notifies the tracker that the activity is actually launching.
315 *
316 * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the
317 * launch
318 * @param launchedActivity the activity that is being launched
319 */
320 void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity) {
Wale Ogunwalef6733932018-06-27 05:14:34 -0700321 final WindowProcessController processRecord = findProcessForActivity(launchedActivity);
Jorim Jaggi1e630c02016-05-16 12:13:13 -0700322 final boolean processRunning = processRecord != null;
Jorim Jaggi1e630c02016-05-16 12:13:13 -0700323
324 // We consider this a "process switch" if the process of the activity that gets launched
325 // didn't have an activity that was in started state. In this case, we assume that lot
326 // of caches might be purged so the time until it produces the first frame is very
327 // interesting.
328 final boolean processSwitch = processRecord == null
Wale Ogunwalef6733932018-06-27 05:14:34 -0700329 || !processRecord.hasStartedActivity(launchedActivity);
Jorim Jaggi1e630c02016-05-16 12:13:13 -0700330
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800331 notifyActivityLaunched(resultCode, launchedActivity, processRunning, processSwitch);
Jorim Jaggi1e630c02016-05-16 12:13:13 -0700332 }
333
Jorim Jaggi1e630c02016-05-16 12:13:13 -0700334 /**
Jorim Jaggi275561a2016-02-23 10:11:02 -0500335 * Notifies the tracker the the activity is actually launching.
336 *
337 * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the
338 * launch
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800339 * @param launchedActivity the activity being launched
Jorim Jaggi275561a2016-02-23 10:11:02 -0500340 * @param processRunning whether the process that will contains the activity is already running
Jorim Jaggibe67c902016-04-12 00:53:16 -0700341 * @param processSwitch whether the process that will contain the activity didn't have any
342 * activity that was stopped, i.e. the started activity is "switching"
343 * processes
Jorim Jaggi275561a2016-02-23 10:11:02 -0500344 */
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800345 private void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity,
Jorim Jaggibe67c902016-04-12 00:53:16 -0700346 boolean processRunning, boolean processSwitch) {
Jorim Jaggi275561a2016-02-23 10:11:02 -0500347
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200348 if (DEBUG_METRICS) Slog.i(TAG, "notifyActivityLaunched"
349 + " resultCode=" + resultCode
350 + " launchedActivity=" + launchedActivity
351 + " processRunning=" + processRunning
352 + " processSwitch=" + processSwitch);
353
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100354 final int windowingMode = launchedActivity != null
355 ? launchedActivity.getWindowingMode()
356 : WINDOWING_MODE_UNDEFINED;
Vishnu Nairf8accc52018-10-11 10:19:54 -0700357 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
Jorim Jaggicdfc04e2017-04-28 19:06:24 +0200358 if (mCurrentTransitionStartTime == INVALID_START_TIME) {
Vishnu Nairf8accc52018-10-11 10:19:54 -0700359 // No transition is active ignore this launch.
Jorim Jaggicdfc04e2017-04-28 19:06:24 +0200360 return;
361 }
362
Vishnu Nairf8accc52018-10-11 10:19:54 -0700363 if (launchedActivity != null && launchedActivity.nowVisible) {
364 // Launched activity is already visible. We cannot measure windows drawn delay.
365 reset(true /* abort */, info);
366 return;
367 }
368
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800369 if (launchedActivity != null && info != null) {
Vishnu Nairf8accc52018-10-11 10:19:54 -0700370 // If we are already in an existing transition, only update the activity name, but not
371 // the other attributes.
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800372 info.launchedActivity = launchedActivity;
Jorim Jaggi275561a2016-02-23 10:11:02 -0500373 return;
374 }
375
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100376 final boolean otherWindowModesLaunching =
377 mWindowingModeTransitionInfo.size() > 0 && info == null;
Jorim Jaggi54cff642018-03-15 15:51:32 +0100378 if ((!isLoggableResultCode(resultCode) || launchedActivity == null || !processSwitch
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100379 || windowingMode == WINDOWING_MODE_UNDEFINED) && !otherWindowModesLaunching) {
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800380 // Failed to launch or it was not a process switch, so we don't care about the timing.
Vishnu Nair132ee832018-09-28 15:00:05 -0700381 reset(true /* abort */, info);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800382 return;
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100383 } else if (otherWindowModesLaunching) {
384 // Don't log this windowing mode but continue with the other windowing modes.
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800385 return;
386 }
387
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200388 if (DEBUG_METRICS) Slog.i(TAG, "notifyActivityLaunched successful");
389
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100390 final WindowingModeTransitionInfo newInfo = new WindowingModeTransitionInfo();
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800391 newInfo.launchedActivity = launchedActivity;
392 newInfo.currentTransitionProcessRunning = processRunning;
393 newInfo.startResult = resultCode;
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100394 mWindowingModeTransitionInfo.put(windowingMode, newInfo);
395 mLastWindowingModeTransitionInfo.put(windowingMode, newInfo);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800396 mCurrentTransitionDeviceUptime = (int) (SystemClock.uptimeMillis() / 1000);
Vishnu Nair132ee832018-09-28 15:00:05 -0700397 startTraces(newInfo);
Jorim Jaggi275561a2016-02-23 10:11:02 -0500398 }
399
400 /**
Jorim Jaggi54cff642018-03-15 15:51:32 +0100401 * @return True if we should start logging an event for an activity start that returned
402 * {@code resultCode} and that we'll indeed get a windows drawn event.
403 */
404 private boolean isLoggableResultCode(int resultCode) {
405 return resultCode == START_SUCCESS || resultCode == START_TASK_TO_FRONT;
406 }
407
408 /**
Jorim Jaggi275561a2016-02-23 10:11:02 -0500409 * Notifies the tracker that all windows of the app have been drawn.
410 */
Vishnu Nair132ee832018-09-28 15:00:05 -0700411 WindowingModeTransitionInfoSnapshot notifyWindowsDrawn(int windowingMode, long timestamp) {
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100412 if (DEBUG_METRICS) Slog.i(TAG, "notifyWindowsDrawn windowingMode=" + windowingMode);
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200413
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100414 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800415 if (info == null || info.loggedWindowsDrawn) {
Vishnu Nair132ee832018-09-28 15:00:05 -0700416 return null;
Jorim Jaggi275561a2016-02-23 10:11:02 -0500417 }
Sudheer Shankac766db02017-06-12 10:37:29 -0700418 info.windowsDrawnDelayMs = calculateDelay(timestamp);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800419 info.loggedWindowsDrawn = true;
Vishnu Nair132ee832018-09-28 15:00:05 -0700420 final WindowingModeTransitionInfoSnapshot infoSnapshot =
421 new WindowingModeTransitionInfoSnapshot(info);
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100422 if (allWindowsDrawn() && mLoggedTransitionStarting) {
Vishnu Nair132ee832018-09-28 15:00:05 -0700423 reset(false /* abort */, info);
Jorim Jaggi275561a2016-02-23 10:11:02 -0500424 }
Vishnu Nair132ee832018-09-28 15:00:05 -0700425 return infoSnapshot;
Jorim Jaggi275561a2016-02-23 10:11:02 -0500426 }
427
428 /**
429 * Notifies the tracker that the starting window was drawn.
430 */
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100431 void notifyStartingWindowDrawn(int windowingMode, long timestamp) {
432 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800433 if (info == null || info.loggedStartingWindowDrawn) {
Jorim Jaggi275561a2016-02-23 10:11:02 -0500434 return;
435 }
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800436 info.loggedStartingWindowDrawn = true;
Sudheer Shankac766db02017-06-12 10:37:29 -0700437 info.startingWindowDelayMs = calculateDelay(timestamp);
Jorim Jaggi275561a2016-02-23 10:11:02 -0500438 }
439
440 /**
441 * Notifies the tracker that the app transition is starting.
442 *
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100443 * @param windowingModeToReason A map from windowing mode to a reason integer, which must be on
Vishnu Nair132ee832018-09-28 15:00:05 -0700444 * of ActivityTaskManagerInternal.APP_TRANSITION_* reasons.
Jorim Jaggi275561a2016-02-23 10:11:02 -0500445 */
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100446 void notifyTransitionStarting(SparseIntArray windowingModeToReason, long timestamp) {
Jorim Jaggid8a57772017-04-14 16:50:42 -0700447 if (!isAnyTransitionActive() || mLoggedTransitionStarting) {
Jorim Jaggi275561a2016-02-23 10:11:02 -0500448 return;
449 }
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200450 if (DEBUG_METRICS) Slog.i(TAG, "notifyTransitionStarting");
Sudheer Shankac766db02017-06-12 10:37:29 -0700451 mCurrentTransitionDelayMs = calculateDelay(timestamp);
Jorim Jaggi275561a2016-02-23 10:11:02 -0500452 mLoggedTransitionStarting = true;
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100453 for (int index = windowingModeToReason.size() - 1; index >= 0; index--) {
454 final int windowingMode = windowingModeToReason.keyAt(index);
455 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(
456 windowingMode);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800457 if (info == null) {
458 continue;
459 }
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100460 info.reason = windowingModeToReason.valueAt(index);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800461 }
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100462 if (allWindowsDrawn()) {
Vishnu Nair132ee832018-09-28 15:00:05 -0700463 reset(false /* abort */, null /* WindowingModeTransitionInfo */);
Jorim Jaggi275561a2016-02-23 10:11:02 -0500464 }
465 }
466
Jorim Jaggicdfc04e2017-04-28 19:06:24 +0200467 /**
468 * Notifies the tracker that the visibility of an app is changing.
469 *
470 * @param activityRecord the app that is changing its visibility
Jorim Jaggicdfc04e2017-04-28 19:06:24 +0200471 */
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200472 void notifyVisibilityChanged(ActivityRecord activityRecord) {
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100473 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(
474 activityRecord.getWindowingMode());
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200475 if (info == null) {
476 return;
477 }
478 if (info.launchedActivity != activityRecord) {
479 return;
480 }
481 final TaskRecord t = activityRecord.getTask();
482 final SomeArgs args = SomeArgs.obtain();
483 args.arg1 = t;
484 args.arg2 = activityRecord;
485 mHandler.obtainMessage(MSG_CHECK_VISIBILITY, args).sendToTarget();
486 }
Jorim Jaggicdfc04e2017-04-28 19:06:24 +0200487
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200488 private void checkVisibility(TaskRecord t, ActivityRecord r) {
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700489 synchronized (mSupervisor.mService.mGlobalLock) {
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200490
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100491 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(
492 r.getWindowingMode());
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200493
494 // If we have an active transition that's waiting on a certain activity that will be
495 // invisible now, we'll never get onWindowsDrawn, so abort the transition if necessary.
496 if (info != null && !t.isVisible()) {
497 if (DEBUG_METRICS) Slog.i(TAG, "notifyVisibilityChanged to invisible"
498 + " activity=" + r);
499 logAppTransitionCancel(info);
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100500 mWindowingModeTransitionInfo.remove(r.getWindowingMode());
501 if (mWindowingModeTransitionInfo.size() == 0) {
Vishnu Nair132ee832018-09-28 15:00:05 -0700502 reset(true /* abort */, info);
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200503 }
Vishnu Nair132ee832018-09-28 15:00:05 -0700504 stopFullyDrawnTraceIfNeeded();
Jorim Jaggicdfc04e2017-04-28 19:06:24 +0200505 }
506 }
507 }
508
Jorim Jaggi515dd682017-05-05 15:05:07 +0200509 /**
510 * Notifies the tracker that we called immediately before we call bindApplication on the client.
511 *
512 * @param app The client into which we'll call bindApplication.
513 */
514 void notifyBindApplication(ProcessRecord app) {
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100515 for (int i = mWindowingModeTransitionInfo.size() - 1; i >= 0; i--) {
516 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.valueAt(i);
Jorim Jaggi515dd682017-05-05 15:05:07 +0200517
518 // App isn't attached to record yet, so match with info.
519 if (info.launchedActivity.appInfo == app.info) {
520 info.bindApplicationDelayMs = calculateCurrentDelay();
521 }
522 }
523 }
524
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100525 private boolean allWindowsDrawn() {
526 for (int index = mWindowingModeTransitionInfo.size() - 1; index >= 0; index--) {
527 if (!mWindowingModeTransitionInfo.valueAt(index).loggedWindowsDrawn) {
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800528 return false;
529 }
530 }
531 return true;
Jorim Jaggi275561a2016-02-23 10:11:02 -0500532 }
533
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800534 private boolean isAnyTransitionActive() {
535 return mCurrentTransitionStartTime != INVALID_START_TIME
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100536 && mWindowingModeTransitionInfo.size() > 0;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800537 }
538
Vishnu Nair132ee832018-09-28 15:00:05 -0700539 private void reset(boolean abort, WindowingModeTransitionInfo info) {
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200540 if (DEBUG_METRICS) Slog.i(TAG, "reset abort=" + abort);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800541 if (!abort && isAnyTransitionActive()) {
542 logAppTransitionMultiEvents();
543 }
Vishnu Nair132ee832018-09-28 15:00:05 -0700544 stopLaunchTrace(info);
Jorim Jaggi275561a2016-02-23 10:11:02 -0500545 mCurrentTransitionStartTime = INVALID_START_TIME;
Vishnu Nair132ee832018-09-28 15:00:05 -0700546 mCurrentTransitionDelayMs = INVALID_DELAY;
Jorim Jaggi275561a2016-02-23 10:11:02 -0500547 mLoggedTransitionStarting = false;
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100548 mWindowingModeTransitionInfo.clear();
Jorim Jaggi275561a2016-02-23 10:11:02 -0500549 }
550
551 private int calculateCurrentDelay() {
Jorim Jaggi275561a2016-02-23 10:11:02 -0500552 // Shouldn't take more than 25 days to launch an app, so int is fine here.
Alison Cichowlasb7f67ab2017-04-25 18:04:40 -0400553 return (int) (SystemClock.uptimeMillis() - mCurrentTransitionStartTime);
Jorim Jaggi275561a2016-02-23 10:11:02 -0500554 }
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800555
Sudheer Shankac766db02017-06-12 10:37:29 -0700556 private int calculateDelay(long timestamp) {
557 // Shouldn't take more than 25 days to launch an app, so int is fine here.
558 return (int) (timestamp - mCurrentTransitionStartTime);
559 }
560
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100561 private void logAppTransitionCancel(WindowingModeTransitionInfo info) {
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200562 final int type = getTransitionType(info);
Vishnu Nair132ee832018-09-28 15:00:05 -0700563 if (type == INVALID_TRANSITION_TYPE) {
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200564 return;
565 }
566 final LogMaker builder = new LogMaker(APP_TRANSITION_CANCELLED);
567 builder.setPackageName(info.launchedActivity.packageName);
568 builder.setType(type);
569 builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name);
570 mMetricsLogger.write(builder);
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000571 StatsLog.write(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800572 StatsLog.APP_START_CANCELED,
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000573 info.launchedActivity.appInfo.uid,
574 info.launchedActivity.packageName,
575 convertAppStartTransitionType(type),
576 info.launchedActivity.info.name);
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200577 }
578
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800579 private void logAppTransitionMultiEvents() {
Jorim Jaggi172e99f2017-10-20 14:33:18 +0200580 if (DEBUG_METRICS) Slog.i(TAG, "logging transition events");
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100581 for (int index = mWindowingModeTransitionInfo.size() - 1; index >= 0; index--) {
582 final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.valueAt(index);
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800583 final int type = getTransitionType(info);
Vishnu Nair132ee832018-09-28 15:00:05 -0700584 if (type == INVALID_TRANSITION_TYPE) {
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800585 return;
586 }
Calin Juravle759fbda2018-02-20 19:52:30 +0000587
588 // Take a snapshot of the transition info before sending it to the handler for logging.
589 // This will avoid any races with other operations that modify the ActivityRecord.
590 final WindowingModeTransitionInfoSnapshot infoSnapshot =
591 new WindowingModeTransitionInfoSnapshot(info);
Ng Zhi An83473542018-02-20 09:02:14 -0800592 final int currentTransitionDeviceUptime = mCurrentTransitionDeviceUptime;
593 final int currentTransitionDelayMs = mCurrentTransitionDelayMs;
594 BackgroundThread.getHandler().post(() -> logAppTransition(
595 currentTransitionDeviceUptime, currentTransitionDelayMs, infoSnapshot));
Vishnu Nair132ee832018-09-28 15:00:05 -0700596 BackgroundThread.getHandler().post(() -> logAppDisplayed(infoSnapshot));
Calin Juravle759fbda2018-02-20 19:52:30 +0000597
598 info.launchedActivity.info.launchToken = null;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800599 }
600 }
601
Ng Zhi An83473542018-02-20 09:02:14 -0800602 // This gets called on a background thread without holding the activity manager lock.
Calin Juravle759fbda2018-02-20 19:52:30 +0000603 private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs,
604 WindowingModeTransitionInfoSnapshot info) {
605 final LogMaker builder = new LogMaker(APP_TRANSITION);
606 builder.setPackageName(info.packageName);
607 builder.setType(info.type);
608 builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivityName);
609 final boolean isInstantApp = info.applicationInfo.isInstantApp();
610 if (info.launchedActivityLaunchedFromPackage != null) {
611 builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME,
612 info.launchedActivityLaunchedFromPackage);
613 }
614 String launchToken = info.launchedActivityLaunchToken;
615 if (launchToken != null) {
616 builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, launchToken);
617 }
618 builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0);
619 builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS,
620 currentTransitionDeviceUptime);
621 builder.addTaggedData(APP_TRANSITION_DELAY_MS, currentTransitionDelayMs);
622 builder.setSubtype(info.reason);
Vishnu Nair132ee832018-09-28 15:00:05 -0700623 if (info.startingWindowDelayMs != INVALID_DELAY) {
Calin Juravle759fbda2018-02-20 19:52:30 +0000624 builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS,
625 info.startingWindowDelayMs);
626 }
Vishnu Nair132ee832018-09-28 15:00:05 -0700627 if (info.bindApplicationDelayMs != INVALID_DELAY) {
Calin Juravle759fbda2018-02-20 19:52:30 +0000628 builder.addTaggedData(APP_TRANSITION_BIND_APPLICATION_DELAY_MS,
629 info.bindApplicationDelayMs);
630 }
631 builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs);
632 final ArtManagerInternal artManagerInternal = getArtManagerInternal();
633 final PackageOptimizationInfo packageOptimizationInfo =
634 (artManagerInternal == null) || (info.launchedActivityAppRecordRequiredAbi == null)
635 ? PackageOptimizationInfo.createWithNoInfo()
636 : artManagerInternal.getPackageOptimizationInfo(
637 info.applicationInfo,
638 info.launchedActivityAppRecordRequiredAbi);
639 builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_REASON,
640 packageOptimizationInfo.getCompilationReason());
641 builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_FILTER,
642 packageOptimizationInfo.getCompilationFilter());
643 mMetricsLogger.write(builder);
644 StatsLog.write(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800645 StatsLog.APP_START_OCCURRED,
Calin Juravle759fbda2018-02-20 19:52:30 +0000646 info.applicationInfo.uid,
647 info.packageName,
648 convertAppStartTransitionType(info.type),
649 info.launchedActivityName,
650 info.launchedActivityLaunchedFromPackage,
651 isInstantApp,
652 currentTransitionDeviceUptime * 1000,
653 info.reason,
654 currentTransitionDelayMs,
655 info.startingWindowDelayMs,
656 info.bindApplicationDelayMs,
657 info.windowsDrawnDelayMs,
658 launchToken,
659 packageOptimizationInfo.getCompilationReason(),
660 packageOptimizationInfo.getCompilationFilter());
Ng Zhi An83473542018-02-20 09:02:14 -0800661 logAppStartMemoryStateCapture(info);
Calin Juravle759fbda2018-02-20 19:52:30 +0000662 }
663
Vishnu Nair132ee832018-09-28 15:00:05 -0700664 private void logAppDisplayed(WindowingModeTransitionInfoSnapshot info) {
665 if (info.type != TYPE_TRANSITION_WARM_LAUNCH && info.type != TYPE_TRANSITION_COLD_LAUNCH) {
666 return;
667 }
668
669 EventLog.writeEvent(AM_ACTIVITY_LAUNCH_TIME,
670 info.userId, info.activityRecordIdHashCode, info.launchedActivityShortComponentName,
671 info.windowsDrawnDelayMs);
672
673 StringBuilder sb = mStringBuilder;
674 sb.setLength(0);
675 sb.append("Displayed ");
676 sb.append(info.launchedActivityShortComponentName);
677 sb.append(": ");
678 TimeUtils.formatDuration(info.windowsDrawnDelayMs, sb);
679 Log.i(TAG, sb.toString());
680 }
681
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000682 private int convertAppStartTransitionType(int tronType) {
683 if (tronType == TYPE_TRANSITION_COLD_LAUNCH) {
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800684 return StatsLog.APP_START_OCCURRED__TYPE__COLD;
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000685 }
686 if (tronType == TYPE_TRANSITION_WARM_LAUNCH) {
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800687 return StatsLog.APP_START_OCCURRED__TYPE__WARM;
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000688 }
689 if (tronType == TYPE_TRANSITION_HOT_LAUNCH) {
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800690 return StatsLog.APP_START_OCCURRED__TYPE__HOT;
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000691 }
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800692 return StatsLog.APP_START_OCCURRED__TYPE__UNKNOWN;
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000693 }
694
Vishnu Nair132ee832018-09-28 15:00:05 -0700695 WindowingModeTransitionInfoSnapshot logAppTransitionReportedDrawn(ActivityRecord r,
696 boolean restoredFromBundle) {
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100697 final WindowingModeTransitionInfo info = mLastWindowingModeTransitionInfo.get(
698 r.getWindowingMode());
Jorim Jaggi4d27b842017-08-17 17:22:26 +0200699 if (info == null) {
Vishnu Nair132ee832018-09-28 15:00:05 -0700700 return null;
Jorim Jaggi4d27b842017-08-17 17:22:26 +0200701 }
702 final LogMaker builder = new LogMaker(APP_TRANSITION_REPORTED_DRAWN);
703 builder.setPackageName(r.packageName);
704 builder.addTaggedData(FIELD_CLASS_NAME, r.info.name);
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000705 long startupTimeMs = SystemClock.uptimeMillis() - mLastTransitionStartTime;
706 builder.addTaggedData(APP_TRANSITION_REPORTED_DRAWN_MS, startupTimeMs);
Jorim Jaggi4d27b842017-08-17 17:22:26 +0200707 builder.setType(restoredFromBundle
708 ? TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE
709 : TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE);
710 builder.addTaggedData(APP_TRANSITION_PROCESS_RUNNING,
711 info.currentTransitionProcessRunning ? 1 : 0);
712 mMetricsLogger.write(builder);
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000713 StatsLog.write(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800714 StatsLog.APP_START_FULLY_DRAWN,
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000715 info.launchedActivity.appInfo.uid,
716 info.launchedActivity.packageName,
717 restoredFromBundle
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800718 ? StatsLog.APP_START_FULLY_DRAWN__TYPE__WITH_BUNDLE
719 : StatsLog.APP_START_FULLY_DRAWN__TYPE__WITHOUT_BUNDLE,
Olivier Gaillardaed7f122017-12-12 14:26:22 +0000720 info.launchedActivity.info.name,
721 info.currentTransitionProcessRunning,
722 startupTimeMs);
Vishnu Nair132ee832018-09-28 15:00:05 -0700723 stopFullyDrawnTraceIfNeeded();
724 final WindowingModeTransitionInfoSnapshot infoSnapshot =
725 new WindowingModeTransitionInfoSnapshot(info, r, (int) startupTimeMs);
726 BackgroundThread.getHandler().post(() -> logAppFullyDrawn(infoSnapshot));
727 return infoSnapshot;
728 }
729
730 private void logAppFullyDrawn(WindowingModeTransitionInfoSnapshot info) {
731 if (info.type != TYPE_TRANSITION_WARM_LAUNCH && info.type != TYPE_TRANSITION_COLD_LAUNCH) {
732 return;
733 }
734
735 StringBuilder sb = mStringBuilder;
736 sb.setLength(0);
737 sb.append("Fully drawn ");
738 sb.append(info.launchedActivityShortComponentName);
739 sb.append(": ");
740 TimeUtils.formatDuration(info.windowsFullyDrawnDelayMs, sb);
741 Log.i(TAG, sb.toString());
Jorim Jaggi4d27b842017-08-17 17:22:26 +0200742 }
743
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700744 void logActivityStart(Intent intent, WindowProcessController callerApp, ActivityRecord r,
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100745 int callingUid, String callingPackage, int callingUidProcState,
746 boolean callingUidHasAnyVisibleWindow,
747 int realCallingUid, int realCallingUidProcState,
748 boolean realCallingUidHasAnyVisibleWindow,
749 int targetUid, String targetPackage, int targetUidProcState,
750 boolean targetUidHasAnyVisibleWindow, String targetWhitelistTag,
751 boolean comingFromPendingIntent) {
752
753 final long nowElapsed = SystemClock.elapsedRealtime();
754 final long nowUptime = SystemClock.uptimeMillis();
755 final LogMaker builder = new LogMaker(ACTION_ACTIVITY_START);
756 builder.setTimestamp(System.currentTimeMillis());
757 builder.addTaggedData(FIELD_CALLING_UID, callingUid);
758 builder.addTaggedData(FIELD_CALLING_PACKAGE_NAME, callingPackage);
759 builder.addTaggedData(FIELD_CALLING_UID_PROC_STATE,
760 processStateAmToProto(callingUidProcState));
761 builder.addTaggedData(FIELD_CALLING_UID_HAS_ANY_VISIBLE_WINDOW,
762 callingUidHasAnyVisibleWindow ? 1 : 0);
763 builder.addTaggedData(FIELD_REAL_CALLING_UID, realCallingUid);
764 builder.addTaggedData(FIELD_REAL_CALLING_UID_PROC_STATE,
765 processStateAmToProto(realCallingUidProcState));
766 builder.addTaggedData(FIELD_REAL_CALLING_UID_HAS_ANY_VISIBLE_WINDOW,
767 realCallingUidHasAnyVisibleWindow ? 1 : 0);
768 builder.addTaggedData(FIELD_TARGET_UID, targetUid);
769 builder.addTaggedData(FIELD_TARGET_PACKAGE_NAME, targetPackage);
770 builder.addTaggedData(FIELD_TARGET_UID_PROC_STATE,
771 processStateAmToProto(targetUidProcState));
772 builder.addTaggedData(FIELD_TARGET_UID_HAS_ANY_VISIBLE_WINDOW,
773 targetUidHasAnyVisibleWindow ? 1 : 0);
774 builder.addTaggedData(FIELD_TARGET_WHITELIST_TAG, targetWhitelistTag);
775 builder.addTaggedData(FIELD_TARGET_SHORT_COMPONENT_NAME, r.shortComponentName);
776 builder.addTaggedData(FIELD_COMING_FROM_PENDING_INTENT, comingFromPendingIntent ? 1 : 0);
777 builder.addTaggedData(FIELD_INTENT_ACTION, intent.getAction());
778 if (callerApp != null) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700779 builder.addTaggedData(FIELD_PROCESS_RECORD_PROCESS_NAME, callerApp.mName);
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100780 builder.addTaggedData(FIELD_PROCESS_RECORD_CUR_PROC_STATE,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700781 processStateAmToProto(callerApp.getCurrentProcState()));
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100782 builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_CLIENT_ACTIVITIES,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700783 callerApp.hasClientActivities() ? 1 : 0);
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100784 builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_FOREGROUND_SERVICES,
785 callerApp.hasForegroundServices() ? 1 : 0);
786 builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_FOREGROUND_ACTIVITIES,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700787 callerApp.hasForegroundActivities() ? 1 : 0);
788 builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_TOP_UI, callerApp.hasTopUi() ? 1 : 0);
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100789 builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_OVERLAY_UI,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700790 callerApp.hasOverlayUi() ? 1 : 0);
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100791 builder.addTaggedData(FIELD_PROCESS_RECORD_PENDING_UI_CLEAN,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700792 callerApp.hasPendingUiClean() ? 1 : 0);
793 if (callerApp.getInteractionEventTime() != 0) {
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100794 builder.addTaggedData(FIELD_PROCESS_RECORD_MILLIS_SINCE_LAST_INTERACTION_EVENT,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700795 (nowElapsed - callerApp.getInteractionEventTime()));
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100796 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700797 if (callerApp.getFgInteractionTime() != 0) {
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100798 builder.addTaggedData(FIELD_PROCESS_RECORD_MILLIS_SINCE_FG_INTERACTION,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700799 (nowElapsed - callerApp.getFgInteractionTime()));
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100800 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700801 if (callerApp.getWhenUnimportant() != 0) {
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100802 builder.addTaggedData(FIELD_PROCESS_RECORD_MILLIS_SINCE_UNIMPORTANT,
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700803 (nowUptime - callerApp.getWhenUnimportant()));
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100804 }
805 }
806 builder.addTaggedData(FIELD_ACTIVITY_RECORD_LAUNCH_MODE, r.info.launchMode);
807 builder.addTaggedData(FIELD_ACTIVITY_RECORD_TARGET_ACTIVITY, r.info.targetActivity);
808 builder.addTaggedData(FIELD_ACTIVITY_RECORD_FLAGS, r.info.flags);
809 builder.addTaggedData(FIELD_ACTIVITY_RECORD_REAL_ACTIVITY, r.realActivity.toShortString());
810 builder.addTaggedData(FIELD_ACTIVITY_RECORD_SHORT_COMPONENT_NAME, r.shortComponentName);
811 builder.addTaggedData(FIELD_ACTIVITY_RECORD_PROCESS_NAME, r.processName);
812 builder.addTaggedData(FIELD_ACTIVITY_RECORD_IS_FULLSCREEN, r.fullscreen ? 1 : 0);
813 builder.addTaggedData(FIELD_ACTIVITY_RECORD_IS_NO_DISPLAY, r.noDisplay ? 1 : 0);
814 if (r.lastVisibleTime != 0) {
815 builder.addTaggedData(FIELD_ACTIVITY_RECORD_MILLIS_SINCE_LAST_VISIBLE,
816 (nowUptime - r.lastVisibleTime));
817 }
818 if (r.resultTo != null) {
819 builder.addTaggedData(FIELD_ACTIVITY_RECORD_RESULT_TO_PKG_NAME, r.resultTo.packageName);
820 builder.addTaggedData(FIELD_ACTIVITY_RECORD_RESULT_TO_SHORT_COMPONENT_NAME,
821 r.resultTo.shortComponentName);
822 }
823 builder.addTaggedData(FIELD_ACTIVITY_RECORD_IS_VISIBLE, r.visible ? 1 : 0);
824 builder.addTaggedData(FIELD_ACTIVITY_RECORD_IS_VISIBLE_IGNORING_KEYGUARD,
825 r.visibleIgnoringKeyguard ? 1 : 0);
826 if (r.lastLaunchTime != 0) {
827 builder.addTaggedData(FIELD_ACTIVITY_RECORD_MILLIS_SINCE_LAST_LAUNCH,
828 (nowUptime - r.lastLaunchTime));
829 }
830 mMetricsLogger.write(builder);
831 }
832
Jorim Jaggi9b58f2d2018-02-19 17:48:44 +0100833 private int getTransitionType(WindowingModeTransitionInfo info) {
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800834 if (info.currentTransitionProcessRunning) {
835 if (info.startResult == START_SUCCESS) {
836 return TYPE_TRANSITION_WARM_LAUNCH;
837 } else if (info.startResult == START_TASK_TO_FRONT) {
838 return TYPE_TRANSITION_HOT_LAUNCH;
839 }
840 } else if (info.startResult == START_SUCCESS) {
841 return TYPE_TRANSITION_COLD_LAUNCH;
842 }
Vishnu Nair132ee832018-09-28 15:00:05 -0700843 return INVALID_TRANSITION_TYPE;
Jorim Jaggi3878ca32017-02-02 17:13:05 -0800844 }
Ng Zhi Anbbefdec2018-01-30 17:12:39 -0800845
Ng Zhi An83473542018-02-20 09:02:14 -0800846 private void logAppStartMemoryStateCapture(WindowingModeTransitionInfoSnapshot info) {
847 if (info.processRecord == null) {
Ng Zhi Anbbefdec2018-01-30 17:12:39 -0800848 if (DEBUG_METRICS) Slog.i(TAG, "logAppStartMemoryStateCapture processRecord null");
849 return;
850 }
851
Wale Ogunwalef6733932018-06-27 05:14:34 -0700852 final int pid = info.processRecord.getPid();
Ng Zhi An83473542018-02-20 09:02:14 -0800853 final int uid = info.applicationInfo.uid;
Rajeev Kumarbfcd9202018-03-02 22:42:13 +0000854 final MemoryStat memoryStat = readMemoryStatFromFilesystem(uid, pid);
Ng Zhi Anbbefdec2018-01-30 17:12:39 -0800855 if (memoryStat == null) {
856 if (DEBUG_METRICS) Slog.i(TAG, "logAppStartMemoryStateCapture memoryStat null");
857 return;
858 }
859
860 StatsLog.write(
861 StatsLog.APP_START_MEMORY_STATE_CAPTURED,
862 uid,
Ng Zhi An83473542018-02-20 09:02:14 -0800863 info.processName,
864 info.launchedActivityName,
Ng Zhi Anbbefdec2018-01-30 17:12:39 -0800865 memoryStat.pgfault,
866 memoryStat.pgmajfault,
867 memoryStat.rssInBytes,
868 memoryStat.cacheInBytes,
869 memoryStat.swapInBytes);
870 }
871
Wale Ogunwalef6733932018-06-27 05:14:34 -0700872 private WindowProcessController findProcessForActivity(ActivityRecord launchedActivity) {
Ng Zhi Anbbefdec2018-01-30 17:12:39 -0800873 return launchedActivity != null
Wale Ogunwalef6733932018-06-27 05:14:34 -0700874 ? mSupervisor.mService.mProcessNames.get(
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700875 launchedActivity.processName, launchedActivity.appInfo.uid)
Ng Zhi Anbbefdec2018-01-30 17:12:39 -0800876 : null;
877 }
Calin Juravle759fbda2018-02-20 19:52:30 +0000878
879 private ArtManagerInternal getArtManagerInternal() {
880 if (mArtManagerInternal == null) {
881 // Note that this may be null.
882 // ArtManagerInternal is registered during PackageManagerService
883 // initialization which happens after ActivityManagerService.
884 mArtManagerInternal = LocalServices.getService(ArtManagerInternal.class);
885 }
886 return mArtManagerInternal;
887 }
Vishnu Nair132ee832018-09-28 15:00:05 -0700888
889 /**
890 * Starts traces for app launch and draw times. We stop the fully drawn trace if its already
891 * active since the app may not have reported fully drawn in the previous launch.
892 *
893 * See {@link android.app.Activity#reportFullyDrawn()}
894 *
895 * @param info
896 * */
897 private void startTraces(WindowingModeTransitionInfo info) {
898 if (info == null) {
899 return;
900 }
901 stopFullyDrawnTraceIfNeeded();
902 int transitionType = getTransitionType(info);
903 if (!info.launchTraceActive && transitionType == TYPE_TRANSITION_WARM_LAUNCH
904 || transitionType == TYPE_TRANSITION_COLD_LAUNCH) {
905 Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "launching: "
906 + info.launchedActivity.packageName, 0);
907 Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0);
908 mDrawingTraceActive = true;
909 info.launchTraceActive = true;
910 }
911 }
912
913 private void stopLaunchTrace(WindowingModeTransitionInfo info) {
914 if (info == null) {
915 return;
916 }
917 if (info.launchTraceActive) {
918 Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "launching: "
919 + info.launchedActivity.packageName, 0);
920 info.launchTraceActive = false;
921 }
922 }
923
924 void stopFullyDrawnTraceIfNeeded() {
925 if (mDrawingTraceActive) {
926 Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0);
927 mDrawingTraceActive = false;
928 }
929 }
Filip Gruszczynski77d94482015-12-11 13:59:52 -0800930}