Populate WaitResult with AML data for hot launches
Make the time of "am start -W" and metrics log are consistent.
Bug: 120981435
Bug: 123355661
Test: atest ActivityMetricsLoggerTests# \
testAppHotLaunchSetsWaitResultDelayData
Change-Id: I83a249146763e866048f7c4f92ec584b5fb4e4f0
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index f9b6bba..ff2c671 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -823,7 +823,14 @@
return StatsLog.APP_START_OCCURRED__TYPE__HOT;
}
return StatsLog.APP_START_OCCURRED__TYPE__UNKNOWN;
- }
+ }
+
+ /** @return the last known window drawn delay of the given windowing mode. */
+ int getLastDrawnDelayMs(@WindowingMode int windowingMode) {
+ final WindowingModeTransitionInfo info = mLastWindowingModeTransitionInfo.get(
+ windowingMode);
+ return info != null ? info.windowsDrawnDelayMs : INVALID_DELAY;
+ }
WindowingModeTransitionInfoSnapshot logAppTransitionReportedDrawn(ActivityRecord r,
boolean restoredFromBundle) {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 9c96868..933df1e 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -5122,7 +5122,7 @@
final @LaunchState int launchState = info != null ? info.getLaunchState() : -1;
mStackSupervisor.reportActivityLaunchedLocked(false /* timeout */, this,
windowsDrawnDelayMs, launchState);
- mStackSupervisor.stopWaitingForActivityVisible(this);
+ mStackSupervisor.stopWaitingForActivityVisible(this, windowsDrawnDelayMs);
finishLaunchTickingLocked();
if (task != null) {
task.hasBeenVisible = true;
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 64351fb..b4b95cc 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -561,8 +561,8 @@
return candidateTaskId;
}
- void waitActivityVisible(ComponentName name, WaitResult result, long startTimeMs) {
- final WaitInfo waitInfo = new WaitInfo(name, result, startTimeMs);
+ void waitActivityVisible(ComponentName name, WaitResult result) {
+ final WaitInfo waitInfo = new WaitInfo(name, result);
mWaitingForActivityVisible.add(waitInfo);
}
@@ -572,10 +572,15 @@
// down to the max limit while they are still waiting to finish.
mFinishingActivities.remove(r);
- stopWaitingForActivityVisible(r);
+ stopWaitingForActivityVisible(r, WaitResult.INVALID_DELAY);
}
void stopWaitingForActivityVisible(ActivityRecord r) {
+ stopWaitingForActivityVisible(r,
+ getActivityMetricsLogger().getLastDrawnDelayMs(r.getWindowingMode()));
+ }
+
+ void stopWaitingForActivityVisible(ActivityRecord r, long totalTime) {
boolean changed = false;
for (int i = mWaitingForActivityVisible.size() - 1; i >= 0; --i) {
final WaitInfo w = mWaitingForActivityVisible.get(i);
@@ -584,7 +589,7 @@
changed = true;
result.timeout = false;
result.who = w.getComponent();
- result.totalTime = SystemClock.uptimeMillis() - w.getStartTime();
+ result.totalTime = totalTime;
mWaitingForActivityVisible.remove(w);
}
}
@@ -2823,13 +2828,10 @@
static class WaitInfo {
private final ComponentName mTargetComponent;
private final WaitResult mResult;
- /** Time stamp when we started to wait for {@link WaitResult}. */
- private final long mStartTimeMs;
- WaitInfo(ComponentName targetComponent, WaitResult result, long startTimeMs) {
+ WaitInfo(ComponentName targetComponent, WaitResult result) {
this.mTargetComponent = targetComponent;
this.mResult = result;
- this.mStartTimeMs = startTimeMs;
}
public boolean matches(ComponentName targetComponent) {
@@ -2840,10 +2842,6 @@
return mResult;
}
- public long getStartTime() {
- return mStartTimeMs;
- }
-
public ComponentName getComponent() {
return mTargetComponent;
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index f87175d..d1bb255 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -107,7 +107,6 @@
import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
-import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
@@ -764,9 +763,7 @@
mRequest.waitResult.who = r.mActivityComponent;
mRequest.waitResult.totalTime = 0;
} else {
- final long startTimeMs = SystemClock.uptimeMillis();
- mSupervisor.waitActivityVisible(r.mActivityComponent, mRequest.waitResult,
- startTimeMs);
+ mSupervisor.waitActivityVisible(r.mActivityComponent, mRequest.waitResult);
// Note: the timeout variable is not currently not ever set.
do {
try {