Loading services/core/java/com/android/server/am/ActivityManagerService.java +17 −4 Original line number Diff line number Diff line Loading @@ -3375,6 +3375,15 @@ public final class ActivityManagerService extends ActivityManagerNative app.killedByAm = false; checkTime(startTime, "startProcess: starting to update pids map"); synchronized (mPidsSelfLocked) { ProcessRecord oldApp; // If there is already an app occupying that pid that hasn't been cleaned up if ((oldApp = mPidsSelfLocked.get(startResult.pid)) != null && !app.isolated) { // Clean up anything relating to this pid first Slog.w(TAG, "Reusing pid " + startResult.pid + " while app is still mapped to it"); cleanUpApplicationRecordLocked(oldApp, false, false, -1, true /*replacingPid*/); } this.mPidsSelfLocked.put(startResult.pid, app); if (isActivityProcess) { Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); Loading Loading @@ -4515,7 +4524,8 @@ public final class ActivityManagerService extends ActivityManagerNative private final void handleAppDiedLocked(ProcessRecord app, boolean restarting, boolean allowRestart) { int pid = app.pid; boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1); boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1, false /*replacingPid*/); if (!kept && !restarting) { removeLruProcessLocked(app); if (pid > 0) { Loading Loading @@ -15441,7 +15451,8 @@ public final class ActivityManagerService extends ActivityManagerNative * app that was passed in must remain on the process lists. */ private final boolean cleanUpApplicationRecordLocked(ProcessRecord app, boolean restarting, boolean allowRestart, int index) { boolean restarting, boolean allowRestart, int index, boolean replacingPid) { Slog.d(TAG, "cleanUpApplicationRecord -- " + app.pid); if (index >= 0) { removeLruProcessLocked(app); ProcessList.remove(app.pid); Loading Loading @@ -15571,7 +15582,9 @@ public final class ActivityManagerService extends ActivityManagerNative if (!app.persistent || app.isolated) { if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_CLEANUP, "Removing non-persistent process during cleanup: " + app); if (!replacingPid) { removeProcessNameLocked(app.processName, app.uid); } if (mHeavyWeightProcess == app) { mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG, mHeavyWeightProcess.userId, 0)); Loading Loading @@ -19402,7 +19415,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Ignore exceptions. } } cleanUpApplicationRecordLocked(app, false, true, -1); cleanUpApplicationRecordLocked(app, false, true, -1, false /*replacingPid*/); mRemovedProcesses.remove(i); if (app.persistent) { services/core/java/com/android/server/am/BroadcastQueue.java +5 −0 Original line number Diff line number Diff line Loading @@ -291,6 +291,11 @@ public final class BroadcastQueue { boolean didSomething = false; final BroadcastRecord br = mPendingBroadcast; if (br != null && br.curApp.pid == app.pid) { if (br.curApp != app) { Slog.e(TAG, "App mismatch when sending pending broadcast to " + app.processName + ", intended target is " + br.curApp.processName); return false; } try { mPendingBroadcast = null; processCurBroadcastLocked(br, app); Loading Loading
services/core/java/com/android/server/am/ActivityManagerService.java +17 −4 Original line number Diff line number Diff line Loading @@ -3375,6 +3375,15 @@ public final class ActivityManagerService extends ActivityManagerNative app.killedByAm = false; checkTime(startTime, "startProcess: starting to update pids map"); synchronized (mPidsSelfLocked) { ProcessRecord oldApp; // If there is already an app occupying that pid that hasn't been cleaned up if ((oldApp = mPidsSelfLocked.get(startResult.pid)) != null && !app.isolated) { // Clean up anything relating to this pid first Slog.w(TAG, "Reusing pid " + startResult.pid + " while app is still mapped to it"); cleanUpApplicationRecordLocked(oldApp, false, false, -1, true /*replacingPid*/); } this.mPidsSelfLocked.put(startResult.pid, app); if (isActivityProcess) { Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); Loading Loading @@ -4515,7 +4524,8 @@ public final class ActivityManagerService extends ActivityManagerNative private final void handleAppDiedLocked(ProcessRecord app, boolean restarting, boolean allowRestart) { int pid = app.pid; boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1); boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1, false /*replacingPid*/); if (!kept && !restarting) { removeLruProcessLocked(app); if (pid > 0) { Loading Loading @@ -15441,7 +15451,8 @@ public final class ActivityManagerService extends ActivityManagerNative * app that was passed in must remain on the process lists. */ private final boolean cleanUpApplicationRecordLocked(ProcessRecord app, boolean restarting, boolean allowRestart, int index) { boolean restarting, boolean allowRestart, int index, boolean replacingPid) { Slog.d(TAG, "cleanUpApplicationRecord -- " + app.pid); if (index >= 0) { removeLruProcessLocked(app); ProcessList.remove(app.pid); Loading Loading @@ -15571,7 +15582,9 @@ public final class ActivityManagerService extends ActivityManagerNative if (!app.persistent || app.isolated) { if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_CLEANUP, "Removing non-persistent process during cleanup: " + app); if (!replacingPid) { removeProcessNameLocked(app.processName, app.uid); } if (mHeavyWeightProcess == app) { mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG, mHeavyWeightProcess.userId, 0)); Loading Loading @@ -19402,7 +19415,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Ignore exceptions. } } cleanUpApplicationRecordLocked(app, false, true, -1); cleanUpApplicationRecordLocked(app, false, true, -1, false /*replacingPid*/); mRemovedProcesses.remove(i); if (app.persistent) {
services/core/java/com/android/server/am/BroadcastQueue.java +5 −0 Original line number Diff line number Diff line Loading @@ -291,6 +291,11 @@ public final class BroadcastQueue { boolean didSomething = false; final BroadcastRecord br = mPendingBroadcast; if (br != null && br.curApp.pid == app.pid) { if (br.curApp != app) { Slog.e(TAG, "App mismatch when sending pending broadcast to " + app.processName + ", intended target is " + br.curApp.processName); return false; } try { mPendingBroadcast = null; processCurBroadcastLocked(br, app); Loading