Clarify costs in onTransactionReady

- Only print full info of Task for dumpsys, because shouldBeVisible
  is a bit heavy. Though it relates to the default enabled debug log
  for shell transition, that still reduces some noise of the overhead
  and uninterested long log.
- Add a trace of createTaskSnapshot which is usually the major
  cost of onTransactionReady.
- Simplify a bit for scheduleAnimation:
 - The initial order of RWC was changed to after WindowAnimator.
   So it is non-null.
 - WC#scheduleAnimation has never been overridden for a long time.
   So just call the implementation directly instead of traversing
   to top parent.

Bug: 235323163
Test: CtsWindowManagerDeviceTestCases

Change-Id: Idd026e08efa1714b9bc52d5aa203b955e2bcce87
This commit is contained in:
Riddle Hsu
2022-06-10 21:34:46 +08:00
parent f017558a95
commit 8a3eba09c8
8 changed files with 67 additions and 43 deletions

View File

@@ -1238,11 +1238,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
return "ROOT";
}
@Override
void scheduleAnimation() {
mWmService.scheduleAnimationLocked();
}
@Override
protected void removeChild(DisplayContent dc) {
super.removeChild(dc);

View File

@@ -3619,30 +3619,35 @@ class Task extends TaskFragment {
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(128);
if (stringName != null) {
sb.append(stringName);
sb.append(" U=");
sb.append(mUserId);
final Task rootTask = getRootTask();
if (rootTask != this) {
sb.append(" rootTaskId=");
sb.append(rootTask.mTaskId);
}
sb.append(" visible=");
sb.append(shouldBeVisible(null /* starting */));
sb.append(" visibleRequested=");
sb.append(isVisibleRequested());
sb.append(" mode=");
sb.append(windowingModeToString(getWindowingMode()));
sb.append(" translucent=");
sb.append(isTranslucent(null /* starting */));
sb.append(" sz=");
sb.append(getChildCount());
sb.append('}');
return sb.toString();
String toFullString() {
final StringBuilder sb = new StringBuilder(192);
sb.append(this);
sb.setLength(sb.length() - 1); // Remove tail '}'.
sb.append(" U=");
sb.append(mUserId);
final Task rootTask = getRootTask();
if (rootTask != this) {
sb.append(" rootTaskId=");
sb.append(rootTask.mTaskId);
}
sb.append(" visible=");
sb.append(shouldBeVisible(null /* starting */));
sb.append(" visibleRequested=");
sb.append(isVisibleRequested());
sb.append(" mode=");
sb.append(windowingModeToString(getWindowingMode()));
sb.append(" translucent=");
sb.append(isTranslucent(null /* starting */));
sb.append(" sz=");
sb.append(getChildCount());
sb.append('}');
return sb.toString();
}
@Override
public String toString() {
if (stringName != null) return stringName;
StringBuilder sb = new StringBuilder(128);
sb.append("Task{");
sb.append(Integer.toHexString(System.identityHashCode(this)));
sb.append(" #");
@@ -3657,11 +3662,9 @@ class Task extends TaskFragment {
} else if (affinityIntent != null && affinityIntent.getComponent() != null) {
sb.append(" aI=");
sb.append(affinityIntent.getComponent().flattenToShortString());
} else {
sb.append(" ??");
}
stringName = sb.toString();
return toString();
sb.append('}');
return stringName = sb.toString();
}
/**

View File

@@ -1937,7 +1937,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
continue;
}
final Task rootTask = child.asTask();
pw.println(doublePrefix + "* " + rootTask);
pw.println(doublePrefix + "* " + rootTask.toFullString());
rootTask.dump(pw, triplePrefix, dumpAll);
}
}

View File

@@ -2581,6 +2581,32 @@ class TaskFragment extends WindowContainer<WindowContainer> {
return getWindowingMode() == WINDOWING_MODE_FULLSCREEN || matchParentBounds();
}
String toFullString() {
final StringBuilder sb = new StringBuilder(128);
sb.append(this);
sb.setLength(sb.length() - 1); // Remove tail '}'.
if (mTaskFragmentOrganizerUid != INVALID_UID) {
sb.append(" organizerUid=");
sb.append(mTaskFragmentOrganizerUid);
}
if (mTaskFragmentOrganizerProcessName != null) {
sb.append(" organizerProc=");
sb.append(mTaskFragmentOrganizerProcessName);
}
if (mAdjacentTaskFragment != null) {
sb.append(" adjacent=");
sb.append(mAdjacentTaskFragment);
}
sb.append('}');
return sb.toString();
}
@Override
public String toString() {
return "TaskFragment{" + Integer.toHexString(System.identityHashCode(this))
+ " mode=" + WindowConfiguration.windowingModeToString(getWindowingMode()) + "}";
}
boolean dump(String prefix, FileDescriptor fd, PrintWriter pw, boolean dumpAll,
boolean dumpClient, String dumpPackage, final boolean needSep, Runnable header) {
boolean printed = false;
@@ -2619,7 +2645,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
}
void dumpInner(String prefix, PrintWriter pw, boolean dumpAll, String dumpPackage) {
pw.print(prefix); pw.print("* "); pw.println(this);
pw.print(prefix); pw.print("* "); pw.println(toFullString());
final Rect bounds = getRequestedOverrideBounds();
if (!bounds.isEmpty()) {
pw.println(prefix + " mBounds=" + bounds);
@@ -2640,10 +2666,11 @@ class TaskFragment extends WindowContainer<WindowContainer> {
final String doublePrefix = prefix + " ";
for (int i = mChildren.size() - 1; i >= 0; i--) {
final WindowContainer<?> child = mChildren.get(i);
pw.println(prefix + "* " + child);
final TaskFragment tf = child.asTaskFragment();
pw.println(prefix + "* " + (tf != null ? tf.toFullString() : child));
// Only dump non-activity because full activity info is already printed by
// RootWindowContainer#dumpActivities.
if (child.asActivityRecord() == null) {
if (tf != null) {
child.dump(pw, doublePrefix, dumpAll);
}
}

View File

@@ -47,6 +47,7 @@ import android.graphics.RenderNode;
import android.hardware.HardwareBuffer;
import android.os.Environment;
import android.os.Handler;
import android.os.Trace;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Slog;
@@ -391,8 +392,10 @@ class TaskSnapshotController {
SurfaceControl.ScreenshotHardwareBuffer createTaskSnapshot(@NonNull Task task,
TaskSnapshot.Builder builder) {
Point taskSize = new Point();
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "createTaskSnapshot");
final SurfaceControl.ScreenshotHardwareBuffer taskSnapshot = createTaskSnapshot(task,
mHighResTaskSnapshotScale, builder.getPixelFormat(), taskSize, builder);
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
builder.setTaskSize(taskSize);
return taskSnapshot;
}

View File

@@ -2694,9 +2694,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
* will be applied.
*/
void scheduleAnimation() {
if (mParent != null) {
mParent.scheduleAnimation();
}
mWmService.scheduleAnimationLocked();
}
/**

View File

@@ -6041,9 +6041,7 @@ public class WindowManagerService extends IWindowManager.Stub
/** Note that Locked in this case is on mLayoutToAnim */
void scheduleAnimationLocked() {
if (mAnimator != null) {
mAnimator.scheduleAnimation();
}
mAnimator.scheduleAnimation();
}
boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {

View File

@@ -3919,7 +3919,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mClient.resized(mClientWindowFrames, reportDraw, mLastReportedConfiguration,
getCompatInsetsState(), forceRelayout, alwaysConsumeSystemBars, displayId,
mSyncSeqId, resizeMode);
if (drawPending && prevRotation != mLastReportedConfiguration
if (drawPending && prevRotation >= 0 && prevRotation != mLastReportedConfiguration
.getMergedConfiguration().windowConfiguration.getRotation()) {
mOrientationChangeRedrawRequestTime = SystemClock.elapsedRealtime();
ProtoLog.v(WM_DEBUG_ORIENTATION,