OSDN Git Service

Fix issue #10795385: System process crash reinstalling GEL -
authorDianne Hackborn <hackbod@google.com>
Tue, 17 Sep 2013 17:56:49 +0000 (10:56 -0700)
committerDianne Hackborn <hackbod@google.com>
Tue, 17 Sep 2013 18:03:10 +0000 (11:03 -0700)
NPE at com.android.server.am.ProcessRecord.resetPackageList(ProcessRecord.java:596)

Take care of some more cases now that baseProcessTracker can be null.

Change-Id: I394c0b7802788118c3ad6bcac5dfdd23eeda8d58

services/java/com/android/server/am/ActivityManagerService.java
services/java/com/android/server/am/ProcessRecord.java

index 2bac96e..80f4b00 100644 (file)
@@ -14749,7 +14749,7 @@ public final class ActivityManagerService extends ActivityManagerNative
     }
 
     private final void setProcessTrackerState(ProcessRecord proc, int memFactor, long now) {
-        if (proc.thread != null) {
+        if (proc.thread != null && proc.baseProcessTracker != null) {
             proc.baseProcessTracker.setState(proc.repProcState, memFactor, now, proc.pkgList);
         }
     }
index 4fdacb3..d230779 100644 (file)
@@ -567,7 +567,8 @@ final class ProcessRecord {
      */
     public boolean addPackage(String pkg, ProcessStatsService tracker) {
         if (!pkgList.containsKey(pkg)) {
-            pkgList.put(pkg, tracker.getProcessStateLocked(pkg, info.uid, processName));
+            pkgList.put(pkg, baseProcessTracker != null
+                    ? tracker.getProcessStateLocked(pkg, info.uid, processName) : null);
             return true;
         }
         return false;
@@ -592,25 +593,30 @@ final class ProcessRecord {
      *  Delete all packages from list except the package indicated in info
      */
     public void resetPackageList(ProcessStatsService tracker) {
-        long now = SystemClock.uptimeMillis();
-        baseProcessTracker.setState(ProcessStats.STATE_NOTHING,
-                tracker.getMemFactorLocked(), now, pkgList);
         final int N = pkgList.size();
-        if (N != 1) {
-            for (int i=0; i<N; i++) {
-                ProcessStats.ProcessState ps = pkgList.valueAt(i);
-                if (ps != null && ps != baseProcessTracker) {
-                    ps.makeInactive();
-                }
+        if (baseProcessTracker != null) {
+            long now = SystemClock.uptimeMillis();
+            baseProcessTracker.setState(ProcessStats.STATE_NOTHING,
+                    tracker.getMemFactorLocked(), now, pkgList);
+            if (N != 1) {
+                for (int i=0; i<N; i++) {
+                    ProcessStats.ProcessState ps = pkgList.valueAt(i);
+                    if (ps != null && ps != baseProcessTracker) {
+                        ps.makeInactive();
+                    }
 
+                }
+                pkgList.clear();
+                ProcessStats.ProcessState ps = tracker.getProcessStateLocked(
+                        info.packageName, info.uid, processName);
+                pkgList.put(info.packageName, ps);
+                if (thread != null && ps != baseProcessTracker) {
+                    ps.makeActive();
+                }
             }
+        } else if (N != 1) {
             pkgList.clear();
-            ProcessStats.ProcessState ps = tracker.getProcessStateLocked(
-                    info.packageName, info.uid, processName);
-            pkgList.put(info.packageName, ps);
-            if (thread != null && ps != baseProcessTracker) {
-                ps.makeActive();
-            }
+            pkgList.put(info.packageName, null);
         }
     }