summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dianne Hackborn <hackbod@google.com> 2013-10-04 16:44:22 -0700
committer Dianne Hackborn <hackbod@google.com> 2013-10-04 16:44:22 -0700
commit9844d299af6dcdabf6f9f9e1318b5f843ead1ea4 (patch)
treebfb0d98f1f7ddde67b42029d97a6ebce67ffede6
parentae7b22d61df0aef471c50d56a06a7d4316daffc6 (diff)
Fix issue #11050678: Large memory leak in ActivityStack
Clear thumbnails from tasks that are removed from the recent tasks list. Change-Id: I581d5baac9b5a3e046a654eb8448ff877dd2f120
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java4
-rw-r--r--services/java/com/android/server/am/TaskRecord.java10
-rw-r--r--services/java/com/android/server/am/ThumbnailHolder.java5
3 files changed, 18 insertions, 1 deletions
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index f23bcba6f04a..f2424d1f6f56 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3193,6 +3193,7 @@ public final class ActivityManagerService extends ActivityManagerNative
if (task.userId == tr.userId
&& ((task.affinity != null && task.affinity.equals(tr.affinity))
|| (task.intent != null && task.intent.filterEquals(tr.intent)))) {
+ tr.disposeThumbnail();
mRecentTasks.remove(i);
i--;
N--;
@@ -3204,7 +3205,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
if (N >= MAX_RECENT_TASKS) {
- mRecentTasks.remove(N-1);
+ mRecentTasks.remove(N-1).disposeThumbnail();
}
mRecentTasks.add(0, task);
}
@@ -6738,6 +6739,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
private void cleanUpRemovedTaskLocked(TaskRecord tr, int flags) {
+ tr.disposeThumbnail();
mRecentTasks.remove(tr);
mStackSupervisor.removeTask(tr);
final boolean killProcesses = (flags&ActivityManager.REMOVE_TASK_KILL_PROCESS) != 0;
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index 385253ef5bce..3d568ffb8e07 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -128,6 +128,16 @@ final class TaskRecord extends ThumbnailHolder {
}
}
+ void disposeThumbnail() {
+ super.disposeThumbnail();
+ for (int i=mActivities.size()-1; i>=0; i--) {
+ ThumbnailHolder thumb = mActivities.get(i).thumbHolder;
+ if (thumb != this) {
+ thumb.disposeThumbnail();
+ }
+ }
+ }
+
ActivityRecord getTopActivity() {
for (int i = mActivities.size() - 1; i >= 0; --i) {
final ActivityRecord r = mActivities.get(i);
diff --git a/services/java/com/android/server/am/ThumbnailHolder.java b/services/java/com/android/server/am/ThumbnailHolder.java
index 02f4fcbf1a7c..a6974f56356d 100644
--- a/services/java/com/android/server/am/ThumbnailHolder.java
+++ b/services/java/com/android/server/am/ThumbnailHolder.java
@@ -21,4 +21,9 @@ import android.graphics.Bitmap;
public class ThumbnailHolder {
Bitmap lastThumbnail; // Last thumbnail captured for this item.
CharSequence lastDescription; // Last description captured for this item.
+
+ void disposeThumbnail() {
+ lastThumbnail = null;
+ lastDescription = null;
+ }
}