From d42ab1b93834292f234b314317794194d338c896 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Fri, 19 Jun 2020 00:49:51 +0200 Subject: [PATCH] Pass in callsite of SurfaceControl constructor explicitly (1/3) Creating a new Throwable (and filling in the stack trace) can take up to 150us. Since we do this on the critical path when sending over SurfaceControl via binder multiple times, this is too much. Instead, add an option to pass in callsite manually. Bug: 159056748 Change-Id: I46c339c15a07192d61c4c546e46f260684a47120 Merged-In: I46c339c15a07192d61c4c546e46f260684a47120 Exempt-From-Owner-Approval: Large scale refactor --- api/test-current.txt | 2 +- core/java/android/os/StrictMode.java | 7 ++++ .../strictmode/LeakedClosableViolation.java | 5 +++ .../android/view/InsetsSourceControl.java | 2 +- core/java/android/view/SurfaceControl.java | 42 +++++++++++++------ .../android/view/SurfaceControlViewHost.java | 7 ++-- core/java/android/view/SurfaceView.java | 2 + core/java/android/view/View.java | 1 + core/java/android/view/ViewRootImpl.java | 1 + .../android/view/WindowlessWindowManager.java | 5 ++- core/java/android/widget/Magnifier.java | 1 + core/java/android/window/TaskEmbedder.java | 1 + .../android/view/InsetsControllerTest.java | 2 +- .../SplitScreenTaskOrganizer.java | 8 +++- .../com/android/server/display/ColorFade.java | 5 ++- .../server/wm/AccessibilityController.java | 1 + .../com/android/server/wm/ActivityRecord.java | 3 +- .../com/android/server/wm/BlackFrame.java | 1 + .../java/com/android/server/wm/Dimmer.java | 1 + .../wm/DisplayAreaOrganizerController.java | 3 +- .../com/android/server/wm/DisplayContent.java | 7 +++- .../java/com/android/server/wm/DragState.java | 4 +- .../server/wm/EmulatorDisplayOverlay.java | 1 + .../android/server/wm/InputConsumerImpl.java | 6 ++- .../java/com/android/server/wm/Letterbox.java | 8 +++- .../server/wm/ScreenRotationAnimation.java | 3 ++ .../java/com/android/server/wm/ShellRoot.java | 5 ++- .../android/server/wm/StrictModeFlash.java | 1 + .../android/server/wm/SurfaceAnimator.java | 3 +- .../com/android/server/wm/SurfaceFreezer.java | 1 + .../android/server/wm/TaskDisplayArea.java | 4 ++ .../server/wm/TaskOrganizerController.java | 3 +- .../server/wm/TaskPositioningController.java | 4 +- .../server/wm/TaskScreenshotAnimatable.java | 1 + .../server/wm/TaskSnapshotSurface.java | 1 + .../java/com/android/server/wm/Watermark.java | 1 + .../android/server/wm/WindowContainer.java | 2 +- .../server/wm/WindowContainerThumbnail.java | 1 + .../server/wm/WindowManagerService.java | 2 +- .../server/wm/WindowOrganizerController.java | 3 +- .../server/wm/WindowSurfaceController.java | 8 ++-- .../testing/shadows/ShadowCloseGuard.java | 5 +++ .../com/android/server/wm/LetterboxTest.java | 1 + 43 files changed, 131 insertions(+), 44 deletions(-) diff --git a/api/test-current.txt b/api/test-current.txt index 7fd56984799f1..3838bad57aa71 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5149,7 +5149,7 @@ package android.view { } public final class SurfaceControl implements android.os.Parcelable { - ctor public SurfaceControl(@NonNull android.view.SurfaceControl); + ctor public SurfaceControl(@NonNull android.view.SurfaceControl, @NonNull String); method public static long acquireFrameRateFlexibilityToken(); method public boolean isSameSurface(@NonNull android.view.SurfaceControl); method public static void releaseFrameRateFlexibilityToken(long); diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 8d65c92db52e0..257bc5b642857 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1918,9 +1918,16 @@ public final class StrictMode { } private static class AndroidCloseGuardReporter implements CloseGuard.Reporter { + + @Override public void report(String message, Throwable allocationSite) { onVmPolicyViolation(new LeakedClosableViolation(message, allocationSite)); } + + @Override + public void report(String message) { + onVmPolicyViolation(new LeakedClosableViolation(message)); + } } /** Called from Parcel.writeNoException() */ diff --git a/core/java/android/os/strictmode/LeakedClosableViolation.java b/core/java/android/os/strictmode/LeakedClosableViolation.java index c795a6b89ec01..a2b02833afa0b 100644 --- a/core/java/android/os/strictmode/LeakedClosableViolation.java +++ b/core/java/android/os/strictmode/LeakedClosableViolation.java @@ -21,4 +21,9 @@ public final class LeakedClosableViolation extends Violation { super(message); initCause(allocationSite); } + + /** @hide */ + public LeakedClosableViolation(String message) { + super(message); + } } diff --git a/core/java/android/view/InsetsSourceControl.java b/core/java/android/view/InsetsSourceControl.java index 2c2ecd504519b..51b49214387a0 100644 --- a/core/java/android/view/InsetsSourceControl.java +++ b/core/java/android/view/InsetsSourceControl.java @@ -45,7 +45,7 @@ public class InsetsSourceControl implements Parcelable { public InsetsSourceControl(InsetsSourceControl other) { mType = other.mType; if (other.mLeash != null) { - mLeash = new SurfaceControl(other.mLeash); + mLeash = new SurfaceControl(other.mLeash, "InsetsSourceControl"); } else { mLeash = null; } diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index daeb1c9c1e015..87b2f4b46df7a 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -499,14 +499,12 @@ public final class SurfaceControl implements Parcelable { private static final int INTERNAL_DATASPACE_DISPLAY_P3 = 143261696; private static final int INTERNAL_DATASPACE_SCRGB = 411107328; - private void assignNativeObject(long nativeObject) { + private void assignNativeObject(long nativeObject, String callsite) { if (mNativeObject != 0) { release(); } if (nativeObject != 0) { - Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "closeGuard"); - mCloseGuard.open("release"); - Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); + mCloseGuard.openWithCallSite("release", callsite); } mNativeObject = nativeObject; mNativeHandle = mNativeObject != 0 ? nativeGetHandle(nativeObject) : 0; @@ -515,12 +513,12 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public void copyFrom(@NonNull SurfaceControl other) { + public void copyFrom(@NonNull SurfaceControl other, String callsite) { mName = other.mName; mWidth = other.mWidth; mHeight = other.mHeight; mLocalOwnerView = other.mLocalOwnerView; - assignNativeObject(nativeCopyFromSurfaceControl(other.mNativeObject)); + assignNativeObject(nativeCopyFromSurfaceControl(other.mNativeObject), callsite); } /** @@ -621,6 +619,7 @@ public final class SurfaceControl implements Parcelable { private WeakReference mLocalOwnerView; private SurfaceControl mParent; private SparseIntArray mMetadata; + private String mCallsite = "SurfaceControl.Builder"; /** * Begin building a SurfaceControl with a given {@link SurfaceSession}. @@ -654,7 +653,7 @@ public final class SurfaceControl implements Parcelable { } return new SurfaceControl( mSession, mName, mWidth, mHeight, mFormat, mFlags, mParent, mMetadata, - mLocalOwnerView); + mLocalOwnerView, mCallsite); } /** @@ -912,6 +911,18 @@ public final class SurfaceControl implements Parcelable { return this; } + /** + * Sets the callsite this SurfaceControl is constructed from. + * + * @param callsite String uniquely identifying callsite that created this object. Used for + * leakage tracking. + * @hide + */ + public Builder setCallsite(String callsite) { + mCallsite = callsite; + return this; + } + private Builder setFlags(int flags, int mask) { mFlags = (mFlags & ~mask) | flags; return this; @@ -943,10 +954,13 @@ public final class SurfaceControl implements Parcelable { * @param h The surface initial height. * @param flags The surface creation flags. * @param metadata Initial metadata. + * @param callsite String uniquely identifying callsite that created this object. Used for + * leakage tracking. * @throws throws OutOfResourcesException If the SurfaceControl cannot be created. */ private SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags, - SurfaceControl parent, SparseIntArray metadata, WeakReference localOwnerView) + SurfaceControl parent, SparseIntArray metadata, WeakReference localOwnerView, + String callsite) throws OutOfResourcesException, IllegalArgumentException { if (name == null) { throw new IllegalArgumentException("name must not be null"); @@ -978,18 +992,20 @@ public final class SurfaceControl implements Parcelable { "Couldn't allocate SurfaceControl native object"); } mNativeHandle = nativeGetHandle(mNativeObject); - mCloseGuard.open("release"); + mCloseGuard.openWithCallSite("release", callsite); } /** * Copy constructor. Creates a new native object pointing to the same surface as {@code other}. * * @param other The object to copy the surface from. + * @param callsite String uniquely identifying callsite that created this object. Used for + * leakage tracking. * @hide */ @TestApi - public SurfaceControl(@NonNull SurfaceControl other) { - copyFrom(other); + public SurfaceControl(@NonNull SurfaceControl other, @NonNull String callsite) { + copyFrom(other, callsite); } private SurfaceControl(Parcel in) { @@ -1015,7 +1031,7 @@ public final class SurfaceControl implements Parcelable { if (in.readInt() != 0) { object = nativeReadFromParcel(in); } - assignNativeObject(object); + assignNativeObject(object, "readFromParcel"); } @Override @@ -2209,7 +2225,7 @@ public final class SurfaceControl implements Parcelable { public static SurfaceControl mirrorSurface(SurfaceControl mirrorOf) { long nativeObj = nativeMirrorSurface(mirrorOf.mNativeObject); SurfaceControl sc = new SurfaceControl(); - sc.assignNativeObject(nativeObj); + sc.assignNativeObject(nativeObj, "mirrorSurface"); return sc; } diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index 86a4fe170387f..66ab3a32edfa6 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -167,9 +167,10 @@ public class SurfaceControlViewHost { public SurfaceControlViewHost(@NonNull Context context, @NonNull Display display, @Nullable IBinder hostToken) { mSurfaceControl = new SurfaceControl.Builder() - .setContainerLayer() - .setName("SurfaceControlViewHost") - .build(); + .setContainerLayer() + .setName("SurfaceControlViewHost") + .setCallsite("SurfaceControlViewHost") + .build(); mWm = new WindowlessWindowManager(context.getResources().getConfiguration(), mSurfaceControl, hostToken); mViewRoot = new ViewRootImpl(context, display, mWm); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 0d21eb5cf920a..bb0de120dedc7 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -993,6 +993,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall .setFormat(mFormat) .setParent(viewRoot.getBoundsLayer()) .setFlags(mSurfaceFlags) + .setCallsite("SurfaceView.updateSurface") .build(); mBackgroundControl = new SurfaceControl.Builder(mSurfaceSession) .setName("Background for -" + name) @@ -1000,6 +1001,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall .setOpaque(true) .setColorLayer() .setParent(mSurfaceControl) + .setCallsite("SurfaceView.updateSurface") .build(); } else if (mSurfaceControl == null) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index df1c672eb9ebd..ca424e79ed7b7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -26372,6 +26372,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, .setParent(root.getSurfaceControl()) .setBufferSize(shadowSize.x, shadowSize.y) .setFormat(PixelFormat.TRANSLUCENT) + .setCallsite("View.startDragAndDrop") .build(); final Surface surface = new Surface(); surface.copyFrom(surfaceControl); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b860bac0d0012..87c0823246234 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1780,6 +1780,7 @@ public final class ViewRootImpl implements ViewParent, .setContainerLayer() .setName("Bounds for - " + getTitle().toString()) .setParent(getRenderSurfaceControl()) + .setCallsite("ViewRootImpl.getBoundsLayer") .build(); setBoundsLayerCrop(); mTransaction.show(mBoundsLayer).apply(); diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index d2e506ea550c9..1af4c3636ac55 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -136,7 +136,8 @@ public class WindowlessWindowManager implements IWindowSession { .setParent(mRootSurface) .setFormat(attrs.format) .setBufferSize(getSurfaceWidth(attrs), getSurfaceHeight(attrs)) - .setName(attrs.getTitle().toString()); + .setName(attrs.getTitle().toString()) + .setCallsite("WindowlessWindowManager.addToDisplay"); final SurfaceControl sc = b.build(); if (((attrs.inputFeatures & @@ -248,7 +249,7 @@ public class WindowlessWindowManager implements IWindowSession { if (viewFlags == View.VISIBLE) { t.setBufferSize(sc, getSurfaceWidth(attrs), getSurfaceHeight(attrs)) .setOpaque(sc, isOpaque(attrs)).show(sc).apply(); - outSurfaceControl.copyFrom(sc); + outSurfaceControl.copyFrom(sc, "WindowlessWindowManager.relayout"); } else { t.hide(sc).apply(); outSurfaceControl.release(); diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index 8ea824d3ce82e..7fa8f9a315265 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -1000,6 +1000,7 @@ public final class Magnifier { .setName("magnifier surface") .setFlags(SurfaceControl.HIDDEN) .setParent(parentSurfaceControl) + .setCallsite("InternalPopupWindow") .build(); mSurface = new Surface(); mSurface.copyFrom(mSurfaceControl); diff --git a/core/java/android/window/TaskEmbedder.java b/core/java/android/window/TaskEmbedder.java index ca6c568c2668c..0687a037df32a 100644 --- a/core/java/android/window/TaskEmbedder.java +++ b/core/java/android/window/TaskEmbedder.java @@ -164,6 +164,7 @@ public abstract class TaskEmbedder { .setContainerLayer() .setParent(parent) .setName(name) + .setCallsite("TaskEmbedder.initialize") .build(); if (!onInitialize()) { diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java index 964ae21d6086b..702f2fa65487b 100644 --- a/core/tests/coretests/src/android/view/InsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -717,7 +717,7 @@ public class InsetsControllerTest { // Simulate binder behavior by copying SurfaceControl. Otherwise, InsetsController will // attempt to release mLeash directly. - SurfaceControl copy = new SurfaceControl(mLeash); + SurfaceControl copy = new SurfaceControl(mLeash, "InsetsControllerTest.createControl"); return new InsetsSourceControl(type, copy, new Point()); } diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java index 4a2cad705c173..7a313dc0622bb 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java @@ -102,10 +102,14 @@ class SplitScreenTaskOrganizer extends TaskOrganizer { // Initialize dim surfaces: mPrimaryDim = new SurfaceControl.Builder(mSurfaceSession) .setParent(mPrimarySurface).setColorLayer() - .setName("Primary Divider Dim").build(); + .setName("Primary Divider Dim") + .setCallsite("SplitScreenTaskOrganizer.onTaskAppeared") + .build(); mSecondaryDim = new SurfaceControl.Builder(mSurfaceSession) .setParent(mSecondarySurface).setColorLayer() - .setName("Secondary Divider Dim").build(); + .setName("Secondary Divider Dim") + .setCallsite("SplitScreenTaskOrganizer.onTaskAppeared") + .build(); SurfaceControl.Transaction t = getTransaction(); t.setLayer(mPrimaryDim, Integer.MAX_VALUE); t.setColor(mPrimaryDim, new float[]{0f, 0f, 0f}); diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index 29026e8affcf2..ec2b0c0a68307 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -588,8 +588,9 @@ final class ColorFade { if (mSurfaceControl == null) { Transaction t = new Transaction(); try { - final SurfaceControl.Builder builder = - new SurfaceControl.Builder(mSurfaceSession).setName("ColorFade"); + final SurfaceControl.Builder builder = new SurfaceControl.Builder(mSurfaceSession) + .setName("ColorFade") + .setCallsite("ColorFade.createSurface"); if (mMode == MODE_FADE) { builder.setColorLayer(); } else { diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index b9240c78d7117..1e65884422a9d 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -893,6 +893,7 @@ final class AccessibilityController { .setName(SURFACE_TITLE) .setBufferSize(mTempPoint.x, mTempPoint.y) // not a typo .setFormat(PixelFormat.TRANSLUCENT) + .setCallsite("ViewportWindow") .build(); } catch (OutOfResourcesException oore) { /* ignore */ diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 319fd18faca5d..09762e8a6048e 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5910,7 +5910,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ProtoLog.i(WM_DEBUG_APP_TRANSITIONS_ANIM, "Creating animation bounds layer"); final SurfaceControl.Builder builder = makeAnimationLeash() .setParent(getAnimationLeashParent()) - .setName(getSurfaceControl() + " - animation-bounds"); + .setName(getSurfaceControl() + " - animation-bounds") + .setCallsite("ActivityRecord.createAnimationBoundsLayer"); final SurfaceControl boundsLayer = builder.build(); t.show(boundsLayer); return boundsLayer; diff --git a/services/core/java/com/android/server/wm/BlackFrame.java b/services/core/java/com/android/server/wm/BlackFrame.java index 8ab17950f4fc4..f563e57b363e0 100644 --- a/services/core/java/com/android/server/wm/BlackFrame.java +++ b/services/core/java/com/android/server/wm/BlackFrame.java @@ -50,6 +50,7 @@ public class BlackFrame { .setName("BlackSurface") .setColorLayer() .setParent(surfaceControl) + .setCallsite("BlackSurface") .build(); transaction.setWindowCrop(surface, w, h); transaction.setAlpha(surface, 1); diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java index d43a7b87ee355..07729d17d7b2e 100644 --- a/services/core/java/com/android/server/wm/Dimmer.java +++ b/services/core/java/com/android/server/wm/Dimmer.java @@ -175,6 +175,7 @@ class Dimmer { .setParent(mHost.getSurfaceControl()) .setColorLayer() .setName("Dim Layer for - " + mHost.getName()) + .setCallsite("Dimmer.makeDimLayer") .build(); } diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java index b6c71bb176313..9a397fe07f4ee 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java @@ -114,7 +114,8 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) { try { - SurfaceControl outSurfaceControl = new SurfaceControl(da.getSurfaceControl()); + SurfaceControl outSurfaceControl = new SurfaceControl(da.getSurfaceControl(), + "DisplayAreaOrganizerController.onDisplayAreaAppeared"); organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo(), outSurfaceControl); } catch (RemoteException e) { // Oh well... diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index afe40b8d80164..5142586649a92 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -987,7 +987,10 @@ class DisplayContent extends WindowContainer { super.onParentChanged(newParent, oldParent, () -> { mAppAnimationLayer = makeChildSurface(null) .setName("animationLayer") + .setCallsite("TaskDisplayArea.onParentChanged") .build(); mBoostedAppAnimationLayer = makeChildSurface(null) .setName("boostedAnimationLayer") + .setCallsite("TaskDisplayArea.onParentChanged") .build(); mHomeAppAnimationLayer = makeChildSurface(null) .setName("homeAnimationLayer") + .setCallsite("TaskDisplayArea.onParentChanged") .build(); mSplitScreenDividerAnchor = makeChildSurface(null) .setName("splitScreenDividerAnchor") + .setCallsite("TaskDisplayArea.onParentChanged") .build(); getSyncTransaction() .show(mAppAnimationLayer) diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 574f37b874438..f70bf18cdea57 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -117,7 +117,8 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { final RunningTaskInfo taskInfo = task.getTaskInfo(); mDeferTaskOrgCallbacksConsumer.accept(() -> { try { - SurfaceControl outSurfaceControl = new SurfaceControl(task.getSurfaceControl()); + SurfaceControl outSurfaceControl = new SurfaceControl(task.getSurfaceControl(), + "TaskOrganizerController.onTaskAppeared"); if (!task.mCreatedByOrganizer && !visible) { // To prevent flashes, we hide the task prior to sending the leash to the // task org if the task has previously hidden (ie. when entering PIP) diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java index d343daf46f139..b9a449f558f04 100644 --- a/services/core/java/com/android/server/wm/TaskPositioningController.java +++ b/services/core/java/com/android/server/wm/TaskPositioningController.java @@ -86,7 +86,9 @@ class TaskPositioningController { if (mInputSurface == null) { mInputSurface = mService.makeSurfaceBuilder(dc.getSession()) .setContainerLayer() - .setName("Drag and Drop Input Consumer").build(); + .setName("Drag and Drop Input Consumer") + .setCallsite("TaskPositioningController.showInputSurface") + .build(); } final InputWindowHandle h = getDragWindowHandleLocked(); diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java index adecc36671c92..23f55051af903 100644 --- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java +++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java @@ -52,6 +52,7 @@ class TaskScreenshotAnimatable implements SurfaceAnimator.Animatable { mSurfaceControl = surfaceControlFactory.apply(new SurfaceSession()) .setName("RecentTaskScreenshotSurface") .setBufferSize(mWidth, mHeight) + .setCallsite("TaskScreenshotAnimatable") .build(); if (buffer != null) { final Surface surface = new Surface(); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index f1f576220a9ac..3fc09c93550cf 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -374,6 +374,7 @@ class TaskSnapshotSurface implements StartingSurface { .setBufferSize(buffer.getWidth(), buffer.getHeight()) .setFormat(buffer.getFormat()) .setParent(mSurfaceControl) + .setCallsite("TaskSnapshotSurface.drawSizeMismatchSnapshot") .build(); Surface surface = mService.mSurfaceFactory.get(); surface.copyFrom(mChildSurfaceControl); diff --git a/services/core/java/com/android/server/wm/Watermark.java b/services/core/java/com/android/server/wm/Watermark.java index 3d49ebe306e67..7f28ffc5634ca 100644 --- a/services/core/java/com/android/server/wm/Watermark.java +++ b/services/core/java/com/android/server/wm/Watermark.java @@ -121,6 +121,7 @@ class Watermark { .setName("WatermarkSurface") .setBufferSize(1, 1) .setFormat(PixelFormat.TRANSLUCENT) + .setCallsite("Watermark") .build(); t.setLayer(ctrl, WindowManagerService.TYPE_LAYER_MULTIPLIER * 100) .setPosition(ctrl, 0, 0) diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 1a6d85547c926..2977968f57543 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -413,7 +413,7 @@ class WindowContainer extends ConfigurationContainer< } void setInitialSurfaceControlProperties(SurfaceControl.Builder b) { - setSurfaceControl(b.build()); + setSurfaceControl(b.setCallsite("WindowContainer.setInitialSurfaceControlProperties").build()); getSyncTransaction().show(mSurfaceControl); onSurfaceShown(getSyncTransaction()); updateSurfacePosition(); diff --git a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java index 126154b103505..ee99f45b48ff9 100644 --- a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java +++ b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java @@ -103,6 +103,7 @@ class WindowContainerThumbnail implements Animatable { .setFormat(PixelFormat.TRANSLUCENT) .setMetadata(METADATA_WINDOW_TYPE, mWindowContainer.getWindowingMode()) .setMetadata(METADATA_OWNER_UID, Process.myUid()) + .setCallsite("WindowContainerThumbnail") .build(); ProtoLog.i(WM_SHOW_TRANSACTIONS, " THUMBNAIL %s: CREATE", mSurfaceControl); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 564eecf725cca..b1756b07ad83a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8229,7 +8229,7 @@ public class WindowManagerService extends IWindowManager.Stub } final SurfaceControl mirror = SurfaceControl.mirrorSurface(displaySc); - outSurfaceControl.copyFrom(mirror); + outSurfaceControl.copyFrom(mirror, "WMS.mirrorDisplay"); return true; } diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 46e1bf04bdbe7..930bfded39a47 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -459,6 +459,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub .setBufferSize(bounds.width(), bounds.height()) .setFormat(PixelFormat.TRANSLUCENT) .setParent(wc.getParentSurfaceControl()) + .setCallsite("WindowOrganizerController.takeScreenshot") .build(); Surface surface = new Surface(); @@ -466,7 +467,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub surface.attachAndQueueBufferWithColorSpace(buffer.getGraphicBuffer(), null); surface.release(); - outSurfaceControl.copyFrom(screenshot); + outSurfaceControl.copyFrom(screenshot, "WindowOrganizerController.takeScreenshot"); return true; } diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index b2bfcdc8a9003..b89cdd32e1323 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -116,7 +116,8 @@ class WindowSurfaceController { .setFormat(format) .setFlags(flags) .setMetadata(METADATA_WINDOW_TYPE, windowType) - .setMetadata(METADATA_OWNER_UID, ownerUid); + .setMetadata(METADATA_OWNER_UID, ownerUid) + .setCallsite("WindowSurfaceController"); final boolean useBLAST = mService.mUseBLAST && ((win.getAttrs().privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST) != 0); @@ -132,6 +133,7 @@ class WindowSurfaceController { .setName(name + "(BLAST)") .setHidden(false) .setBLASTLayer() + .setCallsite("WindowSurfaceController") .build(); } @@ -493,12 +495,12 @@ class WindowSurfaceController { } void getSurfaceControl(SurfaceControl outSurfaceControl) { - outSurfaceControl.copyFrom(mSurfaceControl); + outSurfaceControl.copyFrom(mSurfaceControl, "WindowSurfaceController.getSurfaceControl"); } void getBLASTSurfaceControl(SurfaceControl outSurfaceControl) { if (mBLASTSurfaceControl != null) { - outSurfaceControl.copyFrom(mBLASTSurfaceControl); + outSurfaceControl.copyFrom(mBLASTSurfaceControl, "WindowSurfaceController.getBLASTSurfaceControl"); } } diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowCloseGuard.java b/services/robotests/src/com/android/server/testing/shadows/ShadowCloseGuard.java index c9984bf070592..4055dfc08f90c 100644 --- a/services/robotests/src/com/android/server/testing/shadows/ShadowCloseGuard.java +++ b/services/robotests/src/com/android/server/testing/shadows/ShadowCloseGuard.java @@ -44,5 +44,10 @@ public class ShadowCloseGuard { public void report(String message, Throwable allocationSite) { mReports += 1; } + + @Override + public void report(String message) { + mReports += 1; + } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java index 2251ee047d29c..ce3f270460c15 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java @@ -18,6 +18,7 @@ package com.android.server.wm; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer;