Merge "Use correct timestamps of events for logging." into oc-dev

This commit is contained in:
Sudheer Shanka
2017-06-15 19:25:02 +00:00
committed by Android (Google) Code Review
7 changed files with 63 additions and 35 deletions

View File

@@ -24,6 +24,7 @@ import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.os.SystemClock;
import android.service.voice.IVoiceInteractionSession; import android.service.voice.IVoiceInteractionSession;
import android.util.SparseIntArray; import android.util.SparseIntArray;
@@ -134,8 +135,10 @@ public abstract class ActivityManagerInternal {
* *
* @param reasons A map from stack id to a reason integer why the transition was started,, which * @param reasons A map from stack id to a reason integer why the transition was started,, which
* must be one of the APP_TRANSITION_* values. * must be one of the APP_TRANSITION_* values.
* @param timestamp The time at which the app transition started in
* {@link SystemClock#uptimeMillis()} timebase.
*/ */
public abstract void notifyAppTransitionStarting(SparseIntArray reasons); public abstract void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp);
/** /**
* Callback for window manager to let activity manager know that the app transition was * Callback for window manager to let activity manager know that the app transition was

View File

@@ -23752,9 +23752,10 @@ public class ActivityManagerService extends IActivityManager.Stub
} }
@Override @Override
public void notifyAppTransitionStarting(SparseIntArray reasons) { public void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp) {
synchronized (ActivityManagerService.this) { synchronized (ActivityManagerService.this) {
mStackSupervisor.mActivityMetricsLogger.notifyTransitionStarting(reasons); mStackSupervisor.mActivityMetricsLogger.notifyTransitionStarting(
reasons, timestamp);
} }
} }

View File

@@ -230,12 +230,12 @@ class ActivityMetricsLogger {
/** /**
* Notifies the tracker that all windows of the app have been drawn. * Notifies the tracker that all windows of the app have been drawn.
*/ */
void notifyWindowsDrawn(int stackId) { void notifyWindowsDrawn(int stackId, long timestamp) {
final StackTransitionInfo info = mStackTransitionInfo.get(stackId); final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
if (info == null || info.loggedWindowsDrawn) { if (info == null || info.loggedWindowsDrawn) {
return; return;
} }
info.windowsDrawnDelayMs = calculateCurrentDelay(); info.windowsDrawnDelayMs = calculateDelay(timestamp);
info.loggedWindowsDrawn = true; info.loggedWindowsDrawn = true;
if (allStacksWindowsDrawn() && mLoggedTransitionStarting) { if (allStacksWindowsDrawn() && mLoggedTransitionStarting) {
reset(false /* abort */); reset(false /* abort */);
@@ -245,13 +245,13 @@ class ActivityMetricsLogger {
/** /**
* Notifies the tracker that the starting window was drawn. * Notifies the tracker that the starting window was drawn.
*/ */
void notifyStartingWindowDrawn(int stackId) { void notifyStartingWindowDrawn(int stackId, long timestamp) {
final StackTransitionInfo info = mStackTransitionInfo.get(stackId); final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
if (info == null || info.loggedStartingWindowDrawn) { if (info == null || info.loggedStartingWindowDrawn) {
return; return;
} }
info.loggedStartingWindowDrawn = true; info.loggedStartingWindowDrawn = true;
info.startingWindowDelayMs = calculateCurrentDelay(); info.startingWindowDelayMs = calculateDelay(timestamp);
} }
/** /**
@@ -260,11 +260,11 @@ class ActivityMetricsLogger {
* @param stackIdReasons A map from stack id to a reason integer, which must be on of * @param stackIdReasons A map from stack id to a reason integer, which must be on of
* ActivityManagerInternal.APP_TRANSITION_* reasons. * ActivityManagerInternal.APP_TRANSITION_* reasons.
*/ */
void notifyTransitionStarting(SparseIntArray stackIdReasons) { void notifyTransitionStarting(SparseIntArray stackIdReasons, long timestamp) {
if (!isAnyTransitionActive() || mLoggedTransitionStarting) { if (!isAnyTransitionActive() || mLoggedTransitionStarting) {
return; return;
} }
mCurrentTransitionDelayMs = calculateCurrentDelay(); mCurrentTransitionDelayMs = calculateDelay(timestamp);
mLoggedTransitionStarting = true; mLoggedTransitionStarting = true;
for (int index = stackIdReasons.size() - 1; index >= 0; index--) { for (int index = stackIdReasons.size() - 1; index >= 0; index--) {
final int stackId = stackIdReasons.keyAt(index); final int stackId = stackIdReasons.keyAt(index);
@@ -344,6 +344,11 @@ class ActivityMetricsLogger {
return (int) (SystemClock.uptimeMillis() - mCurrentTransitionStartTime); return (int) (SystemClock.uptimeMillis() - mCurrentTransitionStartTime);
} }
private int calculateDelay(long timestamp) {
// Shouldn't take more than 25 days to launch an app, so int is fine here.
return (int) (timestamp - mCurrentTransitionStartTime);
}
private void logAppTransitionMultiEvents() { private void logAppTransitionMultiEvents() {
for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) { for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) {
final StackTransitionInfo info = mStackTransitionInfo.valueAt(index); final StackTransitionInfo info = mStackTransitionInfo.valueAt(index);

View File

@@ -1928,18 +1928,19 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
} }
@Override @Override
public void onStartingWindowDrawn() { public void onStartingWindowDrawn(long timestamp) {
synchronized (service) { synchronized (service) {
mStackSupervisor.mActivityMetricsLogger.notifyStartingWindowDrawn(getStackId()); mStackSupervisor.mActivityMetricsLogger.notifyStartingWindowDrawn(
getStackId(), timestamp);
} }
} }
@Override @Override
public void onWindowsDrawn() { public void onWindowsDrawn(long timestamp) {
synchronized (service) { synchronized (service) {
mStackSupervisor.mActivityMetricsLogger.notifyWindowsDrawn(getStackId()); mStackSupervisor.mActivityMetricsLogger.notifyWindowsDrawn(getStackId(), timestamp);
if (displayStartTime != 0) { if (displayStartTime != 0) {
reportLaunchTimeLocked(SystemClock.uptimeMillis()); reportLaunchTimeLocked(timestamp);
} }
mStackSupervisor.sendWaitingVisibleReportLocked(this); mStackSupervisor.sendWaitingVisibleReportLocked(this);
startTime = 0; startTime = 0;

View File

@@ -38,6 +38,8 @@ import android.graphics.Rect;
import android.os.Debug; import android.os.Debug;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Trace; import android.os.Trace;
import android.util.Slog; import android.util.Slog;
import android.view.DisplayInfo; import android.view.DisplayInfo;
@@ -62,23 +64,38 @@ public class AppWindowContainerController
private final IApplicationToken mToken; private final IApplicationToken mToken;
private final Handler mHandler; private final Handler mHandler;
private final Runnable mOnStartingWindowDrawn = () -> { private final class H extends Handler {
if (mListener == null) { public static final int NOTIFY_WINDOWS_DRAWN = 1;
return; public static final int NOTIFY_STARTING_WINDOW_DRAWN = 2;
}
if (DEBUG_VISIBILITY) Slog.v(TAG_WM, "Reporting drawn in "
+ AppWindowContainerController.this.mToken);
mListener.onStartingWindowDrawn();
};
private final Runnable mOnWindowsDrawn = () -> { public H(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case NOTIFY_WINDOWS_DRAWN:
if (mListener == null) { if (mListener == null) {
return; return;
} }
if (DEBUG_VISIBILITY) Slog.v(TAG_WM, "Reporting drawn in " if (DEBUG_VISIBILITY) Slog.v(TAG_WM, "Reporting drawn in "
+ AppWindowContainerController.this.mToken); + AppWindowContainerController.this.mToken);
mListener.onWindowsDrawn(); mListener.onWindowsDrawn(msg.getWhen());
}; break;
case NOTIFY_STARTING_WINDOW_DRAWN:
if (mListener == null) {
return;
}
if (DEBUG_VISIBILITY) Slog.v(TAG_WM, "Reporting drawn in "
+ AppWindowContainerController.this.mToken);
mListener.onStartingWindowDrawn(msg.getWhen());
break;
default:
break;
}
}
}
private final Runnable mOnWindowsVisible = () -> { private final Runnable mOnWindowsVisible = () -> {
if (mListener == null) { if (mListener == null) {
@@ -213,7 +230,7 @@ public class AppWindowContainerController
int targetSdkVersion, int rotationAnimationHint, long inputDispatchingTimeoutNanos, int targetSdkVersion, int rotationAnimationHint, long inputDispatchingTimeoutNanos,
WindowManagerService service, Configuration overrideConfig, Rect bounds) { WindowManagerService service, Configuration overrideConfig, Rect bounds) {
super(listener, service); super(listener, service);
mHandler = new Handler(service.mH.getLooper()); mHandler = new H(service.mH.getLooper());
mToken = token; mToken = token;
synchronized(mWindowMap) { synchronized(mWindowMap) {
AppWindowToken atoken = mRoot.getAppWindowToken(mToken.asBinder()); AppWindowToken atoken = mRoot.getAppWindowToken(mToken.asBinder());
@@ -761,11 +778,11 @@ public class AppWindowContainerController
} }
void reportStartingWindowDrawn() { void reportStartingWindowDrawn() {
mHandler.post(mOnStartingWindowDrawn); mHandler.sendMessage(mHandler.obtainMessage(H.NOTIFY_STARTING_WINDOW_DRAWN));
} }
void reportWindowsDrawn() { void reportWindowsDrawn() {
mHandler.post(mOnWindowsDrawn); mHandler.sendMessage(mHandler.obtainMessage(H.NOTIFY_WINDOWS_DRAWN));
} }
void reportWindowsVisible() { void reportWindowsVisible() {

View File

@@ -19,7 +19,7 @@ package com.android.server.wm;
/** Interface used by the creator of the controller to listen to changes with the container. */ /** Interface used by the creator of the controller to listen to changes with the container. */
public interface AppWindowContainerListener extends WindowContainerListener { public interface AppWindowContainerListener extends WindowContainerListener {
/** Called when the windows associated app window container are drawn. */ /** Called when the windows associated app window container are drawn. */
void onWindowsDrawn(); void onWindowsDrawn(long timestamp);
/** Called when the windows associated app window container are visible. */ /** Called when the windows associated app window container are visible. */
void onWindowsVisible(); void onWindowsVisible();
/** Called when the windows associated app window container are no longer visible. */ /** Called when the windows associated app window container are no longer visible. */
@@ -28,7 +28,7 @@ public interface AppWindowContainerListener extends WindowContainerListener {
/** /**
* Called when the starting window for this container is drawn. * Called when the starting window for this container is drawn.
*/ */
void onStartingWindowDrawn(); void onStartingWindowDrawn(long timestamp);
/** /**
* Called when the key dispatching to a window associated with the app window container * Called when the key dispatching to a window associated with the app window container

View File

@@ -5158,7 +5158,8 @@ public class WindowManagerService extends IWindowManager.Stub
} }
break; break;
case NOTIFY_APP_TRANSITION_STARTING: { case NOTIFY_APP_TRANSITION_STARTING: {
mAmInternal.notifyAppTransitionStarting((SparseIntArray) msg.obj); mAmInternal.notifyAppTransitionStarting((SparseIntArray) msg.obj,
msg.getWhen());
} }
break; break;
case NOTIFY_APP_TRANSITION_CANCELLED: { case NOTIFY_APP_TRANSITION_CANCELLED: {