Fix crash when processes die.

Bug: 9902561
Change-Id: I83682034095c905171bf284bf7d9fc0860f2b0f9
diff --git a/src/com/android/launcher3/MemoryTracker.java b/src/com/android/launcher3/MemoryTracker.java
index d3bb77c..0a796a2 100644
--- a/src/com/android/launcher3/MemoryTracker.java
+++ b/src/com/android/launcher3/MemoryTracker.java
@@ -107,24 +107,33 @@
             if (mPids.contains(lpid)) return;
 
             mPids.add(lpid);
-            final int N = mPids.size();
-            mPidsArray = new int[N];
-            StringBuffer sb = new StringBuffer("Now tracking processes: ");
-            for (int i=0; i<N; i++) {
-                final int p = mPids.get(i).intValue();
-                mPidsArray[i] = p;
-                sb.append(p); sb.append(" ");
-            }
+            updatePidsArrayL();
+
             mData.put(pid, new ProcessMemInfo(pid, name, start));
-            Log.v(TAG, sb.toString());
         }
     }
 
+    void updatePidsArrayL() {
+        final int N = mPids.size();
+        mPidsArray = new int[N];
+        StringBuffer sb = new StringBuffer("Now tracking processes: ");
+        for (int i=0; i<N; i++) {
+            final int p = mPids.get(i).intValue();
+            mPidsArray[i] = p;
+            sb.append(p); sb.append(" ");
+        }
+        Log.v(TAG, sb.toString());
+    }
+
     void update() {
         synchronized (mLock) {
             Debug.MemoryInfo[] dinfos = mAm.getProcessMemoryInfo(mPidsArray);
             for (int i=0; i<dinfos.length; i++) {
                 Debug.MemoryInfo dinfo = dinfos[i];
+                if (i > mPids.size()) {
+                    Log.e(TAG, "update: unknown process info received: " + dinfo);
+                    break;
+                }
                 final long pid = mPids.get(i).intValue();
                 final ProcessMemInfo info = mData.get(pid);
                 info.head = (info.head+1) % info.pss.length;
@@ -142,6 +151,7 @@
                 final long pid = mPids.get(i).intValue();
                 if (mData.get(pid) == null) {
                     mPids.remove(i);
+                    updatePidsArrayL();
                 }
             }
         }
@@ -155,7 +165,9 @@
         List<ActivityManager.RunningServiceInfo> svcs = mAm.getRunningServices(256);
         for (ActivityManager.RunningServiceInfo svc : svcs) {
             if (svc.service.getPackageName().equals(getPackageName())) {
-                startTrackingProcess(svc.pid, svc.process, System.currentTimeMillis() - (SystemClock.elapsedRealtime() - svc.activeSince));
+                Log.v(TAG, "discovered running service: " + svc.process + " (" + svc.pid + ")");
+                startTrackingProcess(svc.pid, svc.process,
+                        System.currentTimeMillis() - (SystemClock.elapsedRealtime() - svc.activeSince));
             }
         }
 
@@ -163,6 +175,7 @@
         for (ActivityManager.RunningAppProcessInfo proc : procs) {
             final String pname = proc.processName;
             if (pname.startsWith(getPackageName())) {
+                Log.v(TAG, "discovered other running process: " + pname + " (" + proc.pid + ")");
                 startTrackingProcess(proc.pid, pname, System.currentTimeMillis());
             }
         }
@@ -175,7 +188,7 @@
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
-        Log.i(TAG, "Received start id " + startId + ": " + intent);
+        Log.v(TAG, "Received start id " + startId + ": " + intent);
 
         if (intent != null) {
             if (ACTION_START_TRACKING.equals(intent.getAction())) {