summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jorim Jaggi <jjaggi@google.com> 2018-05-17 01:59:17 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-05-17 01:59:17 +0000
commitdb712bec4a5fc4c33e22f53e1a7842ba0314016c (patch)
treeb1d91e6c4e5694c34ac660d5acd0a7b293b9e548
parent084c7064d8f5a99fdfbf6ce29a7bfa05172da5ad (diff)
parentde8305a56686bee89ee18df88ec4b7aaedf9119f (diff)
Merge "Track launch time per windowingMode" into pi-dev
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java22
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java36
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java7
-rw-r--r--services/core/java/com/android/server/am/LaunchTimeTracker.java86
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;
+ }
+ }
+ }
+}