diff options
15 files changed, 71 insertions, 50 deletions
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index 29073cb68c04..c04ddf8ae6de 100644 --- a/services/core/java/com/android/server/am/ActivityDisplay.java +++ b/services/core/java/com/android/server/am/ActivityDisplay.java @@ -604,7 +604,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> { public void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); - super.writeToProto(proto, CONFIGURATION_CONTAINER); + super.writeToProto(proto, CONFIGURATION_CONTAINER, false /* trim */); proto.write(ID, mDisplayId); for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index b47f81948edb..0e8fc2ce2b54 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -2821,7 +2821,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo public void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); - super.writeToProto(proto, CONFIGURATION_CONTAINER); + super.writeToProto(proto, CONFIGURATION_CONTAINER, false /* trim */); writeIdentifierToProto(proto, IDENTIFIER); proto.write(STATE, state.toString()); proto.write(VISIBLE, visible); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index bafcce7bdefe..7c0df048408d 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -5023,7 +5023,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai public void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); - super.writeToProto(proto, CONFIGURATION_CONTAINER); + super.writeToProto(proto, CONFIGURATION_CONTAINER, false /* trim */); proto.write(ID, mStackId); for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 14c0eeae36aa..5d8636edaa56 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -3692,7 +3692,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } public void writeToProto(ProtoOutputStream proto) { - super.writeToProto(proto, CONFIGURATION_CONTAINER); + super.writeToProto(proto, CONFIGURATION_CONTAINER, false /* trim */); for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx); activityDisplay.writeToProto(proto, DISPLAYS); diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index f04bdb3a81a8..f31ce74a2209 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -2205,7 +2205,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi public void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); - super.writeToProto(proto, CONFIGURATION_CONTAINER); + super.writeToProto(proto, CONFIGURATION_CONTAINER, false /* trim */); proto.write(ID, taskId); for (int i = mActivities.size() - 1; i >= 0; i--) { ActivityRecord activity = mActivities.get(i); diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 5d034935e4fb..e873d32e7278 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1621,10 +1621,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree @CallSuper @Override - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { final long token = proto.start(fieldId); writeNameToProto(proto, NAME); - super.writeToProto(proto, WINDOW_TOKEN); + super.writeToProto(proto, WINDOW_TOKEN, trim); proto.end(token); } diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java index a4ab3ba33e18..cc948070f2fb 100644 --- a/services/core/java/com/android/server/wm/ConfigurationContainer.java +++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java @@ -50,6 +50,9 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { /** Contains override configuration settings applied to this configuration container. */ private Configuration mOverrideConfiguration = new Configuration(); + /** True if mOverrideConfiguration is not empty */ + private boolean mHasOverrideConfiguration; + /** * Contains full configuration applied to this configuration container. Corresponds to full * parent's config with applied {@link #mOverrideConfiguration}. @@ -101,6 +104,9 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { * @see #mFullConfiguration */ public void onOverrideConfigurationChanged(Configuration overrideConfiguration) { + // Pre-compute this here, so we don't need to go through the entire Configuration when + // writing to proto (which has significant cost if we write a lot of empty configurations). + mHasOverrideConfiguration = !Configuration.EMPTY.equals(overrideConfiguration); mOverrideConfiguration.setTo(overrideConfiguration); // Update full configuration of this container and all its children. final ConfigurationContainer parent = getParent(); @@ -330,18 +336,23 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { * Write to a protocol buffer output stream. Protocol buffer message definition is at * {@link com.android.server.wm.proto.ConfigurationContainerProto}. * - * @param protoOutputStream Stream to write the ConfigurationContainer object to. - * @param fieldId Field Id of the ConfigurationContainer as defined in the parent - * message. + * @param proto Stream to write the ConfigurationContainer object to. + * @param fieldId Field Id of the ConfigurationContainer as defined in the parent + * message. + * @param trim If true, reduce amount of data written. * @hide */ @CallSuper - public void writeToProto(ProtoOutputStream protoOutputStream, long fieldId) { - final long token = protoOutputStream.start(fieldId); - mOverrideConfiguration.writeToProto(protoOutputStream, OVERRIDE_CONFIGURATION); - mFullConfiguration.writeToProto(protoOutputStream, FULL_CONFIGURATION); - mMergedOverrideConfiguration.writeToProto(protoOutputStream, MERGED_OVERRIDE_CONFIGURATION); - protoOutputStream.end(token); + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { + final long token = proto.start(fieldId); + if (!trim || mHasOverrideConfiguration) { + mOverrideConfiguration.writeToProto(proto, OVERRIDE_CONFIGURATION); + } + if (!trim) { + mFullConfiguration.writeToProto(proto, FULL_CONFIGURATION); + mMergedOverrideConfiguration.writeToProto(proto, MERGED_OVERRIDE_CONFIGURATION); + } + proto.end(token); } /** diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 03fdc968d87b..4c6ab3f7cc4f 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2137,27 +2137,27 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo @CallSuper @Override - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { final long token = proto.start(fieldId); - super.writeToProto(proto, WINDOW_CONTAINER); + super.writeToProto(proto, WINDOW_CONTAINER, trim); proto.write(ID, mDisplayId); for (int stackNdx = mTaskStackContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { final TaskStack stack = mTaskStackContainers.getChildAt(stackNdx); - stack.writeToProto(proto, STACKS); + stack.writeToProto(proto, STACKS, trim); } mDividerControllerLocked.writeToProto(proto, DOCKED_STACK_DIVIDER_CONTROLLER); mPinnedStackControllerLocked.writeToProto(proto, PINNED_STACK_CONTROLLER); for (int i = mAboveAppWindowsContainers.getChildCount() - 1; i >= 0; --i) { final WindowToken windowToken = mAboveAppWindowsContainers.getChildAt(i); - windowToken.writeToProto(proto, ABOVE_APP_WINDOWS); + windowToken.writeToProto(proto, ABOVE_APP_WINDOWS, trim); } for (int i = mBelowAppWindowsContainers.getChildCount() - 1; i >= 0; --i) { final WindowToken windowToken = mBelowAppWindowsContainers.getChildAt(i); - windowToken.writeToProto(proto, BELOW_APP_WINDOWS); + windowToken.writeToProto(proto, BELOW_APP_WINDOWS, trim); } for (int i = mImeWindowsContainers.getChildCount() - 1; i >= 0; --i) { final WindowToken windowToken = mImeWindowsContainers.getChildAt(i); - windowToken.writeToProto(proto, IME_WINDOWS); + windowToken.writeToProto(proto, IME_WINDOWS, trim); } proto.write(DPI, mBaseDisplayDensity); mDisplayInfo.writeToProto(proto, DISPLAY_INFO); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index fd574709e623..a7104410f4d3 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1081,19 +1081,21 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { @CallSuper @Override - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { final long token = proto.start(fieldId); - super.writeToProto(proto, WINDOW_CONTAINER); + super.writeToProto(proto, WINDOW_CONTAINER, trim); if (mService.mDisplayReady) { final int count = mChildren.size(); for (int i = 0; i < count; ++i) { final DisplayContent displayContent = mChildren.get(i); - displayContent.writeToProto(proto, DISPLAYS); + displayContent.writeToProto(proto, DISPLAYS, trim); } } - forAllWindows((w) -> { - w.writeIdentifierToProto(proto, WINDOWS); - }, true); + if (!trim) { + forAllWindows((w) -> { + w.writeIdentifierToProto(proto, WINDOWS); + }, true); + } proto.end(token); } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 891d637a4efa..7620cb0dfdb9 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -725,13 +725,13 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU @CallSuper @Override - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { final long token = proto.start(fieldId); - super.writeToProto(proto, WINDOW_CONTAINER); + super.writeToProto(proto, WINDOW_CONTAINER, trim); proto.write(ID, mTaskId); for (int i = mChildren.size() - 1; i >= 0; i--) { final AppWindowToken appWindowToken = mChildren.get(i); - appWindowToken.writeToProto(proto, APP_WINDOW_TOKENS); + appWindowToken.writeToProto(proto, APP_WINDOW_TOKENS, trim); } proto.write(FILLS_PARENT, mFillsParent); mBounds.writeToProto(proto, BOUNDS); diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 33202749aca1..791accf8f347 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -1232,12 +1232,12 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye @CallSuper @Override - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { final long token = proto.start(fieldId); - super.writeToProto(proto, WINDOW_CONTAINER); + super.writeToProto(proto, WINDOW_CONTAINER, trim); proto.write(ID, mStackId); for (int taskNdx = mChildren.size() - 1; taskNdx >= 0; taskNdx--) { - mChildren.get(taskNdx).writeToProto(proto, TASKS); + mChildren.get(taskNdx).writeToProto(proto, TASKS, trim); } proto.write(FILLS_PARENT, mFillsParent); mBounds.writeToProto(proto, BOUNDS); diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 563eb9cd1d88..8f4b897cd804 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -677,17 +677,18 @@ a * Returns whether this child is on top of the window hierarchy. * Write to a protocol buffer output stream. Protocol buffer message definition is at * {@link com.android.server.wm.proto.WindowContainerProto}. * - * @param protoOutputStream Stream to write the WindowContainer object to. - * @param fieldId Field Id of the WindowContainer as defined in the parent message. + * @param proto Stream to write the WindowContainer object to. + * @param fieldId Field Id of the WindowContainer as defined in the parent message. + * @param trim If true, reduce the amount of data written. * @hide */ @CallSuper @Override - public void writeToProto(ProtoOutputStream protoOutputStream, long fieldId) { - final long token = protoOutputStream.start(fieldId); - super.writeToProto(protoOutputStream, CONFIGURATION_CONTAINER); - protoOutputStream.write(ORIENTATION, mOrientation); - protoOutputStream.end(token); + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { + final long token = proto.start(fieldId); + super.writeToProto(proto, CONFIGURATION_CONTAINER, trim); + proto.write(ORIENTATION, mOrientation); + proto.end(token); } private ForAllWindowsConsumerWrapper obtainConsumerWrapper(Consumer<WindowState> consumer) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 70d06169ba9e..ad6fc39d91f8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6430,9 +6430,16 @@ public class WindowManagerService extends IWindowManager.Stub } } - private void writeToProtoLocked(ProtoOutputStream proto) { + /** + * Write to a protocol buffer output stream. Protocol buffer message definition is at + * {@link com.android.server.wm.proto.WindowManagerServiceProto}. + * + * @param proto Stream to write the WindowContainer object to. + * @param trim If true, reduce the amount of data written. + */ + private void writeToProtoLocked(ProtoOutputStream proto, boolean trim) { mPolicy.writeToProto(proto, POLICY); - mRoot.writeToProto(proto, ROOT_WINDOW_CONTAINER); + mRoot.writeToProto(proto, ROOT_WINDOW_CONTAINER, trim); if (mCurrentFocus != null) { mCurrentFocus.writeIdentifierToProto(proto, FOCUSED_WINDOW); } @@ -6768,7 +6775,7 @@ public class WindowManagerService extends IWindowManager.Stub if (useProto) { final ProtoOutputStream proto = new ProtoOutputStream(fd); synchronized (mWindowMap) { - writeToProtoLocked(proto); + writeToProtoLocked(proto, false /* trim */); } proto.flush(); return; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index e171528403d0..4370a7637e01 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3120,9 +3120,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @CallSuper @Override - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { final long token = proto.start(fieldId); - super.writeToProto(proto, WINDOW_CONTAINER); + super.writeToProto(proto, WINDOW_CONTAINER, trim); writeIdentifierToProto(proto, IDENTIFIER); proto.write(DISPLAY_ID, getDisplayId()); proto.write(STACK_ID, getStackId()); @@ -3137,7 +3137,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mWinAnimator.writeToProto(proto, ANIMATOR); proto.write(ANIMATING_EXIT, mAnimatingExit); for (int i = 0; i < mChildren.size(); i++) { - mChildren.get(i).writeToProto(proto, CHILD_WINDOWS); + mChildren.get(i).writeToProto(proto, CHILD_WINDOWS, trim); } proto.end(token); } diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 943448eea2b0..62a2abbb15ec 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -267,13 +267,13 @@ class WindowToken extends WindowContainer<WindowState> { @CallSuper @Override - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) { final long token = proto.start(fieldId); - super.writeToProto(proto, WINDOW_CONTAINER); + super.writeToProto(proto, WINDOW_CONTAINER, trim); proto.write(HASH_CODE, System.identityHashCode(this)); for (int i = 0; i < mChildren.size(); i++) { final WindowState w = mChildren.get(i); - w.writeToProto(proto, WINDOWS); + w.writeToProto(proto, WINDOWS, trim); } proto.end(token); } |