diff options
| author | 2013-10-06 20:28:47 +0000 | |
|---|---|---|
| committer | 2013-10-06 20:28:47 +0000 | |
| commit | 4bc5909a035b8b92be051762db2ee97cf55ea861 (patch) | |
| tree | 89bb119d8f19bb024c2efc6ad888d62b51b7cf09 | |
| parent | f46bb1d99bc168f1812fdd5aca4282eb37984016 (diff) | |
| parent | 9844d299af6dcdabf6f9f9e1318b5f843ead1ea4 (diff) | |
Merge "Fix issue #11050678: Large memory leak in ActivityStack" into klp-dev
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 7c15abc7ca8a..b3fe8f6d47eb 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; + } } |