diff options
4 files changed, 106 insertions, 45 deletions
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index e73f42fa4264..73710d3d39d7 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -1927,11 +1927,12 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo if (displayStartTime != 0) { reportLaunchTimeLocked(curTime); } - final ActivityStack stack = getStack(); - if (fullyDrawnStartTime != 0 && stack != null) { + final LaunchTimeTracker.Entry entry = mStackSupervisor.getLaunchTimeTracker().getEntry( + getWindowingMode()); + if (fullyDrawnStartTime != 0 && entry != null) { final long thisTime = curTime - fullyDrawnStartTime; - final long totalTime = stack.mFullyDrawnStartTime != 0 - ? (curTime - stack.mFullyDrawnStartTime) : thisTime; + final long totalTime = entry.mFullyDrawnStartTime != 0 + ? (curTime - entry.mFullyDrawnStartTime) : thisTime; if (SHOW_ACTIVITY_START_TIME) { Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); EventLog.writeEvent(AM_ACTIVITY_FULLY_DRAWN_TIME, @@ -1953,7 +1954,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo if (totalTime > 0) { //service.mUsageStatsService.noteFullyDrawnTime(realActivity, (int) totalTime); } - stack.mFullyDrawnStartTime = 0; + entry.mFullyDrawnStartTime = 0; } mStackSupervisor.getActivityMetricsLogger().logAppTransitionReportedDrawn(this, restoredFromBundle); @@ -1961,13 +1962,14 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } private void reportLaunchTimeLocked(final long curTime) { - final ActivityStack stack = getStack(); - if (stack == null) { + final LaunchTimeTracker.Entry entry = mStackSupervisor.getLaunchTimeTracker().getEntry( + getWindowingMode()); + if (entry == null) { return; } final long thisTime = curTime - displayStartTime; - final long totalTime = stack.mLaunchStartTime != 0 - ? (curTime - stack.mLaunchStartTime) : thisTime; + final long totalTime = entry.mLaunchStartTime != 0 + ? (curTime - entry.mLaunchStartTime) : thisTime; if (SHOW_ACTIVITY_START_TIME) { Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER, "launching: " + packageName, 0); EventLog.writeEvent(AM_ACTIVITY_LAUNCH_TIME, @@ -1991,7 +1993,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo //service.mUsageStatsService.noteLaunchTime(realActivity, (int)totalTime); } displayStartTime = 0; - stack.mLaunchStartTime = 0; + entry.mLaunchStartTime = 0; } @Override diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index c18250272b7e..818a609ecb60 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -339,9 +339,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai private final Rect mDeferredTaskBounds = new Rect(); private final Rect mDeferredTaskInsetBounds = new Rect(); - long mLaunchStartTime = 0; - long mFullyDrawnStartTime = 0; - int mCurrentUser; final int mStackId; @@ -1257,39 +1254,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai + " callers=" + Debug.getCallers(5)); r.setState(RESUMED, "minimalResumeActivityLocked"); r.completeResumeLocked(); - setLaunchTime(r); + mStackSupervisor.getLaunchTimeTracker().setLaunchTime(r); if (DEBUG_SAVED_STATE) Slog.i(TAG_SAVED_STATE, "Launch completed; removing icicle of " + r.icicle); } - private void startLaunchTraces(String packageName) { - if (mFullyDrawnStartTime != 0) { - Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); - } - Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "launching: " + packageName, 0); - Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); - } - - private void stopFullyDrawnTraceIfNeeded() { - if (mFullyDrawnStartTime != 0 && mLaunchStartTime == 0) { - Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); - mFullyDrawnStartTime = 0; - } - } - - void setLaunchTime(ActivityRecord r) { - if (r.displayStartTime == 0) { - r.fullyDrawnStartTime = r.displayStartTime = SystemClock.uptimeMillis(); - if (mLaunchStartTime == 0) { - startLaunchTraces(r.packageName); - mLaunchStartTime = mFullyDrawnStartTime = r.displayStartTime; - } - } else if (mLaunchStartTime == 0) { - startLaunchTraces(r.packageName); - mLaunchStartTime = mFullyDrawnStartTime = SystemClock.uptimeMillis(); - } - } - private void clearLaunchTime(ActivityRecord r) { // Make sure that there is no activity waiting for this to launch. if (mStackSupervisor.mWaitingActivityLaunched.isEmpty()) { @@ -1477,9 +1446,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai prev.setState(PAUSING, "startPausingLocked"); prev.getTask().touchActiveTime(); clearLaunchTime(prev); - final ActivityRecord next = mStackSupervisor.topRunningActivityLocked(); - stopFullyDrawnTraceIfNeeded(); + mStackSupervisor.getLaunchTimeTracker().stopFullyDrawnTraceIfNeeded(getWindowingMode()); mService.updateCpuStats(); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index df1ee5571562..afad0b1df5f2 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -445,6 +445,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D private boolean mTaskLayersChanged = true; private ActivityMetricsLogger mActivityMetricsLogger; + private LaunchTimeTracker mLaunchTimeTracker = new LaunchTimeTracker(); private final ArrayList<ActivityRecord> mTmpActivityList = new ArrayList<>(); @@ -629,6 +630,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return mActivityMetricsLogger; } + LaunchTimeTracker getLaunchTimeTracker() { + return mLaunchTimeTracker; + } + public KeyguardController getKeyguardController() { return mKeyguardController; } @@ -1646,7 +1651,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ProcessRecord app = mService.getProcessRecordLocked(r.processName, r.info.applicationInfo.uid, true); - r.getStack().setLaunchTime(r); + getLaunchTimeTracker().setLaunchTime(r); if (app != null && app.thread != null) { try { diff --git a/services/core/java/com/android/server/am/LaunchTimeTracker.java b/services/core/java/com/android/server/am/LaunchTimeTracker.java new file mode 100644 index 000000000000..ee869691f7ca --- /dev/null +++ b/services/core/java/com/android/server/am/LaunchTimeTracker.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.am; + +import android.app.WaitResult; +import android.os.SystemClock; +import android.os.Trace; +import android.util.SparseArray; + +/** + * Tracks launch time of apps to be reported by {@link WaitResult}. Note that this is slightly + * different from {@link ActivityMetricsLogger}, but should eventually merged with it. + */ +class LaunchTimeTracker { + + private final SparseArray<Entry> mWindowingModeLaunchTime = new SparseArray<>(); + + void setLaunchTime(ActivityRecord r) { + Entry entry = mWindowingModeLaunchTime.get(r.getWindowingMode()); + if (entry == null){ + entry = new Entry(); + mWindowingModeLaunchTime.append(r.getWindowingMode(), entry); + } + entry.setLaunchTime(r); + } + + void stopFullyDrawnTraceIfNeeded(int windowingMode) { + final Entry entry = mWindowingModeLaunchTime.get(windowingMode); + if (entry == null) { + return; + } + entry.stopFullyDrawnTraceIfNeeded(); + } + + Entry getEntry(int windowingMode) { + return mWindowingModeLaunchTime.get(windowingMode); + } + + static class Entry { + + long mLaunchStartTime; + long mFullyDrawnStartTime; + + void setLaunchTime(ActivityRecord r) { + if (r.displayStartTime == 0) { + r.fullyDrawnStartTime = r.displayStartTime = SystemClock.uptimeMillis(); + if (mLaunchStartTime == 0) { + startLaunchTraces(r.packageName); + mLaunchStartTime = mFullyDrawnStartTime = r.displayStartTime; + } + } else if (mLaunchStartTime == 0) { + startLaunchTraces(r.packageName); + mLaunchStartTime = mFullyDrawnStartTime = SystemClock.uptimeMillis(); + } + } + + private void startLaunchTraces(String packageName) { + if (mFullyDrawnStartTime != 0) { + Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); + } + Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "launching: " + packageName, 0); + Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); + } + + private void stopFullyDrawnTraceIfNeeded() { + if (mFullyDrawnStartTime != 0 && mLaunchStartTime == 0) { + Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); + mFullyDrawnStartTime = 0; + } + } + } +} |