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;