summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adrian Roos <roosa@google.com> 2023-03-14 14:45:26 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-03-14 14:45:26 +0000
commita608e4719beea0b2f973f5faf80d647afe787294 (patch)
treed39f366700d3ade88e2c9d67a838f9a117e62311
parent8e3b8b0e5fc9448851ebc205e0f969786d8c90a2 (diff)
parent3826929d4c0eb6110424215657c0bb3d18a71a1c (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>
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java7
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessControllerMap.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerMapTests.java12
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java11
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);