diff options
| author | 2023-03-14 14:45:26 +0000 | |
|---|---|---|
| committer | 2023-03-14 14:45:26 +0000 | |
| commit | a608e4719beea0b2f973f5faf80d647afe787294 (patch) | |
| tree | d39f366700d3ade88e2c9d67a838f9a117e62311 | |
| parent | 8e3b8b0e5fc9448851ebc205e0f969786d8c90a2 (diff) | |
| parent | 3826929d4c0eb6110424215657c0bb3d18a71a1c (diff) | |
Merge "WindowProcessController: Fix potential memory leak" am: 447f3f2f22 am: 3826929d4c
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2485123
Change-Id: I1db07266eaedeb05df080c0ae2bf3c43910ed9f4
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
4 files changed, 32 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 7123e34b5343..3304ffa180cc 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1341,6 +1341,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } /** + * Destroys the WindwoProcessController, after the process has been removed. + */ + void destroy() { + unregisterConfigurationListeners(); + } + + /** * Check if activity configuration override for the activity process needs an update and perform * if needed. By default we try to override the process configuration to match the top activity * config to increase app compatibility with multi-window and multi-display. The process will diff --git a/services/core/java/com/android/server/wm/WindowProcessControllerMap.java b/services/core/java/com/android/server/wm/WindowProcessControllerMap.java index 2767972f7ea0..424b0436a008 100644 --- a/services/core/java/com/android/server/wm/WindowProcessControllerMap.java +++ b/services/core/java/com/android/server/wm/WindowProcessControllerMap.java @@ -19,8 +19,8 @@ package com.android.server.wm; import android.util.ArraySet; import android.util.SparseArray; -import java.util.Map; import java.util.HashMap; +import java.util.Map; final class WindowProcessControllerMap { @@ -67,6 +67,7 @@ final class WindowProcessControllerMap { mPidMap.remove(pid); // remove process from mUidMap removeProcessFromUidMap(proc); + proc.destroy(); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerMapTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerMapTests.java index c2ee0798fd07..2a3c9bca0cc6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerMapTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerMapTests.java @@ -22,6 +22,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; @@ -129,4 +131,14 @@ public class WindowProcessControllerMapTests extends WindowTestsBase { assertEquals(uid2processes.size(), 1); assertEquals(mProcessMap.getProcess(FAKE_PID1), pid1uid2); } + + @Test + public void testRemove_callsDestroy() { + var proc = spy(pid1uid1); + mProcessMap.put(FAKE_PID1, proc); + + mProcessMap.remove(FAKE_PID1); + + verify(proc).destroy(); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java index 8bd414856394..60bdec154281 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java @@ -158,6 +158,17 @@ public class WindowProcessControllerTests extends WindowTestsBase { } @Test + public void testDestroy_unregistersDisplayAreaListener() { + final TestDisplayContent testDisplayContent1 = createTestDisplayContentInContainer(); + final DisplayArea imeContainer1 = testDisplayContent1.getImeContainer(); + mWpc.registerDisplayAreaConfigurationListener(imeContainer1); + + mWpc.destroy(); + + assertNull(mWpc.getDisplayArea()); + } + + @Test public void testSetRunningRecentsAnimation() { mWpc.setRunningRecentsAnimation(true); mWpc.setRunningRecentsAnimation(false); |