OSDN Git Service

Fix issue #11050678: Large memory leak in ActivityStack
authorDianne Hackborn <hackbod@google.com>
Fri, 4 Oct 2013 23:44:22 +0000 (16:44 -0700)
committerDianne Hackborn <hackbod@google.com>
Fri, 4 Oct 2013 23:44:22 +0000 (16:44 -0700)
Clear thumbnails from tasks that are removed from the recent tasks list.

Change-Id: I581d5baac9b5a3e046a654eb8448ff877dd2f120

services/java/com/android/server/am/ActivityManagerService.java
services/java/com/android/server/am/TaskRecord.java
services/java/com/android/server/am/ThumbnailHolder.java

index f23bcba..f2424d1 100644 (file)
@@ -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;
index 385253e..3d568ff 100644 (file)
@@ -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);
index 02f4fcb..a6974f5 100644 (file)
@@ -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;
+    }
 }